VBA : Boucle lente avec beaucoup d'itérations

NewbieLuc

XLDnaute Nouveau
Bonjour à tous,

Je suis un débutant en VBA et je lutte avec le problème suivant :

Je construit une base de données dans le temps sur une population d'entreprises à partir de 2 extractions. Je peux matcher les observations grâce à un numéro identifiant et à l'année.
J'ai besoin de copier une cellule dans une colonne pour une observation particulière quand 2 conditions sont remplies: l'identifiant est le même, et l'année est également la bonne. Si je ne trouve rien je veux mettre un point dans la cellule. J'ai écris le code suivant:

***
sub database()

Dim j As Integer
Dim i As Integer

Application.ScreenUpdating = False

For j = 0 To 43147
For i = 0 To 7389
If Cells(2 + j, 3) = Cells(2 + i, 18) And Cells(2 + j, 16) = Cells(2 + i, 19) Then
Cells(2 + j, 6) = Cells(2 + i, 21)
Exit For
Else
Cells(2 + j, 6) = "."
End If
Next i
Next j

Application.ScreenUpdating = True

end sub

***
Comme j'ai 43147 lignes à compléter et que la cellule que je cherche est potentiellement n'importe laquelle dans une plage de 7389 cellules ça prend beaucoup trop de temps (+ d'une heure) à exécuter.

Je serai tellement heureux si quelqu'un pouvait m'aider,

J'apprécie beaucoup votre temps et votre attention,

L.
 

ROGER2327

XLDnaute Barbatruc
Re : VBA : Boucle lente avec beaucoup d'itérations

Bonjour à tous
Peut-être ceci ?
Code:
[COLOR="DarkSlateGray"][B]Sub database2()
Dim i&, j&
Dim dCol3, dCol6, dCol16, dCol18, dCol19, dCol21
   dCol3 = Range("C2:C43149").Value
   dCol6 = Range("F2:F43149").Value
   dCol16 = Range("P2:P43149").Value
   dCol18 = Range("R2:R7391").Value
   dCol19 = Range("S2:S7391").Value
   dCol21 = Range("U2:U7391").Value
   For j = 1 To 43148
      For i = 1 To 7390
         If dCol3(j, 1) = dCol18(i, 1) And dCol16(j, 1) = dCol19(i, 1) Then dCol6(j, 1) = dCol21(i, 1): Exit For Else dCol6(j, 1) = "."
      Next
   Next
   Range("F2:F43149").Value = dCol6
End Sub[/B][/COLOR]
Évidemment pas testé faute de support...​
ROGER2327
#4008


Samedi 14 Phalle 137 (Bataille de Morsang, ST)
7 Fructidor An CCXVIII
2010-W34-2T16:25:34Z
 

NewbieLuc

XLDnaute Nouveau
Re : VBA : Boucle lente avec beaucoup d'itérations

Bonjour Hasco, PierreJean,

Merci pour vos réponses. J'ai fait tourner le code ci dessous, et fait face à "le programme ne répond pas"... Mais merci.

J'ai joint les 300 premières lignes de ma feuille excel.

La plage de droite correspond à l'origine des données, je souhaite copier les cellules de la colonne Goodwill (plage de droite, total 7390 lignes) dans les cellules de la colonne Goodwill (plage de gauche total 43148 lignes) correspond à la bonne date et la bonne entreprise (en matchant grâce aux colonnes ISIN).

Par exemple je devrais avoir pour Accord (ISIN: FR0000120404), 1997 le nombre 7795 (ligne 296 plage de droite).
Et quand je ne trouve rien dans la plage de droite mettre juste un point dans la colonne de gauche.

Merci beaucoup pour vos efforts!!
 

Pièces jointes

  • Exemple.xls
    46.9 KB · Affichages: 139
  • Exemple.xls
    46.9 KB · Affichages: 156
  • Exemple.xls
    46.9 KB · Affichages: 161

pierrejean

XLDnaute Barbatruc
Re : VBA : Boucle lente avec beaucoup d'itérations

Re

Salut ROGER

D'apres mon estimation la macro suivante devrait prendre 10 minutes environ

Code:
Sub cherche()
Application.ScreenUpdating = False
tablo1 = Range("P2:P" & Range("P65536").End(xlUp).Row)
tablo2 = Range("S2:S" & Range("S65536").End(xlUp).Row)
tablo4 = Range("C2:C" & Range("B65536").End(xlUp).Row)
tablo5 = Range("R2:R" & Range("R65536").End(xlUp).Row)
Dim tablo3()
ReDim tablo3(Range("A65536").End(xlUp).Row)
x = 0
For n = LBound(tablo1, 1) To UBound(tablo1, 1)
  For m = LBound(tablo2, 1) To UBound(tablo2, 1)
    If tablo2(m, 1) = tablo1(n, 1) And tablo4(n, 1) = tablo5(m, 1) Then
      tablo3(x) = Range("U" & m + 1)
      Exit For
    Else
      tablo3(x) = "."
    End If
  Next m
   x = x + 1
Next n
Range("F2").Resize(UBound(tablo3), 1).Value = Application.Transpose(tablo3)
Application.ScreenUpdating = True
End Sub

Edit : Hasco :) Il est diablement en avance (2207) , moi j'en suis a 2010
 

Pièces jointes

  • newbieluc_Exemple.zip
    53.7 KB · Affichages: 30
Dernière édition:

Paski

XLDnaute Nouveau
Re : VBA : Boucle lente avec beaucoup d'itérations

Bonjour,

Petite réponse et question à la fois !

Dim j as integer
For j = 1 to 43137

c'est pas plus que la limite du integer ? bon ça ne résous pas le soucis de lenteur, mais ça corrige quelque chose quand même :)
 

NewbieLuc

XLDnaute Nouveau
Re : VBA : Boucle lente avec beaucoup d'itérations

Bonjour PierreJean, Roger, Hasco

Merci beaucoup pour votre aide. Le code suggéré marche à la perfection, même l'estimation du temps que ça prend est correcte :)
Merci encore,

Très bonne après midi,

L.
 

Discussions similaires

Réponses
0
Affichages
173

Statistiques des forums

Discussions
312 393
Messages
2 088 006
Membres
103 698
dernier inscrit
Guillaume MPOYI