Comparaison

Fermé
ruthabella Messages postés 5 Date d'inscription lundi 24 avril 2017 Statut Membre Dernière intervention 27 avril 2017 - Modifié le 24 avril 2017 à 18:38
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 - 25 avril 2017 à 12:03
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 38167 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 7 mai 2024 4 657
24 avril 2017 à 18:38
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 lundi 24 avril 2017 Statut Membre Dernière intervention 27 avril 2017
25 avril 2017 à 10:28
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 38167 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 7 mai 2024 4 657 > ruthabella Messages postés 5 Date d'inscription lundi 24 avril 2017 Statut Membre Dernière intervention 27 avril 2017
25 avril 2017 à 10:32
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 lundi 24 avril 2017 Statut Membre Dernière intervention 27 avril 2017
25 avril 2017 à 11:23
oui mais e ne me retrouve toujours pas
0
NHenry Messages postés 15114 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 4 mai 2024 331
24 avril 2017 à 18:42
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 lundi 24 avril 2017 Statut Membre Dernière intervention 27 avril 2017
25 avril 2017 à 09:57
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 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié le 25 avril 2017 à 11:37
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 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié le 25 avril 2017 à 12:06
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