Comparaison

Bonsoir
Je fait mes premiers pas dans la programmation en vba. j'ai écrit un algorithme qui compare deux colones et ressort les similitudes. il fonctionne très bien mais le souci c'est qu'il est très lent. il prend 5 minutes pour exécuter un code sur 7900 lignes. s'il vous plait aidez mois à l'optimiser afin qu'il prenne moin de temps. voici le code en question:

Sub compare()
'
Dim CompareRange As Variant
Dim x As Variant
Dim y As Variant
Dim i As Integer
Dim date_debut As Date, date_fin As Date

Set CompareRange = Range("A:A")
date_debut = Now
For Each x In ActiveSheet.Range("C:C")
For Each y In CompareRange

If x = y Then
x.Offset(0, 1) = x
i = i + 1
End If
If y = "" Then

GoTo sortie1

End If
Next y
sortie1:   'etiquette de sortie
If x = "" Then
GoTo fin

End If
Next x
fin:     'etiquette de fin de l'opération
date_fin = Now

MsgBox "le nombre de tour est :" & i & "debut : " & date_debut & " fin:" & date_fin
End Sub


Merci pour votre aide attendu

EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.

3 réponses

  1. Modérateur
    Bonjour,

    Au lieu de faire des boucles dans des boucles .... regarde donc la méthode FIND... et même plus précisément la fonction findall
    https://forums.commentcamarche.net/forum/affich-37621992-methode-find-dans-vba-recherche-de-donnees-sous-excel#findall

    En gros .. tu boucles sur une seule colonne ....
    Pour chaque cellule de cette colonne tu recherche les cellules correspondantes avec un findall

    0
    1. Bonjour,
      merci jordan, mais je ne sait pas utiliser FIND et findall, peut-tu mettre cette methode et cette fonction dans le bout de code que j'ai envoyé???? s'il-te-plait !!!!!!!!

      Merci
      0
    2. Modérateur
      @ruthabellaAs tu regardé le lien que je t'ai donné ???
      Il y a des exemples dedans....
      0
    3. oui mais e ne me retrouve toujours pas
      0
  2. Modérateur
    Quelques pistes :
    Utilise
    Application.ScreenUpdating = False
    en début et
    Application.ScreenUpdating = True
    en fin de ta fonction.

    Actuellement tu compares toutes les cellules des 2 colonnes (donc les 65535 ou les 2 millions de lignes selon la version d'Excel) cela peut prendre beaucoup de temps

    A la place de faire un Range("A:A") essaye plutôt de faire une boucle Do/Loop et d'utiliset la méthode ActiveSheet.Cells avec comme condition de fin, plus de données sur les 2 colonnes.

    EVITES les GoTo, préfères "Exit For" à la place, c'est largement plus propre.
    0
    1. Merci NHenry,
      mais je ne sait pas utiliser Do/Loop et activesheet, peut-tu mettre cette boucle et cette methode là dans le bout de code que j'ai envoyé???? s'il-te-plait !!!!!!!!

      Merci
      0
  3. Contributeur
    Bonjour

    ci joint test de rapidité
    comparaison de plusieurs méthodes
    https://mon-partage.fr/f/QBlA2fwV/

    pour chercher une cellule dans une colonne, la méthode "Find", indiquée par Jordane, est la simple en égalité de temps une variable-tableau

    mais si le travail est plus compliqué, la variable tableau est + rapide
    j'ai fait un truc là-dessus mais je ne le retrouve pas dans mon B... :-/

    si je retrouve...

     Michel
    0
    1. Contributeur
      J'ai retrouvé :-)

      comparaison sur 20000 lignes: écran libre, figé, variable tableau

      nota: quand la macro rend la main au système, il n'est pas nécessaire de faire un screenupdating=true. Source: Laurent Longre

      https://mon-partage.fr/f/SO48HjNu/
      0