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 -
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.
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 ».
Cordialement
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
-
Bonjour,
Manque des bouts...
Comment sont déclarées toutes tes variables?
Comment sont-elles "remplies"?
-
-
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 CollectionDim 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
-
-
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-
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 -
-
-
-
-