Comparaison

ruthabella Messages postés 5 Date d'inscription   Statut Membre Dernière intervention   -  
michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   -
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.
A voir également:

3 réponses

jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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
ruthabella Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
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
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752 > ruthabella Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
As tu regardé le lien que je t'ai donné ???
Il y a des exemples dedans....
0
ruthabella Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
oui mais e ne me retrouve toujours pas
0
NHenry Messages postés 15219 Date d'inscription   Statut Modérateur Dernière intervention   365
 
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
ruthabella Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
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
michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 314
 
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
michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 314
 
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