Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

VBA : Boucle lente avec beaucoup d'itérations

  • Initiateur de la discussion Initiateur de la discussion NewbieLuc
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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.
 
Re : VBA : Boucle lente avec beaucoup d'itérations

Bonjour,

Avant de te proposer quelque chose, j'aimerai bien voir un exemple de ton fichier avec explications.

A+
 
Re : VBA : Boucle lente avec beaucoup d'itérations

Bonjour NewbieLuc

Et bienvenue sur XLD

Le mieux est de poster un fichier exemple (quelques lignes suffisent)
Mais d'ore et deja : A quoi correspond 7389 ?

Edit : Salut Hasco
 
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
 
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

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

Dernière édition:
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 🙂
 
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.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
8
Affichages
487
  • Question Question
XL 2021 VBA excel
Réponses
4
Affichages
189
  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
544
  • Question Question
Microsoft 365 Export données
Réponses
4
Affichages
665
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…