Dans un cas "For i = 1 To" ça marche ... Mais pas avec For Each

Résolu
Iama Messages postés 324 Statut Membre -  
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour à tous

Pouvez-vous m'expliquer pourquoi le code suivant fonctionne bien.
'Suppression des vides
For i = 1 To UBound(ITems, 2)
ITems(1, i) = SansVide(ITems(1, i))
Next i

La valeur de ma fonction « SansVide » est bien intégrée dans « Items ».

Alors que dans le code suivant la valeur de ma fonction est bien rapatriée, mais n'est pas intégrée dans ce tableau « Items ».

For Each tE In ITems
tE = SansVide(tE)
Next


Cordialement

2 réponses

  1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,

    Manque des bouts...
    Comment sont déclarées toutes tes variables?
    Comment sont-elles "remplies"?
    0
    1. Iama Messages postés 324 Statut Membre 14
       
      Bonjour pijaku

      Les variables sont remplies, j'ai commencé par coder en "for each", comme cela ne fonctionnait pas je l'ai remplacé par "for to".

      IT , Items et tE sont en variant, i en single.

      ITems est issu d'un set (Range)
      ITems = ITems.Value

      cordialement
      0
    2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Bon.
      De toutes façons, For Each est beaucoup plus lente que For To et à n'utiliser que sur des collections.
      Si ITems avait été déclarée comme Collection
      Dim ITems As New Collection
      , tu aurais pu utiliser une boucle For Each et modifier les valeurs comme ceci :
      ITems.Remove i 'ou i est la clé
      ITems.Add Item:=SansVide(tE), key:=i

      Mais bon, au vu de la complexité du bazar + la lenteur occasionnée par For Each + les valeurs que tu prends en compte dans ta boucle (String je suppose), le type de boucle à utiliser est For ... To... Next

      Par contre, pour le coup, il faudrait revoir si tes valeurs sont des string, les déclarations :

      Dim ITems() As String
      Dim i As Long
      For i = 1 To UBound(ITems, 2)
          ITems(1, i) = SansVide(ITems(1, i))
      Next i
      
      Function SansVide(Truc As String) As String
      0
  2. Iama Messages postés 324 Statut Membre 14
     
    pijaku
    Merci pour ces conseils

    Mon code d'origine est:

    Set ITems = Range(Cells(LigTi, 1), Cells(LigTi, 1).End(xlToRight))
    ITems = ITems.Value
    'Suppression des vides
    For i = 1 To UBound(ITems, 2)
    ITems(1, i) = SansVide(ITems(1, i))
    Next i
    
    Private Function SansVide(chaiNe) As String
    


    Je ne peux donc pas déclarer chaiNe en string

    Tu me conseil de déclarer Itemps en string. Il faut donc que j'ajoute une variable.
    Cela me parait plus clair dans le code dans avoir qu'une. (Un préjugé certainement)

    C'est un problème de rapidité? D'éthique? De fiabilité ?
    Est-il préférable de boucler sur les cellules au lieu de passer par objet range ?

    Cordialement
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Tu passes par une variable de type Range => très "lourde" et inutile.

      Tu peux extrêmement rapidement remplir une variable tableau avec le contenu d'une plage de cellules. La boucle, dans ce cas est très rapide.

      Essaye ceci :
      Dim Items() As String, i As Long, LigTi As Long, Col As Integer
      
      For Col = 1 To Cells(LigTi, 1).End(xlToRight).Column
          ReDim Preserve Items(Col)
          Items(Col) = Cells(LigTi, Col).Value
      Next Col
      'Suppression des vides
      For i = 1 To UBound(Items)
        Items(1) = SansVide(Items(1))
      Next i
      
      '------------------------------
      
      Private Function SansVide(chaiNe As String) As String
      0
    2. Iama Messages postés 324 Statut Membre 14
       
      pijaku

      Un grand merci pour tes conseils et tes explications

      Alain
      0
    3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      De rien.
      N'hésite pas.
      A+

      Franck
      0
    4. Iama Messages postés 324 Statut Membre 14
       
      Encore une dernière pijaku

      Serais-plus rapide de mettre,

      Items(Col) = SansVide((Cells(LigTi, Col).Value)

      Bien qu'un peu mois lisible?

      Cordialement
      0
    5. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Quel est le code de ta fonction SansVide?
      0