Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Améliorer une boucle For Each ...

2 réponses
Avatar
RENAUD Eric
Bonjour,
Je dois à partir d'une plage Source (3 critères: Références (RefArt), Date
mini (DateMin) et NbItems (NbArt)) de 4000 lignes, vérifier
dans une plage Destination de 20000 lignes si je trouve pour un voire
plusieurs enrtegistrements les 2 premiers critères.
Si je trouve, je mets dans une colonne dédiée une info (1 puis 1.1 puis 1.2,
etc) correspondant à l'enregistrement trouvé.
Le critère NbItems correspond au nombre de fois ou j'ai la réf Source
présente dans la plage Destination et cela me
permet de quitter ma boucle For Each quand j'ai atteint la valeur de NbItems
afin d'améliorer le temps de traitement.
Ce temps de traitement est quand même de l'ordre d'une heure voire plus.
Le code que j'ai utilisé est fait à l'aide de For Each ...
Peut-être certains d'entre vous ont une méthode permettant un traitement
plus rapide.
Je pense notamment aux variables tableuax mais je ne sais pas trop.plus
Si vous avez une idée à me proser je suis preneur.
Voici le code utilisé

' Recherche des Références avec Date mini
Range([B2], [B65536].End(xlUp)).Select
Set PlgDest = Selection
Range([BI2], [BI65536].End(xlUp)).Select
NbRef = Selection.Rows.Count
Set PlgSource = Selection
I = 1: indice = 0
For Each Cell In PlgSource
Application.StatusBar = "Référence N° " & I & " / " & NbRef
RefArt = Cell.Value: DateMin = Cell.Offset(0, 1).Value: NbArt =
Cell.Offset(0, 2).Value
For Each CellD In PlgDest
If Nb = NbArt Then Exit For
If CellD.Value = RefArt And CellD.Offset(0, 27).Value = DateMin
Then
If indice = 0 Then
CellD.Offset(0, 56).Value = "1"
Nb = Nb + 1
Else
CellD.Offset(0, 56).Value = "1." & indice
Nb = Nb + 1
End If
indice = indice + 1
Else
End If
Next CellD
I = I + 1
indice = 0
Next Cell



D'avance merci

2 réponses

Avatar
DB
Bonjour,
si tu ne l'a pas déjà fait :
avant ce code
Application.ScreenUpdating = False
et après
Application.ScreenUpdating = True

Pour éviter à Excel de mettre à jour les données sur l'écran avant la fin du
traitement.
Tu peux aussi simplifier
If indice = 0 Then
CellD.Offset(0, 56).Value = "1"
Nb = Nb + 1
Else
CellD.Offset(0, 56).Value = "1." & indice
Nb = Nb + 1
End If
indice = indice + 1
par
CellD.Offset(0, 56).Value = "1." & indice
Nb = Nb + 1
indice = indice + 1
ce qui modifie un peu ton résultat
1.0 1.1 1.2
Tu pourrais aussi remplacer les for each par des boucles "normale" For i=1
To ...
Et faire référence aux cellules par cells(i,j) mais c'est plus long à
t'expliquer.
Avec mon premier commentaire, tu devrai savoir un résultat tangible.

DB


Bonjour,
Je dois à partir d'une plage Source (3 critères: Références (RefArt), Date
mini (DateMin) et NbItems (NbArt)) de 4000 lignes, vérifier
dans une plage Destination de 20000 lignes si je trouve pour un voire
plusieurs enrtegistrements les 2 premiers critères.
Si je trouve, je mets dans une colonne dédiée une info (1 puis 1.1 puis 1.2,
etc) correspondant à l'enregistrement trouvé.
Le critère NbItems correspond au nombre de fois ou j'ai la réf Source
présente dans la plage Destination et cela me
permet de quitter ma boucle For Each quand j'ai atteint la valeur de NbItems
afin d'améliorer le temps de traitement.
Ce temps de traitement est quand même de l'ordre d'une heure voire plus.
Le code que j'ai utilisé est fait à l'aide de For Each ...
Peut-être certains d'entre vous ont une méthode permettant un traitement
plus rapide.
Je pense notamment aux variables tableuax mais je ne sais pas trop.plus
Si vous avez une idée à me proser je suis preneur.
Voici le code utilisé

