XL 2010 tableau pour comparer deux colonnes et écrire le résultat dans une troisième colonne

zephir94

XLDnaute Impliqué
Bonjour à tous,

Pour gagner en temps de traitement, je souhaiterais passer à un tableau pour gagner en temps de traitement
car ma base peut aller jusqu'à 27000 lignes.

J'ai deux colonnes avec des chiffres et je veux comparer la 3 -ème colonnes avec la première et écrire si trouvé
la valeur de la cellule dans la 4 -ème colonnes.

Pour faire cela j'avais écrit :
VB:
R3 = Sheets(6).Range("F65536").End(xlUp).Row
For Ri = 2 To R3 Step 1
a = Sheets(12).Range("E" & Ri).Value
Set d = Sheets(12).Range("A2" & ":A" & R1).Find(Val(a), , xlValues)
If Not d Is Nothing Then
trv = d.Row
Sheets(12).Range("H" & Ri).Value = Sheets(12).Range("B" & trv).Value
Else
Sheets(12).Range("H" & Ri).Value = "0"
End If
Next Ri
Je voudrais remplacer cela par un tableau, le problème est que je ne maitrise pas encore les tableaux !
Je sollicite votre aide pour essayer d'une part comprendre les tableaux, d'autre part réussir à passer ma
boucle vers un tableau.
J'ai commencé mais je reste un peu perdu !

VB:
R3 = Sheets(1).Range("A65536").End(xlUp).Row
R8 = Sheets(1).Range("C65536").End(xlUp).Row
Dim tableau()
ReDim tableau(R3, R8)
MsgBox UBound(tableau, 1)
    MsgBox UBound(tableau, 2)

J'ai constitué un fichier test, il faudrait comparer colonne A avec Colonne C, si on trouve la valeur de la colonne C en A, on récupère la valeur
de la Cellule correspondante en B et on vient la copier en D sur la Cellule correspondante.

Je vous remercie par avance pour toute l'aide que vous pourrez m'apporter.

Bien à vous
 

Pièces jointes

  • Classeur1.xlsm
    264.8 KB · Affichages: 31

cp4

XLDnaute Barbatruc
Bonjour,

En colonne A, tu as 1511 valeurs en double (voir image)
1684131402540.png

Si tu compares chaque valeur de la colonne A avec les valeurs de la colonne B, c'est normal que ça prenne du temps vu le nombre de lignes. Et ce, même avec un Array.
Aujourd'hui, je n'ai pas beaucoup de temps. J'espère qu'un autre membre puisse t'aider.
Bonne journée.
 

zephir94

XLDnaute Impliqué
Bonjour,

En colonne A, tu as 1511 valeurs en double (voir image)
Regarde la pièce jointe 1170229
Si tu compares chaque valeur de la colonne A avec les valeurs de la colonne B, c'est normal que ça prenne du temps vu le nombre de lignes. Et ce, même avec un Array.
Aujourd'hui, je n'ai pas beaucoup de temps. J'espère qu'un autre membre puisse t'aider.
Bonne journée.
Bonjour, il est vrai et tu as raison, je devrais déjà traiter les colonnes pour supprimer les doublons !
VB:
Sheets(1).Range("A2" & ":C" & derl).RemoveDuplicates Columns:=Array(1, 2, 3), _
    Header:=xlYes
en utilisant ceci
 

cp4

XLDnaute Barbatruc
Bonjour, il est vrai et tu as raison, je devrais déjà traiter les colonnes pour supprimer les doublons !
On peut utiliser un dictionnaire pour récupérer les valeurs sans doublons (c-à-d sans toucher à la bd).
Je voudrais savoir si les solutions de @JHA (que je salue;)) donne le résultat escompté?
Vu le grand nombre de données a traité, tu n'as pas donné de retour aux solutions proposées par @JHA.
Dans la langue de William Shakespeare, un site pour ton apprentissage http://www.snb-vba.eu/VBA_Arrays_en.html#L_6.4

Bonne soirée.
 

cp4

XLDnaute Barbatruc
Bonjour à tous,
Bonjour @cp4 :)

Pour éviter les problèmes de tri de chaque colonne, j'ai crée un tableau pour chaque colonne.

JHA
@JHA : Merci pour ta précision. Je voulais que @zephir94 nous dise si tes solutions donnent bien le résultat escompté. Car mon côté en utilisant des arrays et dictionnaires je trouve beaucoup plus de lignes. Étant donné le grand nombre de lignes, je ne vais pas m'amuser à vérifier que mon code donne un bon résultat. C'est pour me faciliter la tâche à corriger mon code (à peaufiner).
bonne soirée.
 

Cousinhub

XLDnaute Barbatruc
Inactif
Bonsoir,
D'où l'intérêt de, "peut-être", mixer les solutions...
Vouloir "Apprendre", et avoir du "Résultat", sans être obligé de "s'amuser à vérifier"....
Power Query donne la solution, sans contrôle...
Mébon, c'est ton choix....
Edit, je m'excuse, j'ai oublié de donner mon résultat
234 lignes sans doublons
 
Dernière édition:

zephir94

XLDnaute Impliqué
@JHA : Merci pour ta précision. Je voulais que @zephir94 nous dise si tes solutions donnent bien le résultat escompté. Car mon côté en utilisant des arrays et dictionnaires je trouve beaucoup plus de lignes. Étant donné le grand nombre de lignes, je ne vais pas m'amuser à vérifier que mon code donne un bon résultat. C'est pour me faciliter la tâche à corriger mon code (à peaufiner).
bonne soirée.
Bonsoir à tous

En utilisant mon code avec les deux boucles, je trouve 307 récurrences
 

cp4

XLDnaute Barbatruc
Bonjour,

Si j'ai bien compris ton problème. Code agit sur la feuille.
VB:
Option Explicit

Sub Trouver_Prix()
   Dim d1 As Object, plage1 As Range, plage2 As Range, t As Double, c As Range
   t = Timer
   Set d1 = CreateObject("Scripting.Dictionary")
   Set plage1 = Range("A2", [a65000].End(xlUp))
   Set plage2 = Range("c2", [c65000].End(xlUp))

   [A:C].Interior.ColorIndex = xlNone: [D:D].ClearContents

   For Each c In plage1
      d1(CDbl(c.Value)) = c.Offset(, 1).Value
   Next c

   For Each c In plage2
      If d1.exists(c.Value) Then c.Interior.ColorIndex = 3
      If d1.exists(c.Value) Then c.Offset(, 1) = d1.Item(CDbl(c))
   Next c
   MsgBox "Terminé en " & Round(Timer - t, 2) & " sec."

End Sub
 

cp4

XLDnaute Barbatruc
Bonjour,
cp4, avec ton code, et en enlevant les doublons, on obtient bien 234 données (307 sans les enlever)
Il y a également des doublons dans la colonne C
Bonne journée
Bonjour,
@Cousinhub, entre les 2 mon cœur balance:) (234 ou 307).
J'ai répondu à la demande, soit afficher en colonne D le montant correspondant.
Il y a des doublons en colonnes A et C. Je laisse le soin au demandeur de supprimer les doublons.
Excellente journée.
 

Discussions similaires

Statistiques des forums

Discussions
314 705
Messages
2 112 067
Membres
111 410
dernier inscrit
yomeiome