Méthode de comparaison rapide de 2 colonnes
EDIT: au Lieu de ma solution, utiliser quelque chose comme
For i = 1 To tmpRngSrcMax
If rngSrc(i) <> rngDes(i) Then ...
Next i
C'est environ 100 fois plus rapide.
Je dois comparer deux colonnes contenant des données de chaîne à l'aide de VBA. C'est mon approche:
Set rngDes = wsDes.Range("A2:A" & wsDes.Cells(Rows.Count, 1).End(xlUp).Row)
Set rngSrc = wsSrc.Range("I3:I" & wsSrc.Cells(Rows.Count, 1).End(xlUp).Row)
tmpRngSrcMax = wsSrc.Cells(Rows.Count, 1).End(xlUp).Row
cntNewItems = 0
For Each x In rngSrc
tmpFound = Application.WorksheetFunction.CountIf(rngDes, x.Row)
Application.StatusBar = "Processed: " & x.Row & " of " & tmpRngSrcMax & " /" & Format(x.Row / tmpRngSrcMax, "Percent")
DoEvents ' keeps Excel away from the "Not responding" state
If tmpFound = 0 Then ' new item
cntNewItems = cntNewItems + 1
tmpLastRow = wsDes.Cells(Rows.Count, 1).End(xlUp).Row + 1 ' first empty row on target sheet
wsDes.Cells(tmpLastRow, 1) = wsSrc.Cells(x.Row, 9)
End If
Next x
Donc, je suis en utilisant une boucle For each pour itérer à travers le 1er (src) de la colonne, et la Nb.si méthode pour vérifier si l'élément est déjà présent dans le 2ème (des) colonne. Si non, la copie à la fin de la 1ère (src) de la colonne.
Le code fonctionne, mais sur ma machine il faut ~200s donné colonnes, avec près de 7 000 lignes. J'ai remarqué que Nb.si fonctionne de manière plus rapide lorsqu'elle est utilisée directement comme une formule.
Quelqu'un a des idées pour l'optimisation du code?
source d'informationauteur Clemens
Vous devez vous connecter pour publier un commentaire.
Ici, c'est non-bouclage le code qui s'exécute presque instantanément pour l'exemple donné ci-dessus à partir de mehow.
Vous pouvez utiliser ce que la colonne que vous aimez comme le mannequin de la colonne.
Info:
Fait de se prendre dans la boucle
Quelques notes sur la vitesse d'essai:
La compilation du projet vba avant d'exécuter le test.
Pour Chaque Boucle de l'exécution est plus rapide que Pour i = 1 À 10 boucles.
Si possible, sortir de la boucle si la réponse est trouvée pour empêcher inutile de boucles avec Sortie Pour.
Long exécute plus rapidement que entier.
Enfin plus rapide méthode de boucle (si vous devez en boucle mais sa reste pas aussi vite que les au-dessus de non-bouclage de la méthode):
Comme par @brettdj commentaires Pour l'alternative Suivante:
si vous utilisez .Valeur2 au lieu de .Valeur, il sera un peu plus rapide encore.
Juste écrit ce rapidement... Pouvez-vous tester cela pour moi?
J'ai juste modifié Mehow pour obtenir des éléments manquants dans les deux listes.
Juste au cas où quelqu'un a besoin d'elle. Merci pour le partage de code