' Recherche des Références avec Date mini
Range([B2], [B65536].End(xlUp)).Select
Set PlgDest = Selection
Range([BI2], [BI65536].End(xlUp)).Select
NbRef = Selection.Rows.Count
Set PlgSource = Selection
I = 1: indice = 0
For Each Cell In PlgSource
Application.StatusBar = "Référence N° " & I & " / " & NbRef
RefArt = Cell.Value: DateMin = Cell.Offset(0, 1).Value: NbArt =
Cell.Offset(0, 2).Value
For Each CellD In PlgDest
If Nb = NbArt Then Exit For
If CellD.Value = RefArt And CellD.Offset(0, 27).Value = DateMin
Then
If indice = 0 Then
CellD.Offset(0, 56).Value = "1"
Nb = Nb + 1
Else
CellD.Offset(0, 56).Value = "1." & indice
Nb = Nb + 1
End If
indice = indice + 1
Else
End If
Next CellD
I = I + 1
indice = 0
Next Cell



D'avance merci





Avatar
JB
Bonjour,

Le référencement des éléments d'un tableau en mémoire est au moin s 10
fois + rapide que le référencement d'une cellule du tableur.

Sub TransfertChampTableau()
t = Timer
b = [A1:C20000].Value ' transfert dans un tableau b()
y = UBound(b, 1)
z = UBound(b, 2)
For i = 1 To UBound(b, 1)
For j = 1 To UBound(b, 2)
x = b(i, j)
Next j
Next i
MsgBox Timer - t
End Sub

Cordialement JB

On 15 fév, 12:09, DB wrote:
Bonjour,
si tu ne l'a pas déjà fait :
avant ce code
Application.ScreenUpdating = False
et après
Application.ScreenUpdating = True

Pour éviter à Excel de mettre à jour les données sur l'écran av ant la fin du
traitement.
Tu peux aussi simplifier
If indice = 0 Then
CellD.Offset(0, 56).Value = "1"
Nb = Nb + 1
Else
CellD.Offset(0, 56).Value = "1." & indice
Nb = Nb + 1
End If
indice = indice + 1
par
CellD.Offset(0, 56).Value = "1." & indice
Nb = Nb + 1
indice = indice + 1
ce qui modifie un peu ton résultat
1.0 1.1 1.2
Tu pourrais aussi remplacer les for each par des boucles "normale" For i =1
To ...
Et faire référence aux cellules par cells(i,j) mais c'est plus long à
t'expliquer.
Avec mon premier commentaire, tu devrai savoir un résultat tangible.

DB




Bonjour,
Je dois à partir d'une plage Source (3 critères: Références (Re fArt), Date
mini (DateMin) et NbItems (NbArt)) de 4000 lignes, vérifier
dans une plage Destination de 20000 lignes si je trouve pour un voire
plusieurs enrtegistrements les 2 premiers critères.
Si je trouve, je mets dans une colonne dédiée une info (1 puis 1.1 puis 1.2,
etc) correspondant à l'enregistrement trouvé.
Le critère NbItems correspond au nombre de fois ou j'ai la réf Sour ce
présente dans la plage Destination et cela me
permet de quitter ma boucle For Each quand j'ai atteint la valeur de Nb Items
afin d'améliorer le temps de traitement.
Ce temps de traitement est quand même de l'ordre d'une heure voire pl us.
Le code que j'ai utilisé est fait à l'aide de For Each ...
Peut-être certains d'entre vous ont une méthode permettant un trait ement
plus rapide.
Je pense notamment aux variables tableuax mais je ne sais pas trop.plus
Si vous avez une idée à me proser je suis preneur.
Voici le code utilisé

' Recherche des Références avec Date mini
Range([B2], [B65536].End(xlUp)).Select
Set PlgDest = Selection
Range([BI2], [BI65536].End(xlUp)).Select
NbRef = Selection.Rows.Count
Set PlgSource = Selection
I = 1: indice = 0
For Each Cell In PlgSource
Application.StatusBar = "Référence N° " & I & " / " & N bRef
RefArt = Cell.Value: DateMin = Cell.Offset(0, 1).Value: NbA rt =
Cell.Offset(0, 2).Value
For Each CellD In PlgDest
If Nb = NbArt Then Exit For
If CellD.Value = RefArt And CellD.Offset(0, 27).Value = DateMin
Then
If indice = 0 Then
CellD.Offset(0, 56).Value = "1"
Nb = Nb + 1
Else
CellD.Offset(0, 56).Value = "1." & indice
Nb = Nb + 1
End If
indice = indice + 1
Else
End If
Next CellD
I = I + 1
indice = 0
Next Cell

D'avance merci- Masquer le texte des messages précédents -


- Afficher le texte des messages précédents -