VBA Problème de boucle : For...each

vivi4561

XLDnaute Junior
Bonsoir,

Je suis actuellement en train de raccourcir le temps d'exécution de ma macro et j'ai découvert que la fonction For ..... each et plus rapide que la fonction For ..... Next

Cependant je n'arrive pas à la faire marcher dans la mesure où je souhaite récupérer la valeur de plusieurs autres cases. Voici le bout de code:
Code:
For Each i In Range("K3:K31239").Cells
    'i.Value = Range("C" & i).Value & "-" & Range("E" & i).Value & "-" & Range("G" & i).Value
Next


Seriez vous comment faire pour lire une case qui dépend de i ?


En vous remerciant,



Vincent
 

ROGER2327

XLDnaute Barbatruc
Re : VBA Problème de boucle : For...each

Bonsoir vivi4561
Toujours difficile de se prononcer sur trois lignes de code isolées de leur contexte, mais peut-être que ceci :
Code:
For Each i In Range("K3:K31239").Cells
    i.Value = Range("C" & i.Row).Value - Range("E" & i.Row).Value - Range("G" & i.Row).Value
Next
peut faire l'affaire ?​
ROGER2327
#5094


Samedi 21 Pédale 138 (Saint Inscrit, Converti, SQ)
25 Ventôse An CCXIX
2011-W11-2T17:53:25Z
 
Dernière édition:

Efgé

XLDnaute Barbatruc
Re : VBA Problème de boucle : For...each

Bonjour vivi4561 n Bonjour Roger:
Une autre vision (mais dans le noir, ce n'est pas évident)
Code:
Sub test()
Dim i As Range
For Each i In Range("K3:K31239")
    i.Value = Range("C" & i.Row).Value & "-" & Range("E" & i.Row).Value & "-" & Range("G" & i.Row).Value
Next i
End Sub
Cordialement
 

Arpette

XLDnaute Impliqué
Re : VBA Problème de boucle : For...each

Bonsoir Vivia, Bonsoir Efge, Roger comme ceci ce sera encore plus rapide.

Code:
Sub Test()
Set Zone = Range("K3:K" & Range("K65536").End(xlUp).Row)
        Zone.Offset(0, 1).FormulaR1C1 = "=RC3&""-""& RC5&""-""& RC7" 'Formule en colonne L
        Zone.Offset(0, 1) = Zone.Offset(0, 1).Value 'On n'en garde que les valeurs

End Sub
 

Jam

XLDnaute Accro
Re : VBA Problème de boucle : For...each

Salut à tous,

Bon je fais mon malin, j'chui d'humeur :eek: j'ai passé une mauvaise journée :(. Donc, comme tous le monde le sait ce qui est long c'est de parcourir les cellules.
Donc pour ma part j'insère quasi systématiquement et dès lors que mon "curseur" se ballade dans la feuille les fameux:

Code:
With Application
     .Screenupdating=False
     .Calculation=xlCalculationManual
End With

(....traitement...)

With Application
     .Calculation=xlCalculationAutomatic
     .Screenupdating=True
End With

Et si j'étais un peu plus fou, je mettrai les plages dans deux tableaux en mémoire, ferai le traitement en mémoire et collerai en retour le tableau modifié. Vitesse garantie, mais code un chtouille plus complexe.

Sur ces considérations Excelliennes, je vous souhaites une bonne soirée à tous :cool:
 

Efgé

XLDnaute Barbatruc
Re : VBA Problème de boucle : For...each

Re
Et si j'étais un peu plus fou, je mettrai les plages dans deux tableaux en mémoire, ferai le traitement en mémoire et collerai en retour le tableau modifié. Vitesse garantie, mais code un chtouille plus complexe.
Je me doutais que le problème de rapidité allait lancer la discution...
Même si il est sympa de jouer "entre nous", il faudra quand même voir quelle est la demande réelle de vivi4561.
VB:
Sub test2()
Dim Plg(), TabRepot(), i&
With Sheets("Feuil1")
    Plg = .Range(.Cells(3, 3), .Cells(Rows.Count, 7).End(xlUp)).Value
    ReDim TabReport(1 To UBound(Plg, 1))
    For i = 1 To UBound(Plg, 1)
        TabReport(i) = Plg(i, 1) & "-" & Plg(i, 3) & "-" & Plg(i, 5)
    Next i
    .Cells(3, 11).Resize(UBound(TabReport, 1)) = Application.Transpose(TabReport)
End With
End Sub

Cordialement
 

JNP

XLDnaute Barbatruc
Re : VBA Problème de boucle : For...each

Bonjour le fil :),
Je suis actuellement en train de raccourcir le temps d'exécution de ma macro et j'ai découvert que la fonction For ..... each et plus rapide que la fonction For ..... Next
Personnellement, je suis un peu surpris par ce raisonnement :confused:... Sur le principe, l'utilisation d'un Range devrait être un peu plus lourd qu'un Integer ou un Long, non :rolleyes: ?
Si quelqu'un peut éclairer ma lanterne ;)...
Bonne journée :cool:
 

Jam

XLDnaute Accro
Re : VBA Problème de boucle : For...each

Salut Efgé, JNP,

Effectivement la réponse à la demande de vivi est le plus important, d'où ma simple suggestion sans proposition de code (le tien me parait d'ailleurs pas mal ;) ).

A ta question JNP je dirai en effet qu'il n'y a fondamentalement pas de différence de vitesse, tout dépend du traitement qu'on effectue à l'intérieur de la boucle. Dans un cas on balaie une collection (pas besoin de test particulier sur l'élément de la collection) dans l'autre il faut nécessairement "tester" l'objet de la collection pour pouvoir lui appliquer un traitement. Cette perte de temps peut donc être préjudiciable. Mais bon, encore une fois cela dépend principalement de ce qu'on cherche à faire dans la boucle.
J'ajouterai un dernier détails qui peut avoir son importance: dans le cas du For...Each, on peut utiliser un index (propriété de l'objet), ce qui peut considérablement augmenter l'efficacité du traitement dans certains cas

Bonne journée
 
Dernière édition:

vivi4561

XLDnaute Junior
Re : VBA Problème de boucle : For...each

Bonjour,

Merci pour toutes vos réponses.

En effet, mon but est d'accélérer la vitesse d'exécution de ma macro. (elle utilise actuellement de nombreuses boucles For....Next, que je vais remplacer par For each....Next).

J'utilise aussi ta méthode Jam ;).

Si vous avez d'autres infos pour accélérer la vitesse de la macro, je suis preneur (je bloque déjà le rafraichissement de l'écran ainsi que la méthode qui empêche Excel de recalculer automatiquement les formules).


Bonne journée,


Vince
 
Dernière édition:

Pierrot93

XLDnaute Barbatruc
Re : VBA Problème de boucle : For...each

Bonjour à tous,

A noter également, si tu as des procédures événementielles dans ton classeur, il y a peut être lieu de les bloquer également....
Code:
Application.EnableEvents = False
'ton code
Application.EnableEvents = True

bonne journée
@+
 

Discussions similaires

Réponses
29
Affichages
1 K

Statistiques des forums

Discussions
312 488
Messages
2 088 862
Membres
103 979
dernier inscrit
imed