XL 2010 recherche valeur avec clé sur plusieurs colonnes

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Sheldor

XLDnaute Occasionnel
Supporter XLD
bonjour à tous,
désolé par avance si j'ai mal cherché et merci par avance pour votre aide...

j'ai un premier tableau (de grande taille) de valeurs TABLEAU_1
j'ai un deuxième tableau (environ 10% de la taille du premier) TABLEAU_2

Dans TABLEAU_2 j'ai 4 colonnes qui me forment une clé unique qui me permet d'aller chercher la valeur correspondante dans TABLEAU_1 (les colonnes ici sont non contiguës), une fois la correspondance trouvée je voudrais récupérer les valeurs de certaines colonnes plus à droite dans TABLEAU_1 pour les mettre dans TABLEAU_2

je cherche une solution array ou dictionnary car j'ai 100 000 lignes dans TABLEAU_1

je suis perdu, je ne sais pas si on peut partir sur un dictionnary avec une clé sur plusieurs colonnes, et en ARRAY je suis trop débutant je tourne en rond dans un tableau rectangle...

mille merci

nico
 

Pièces jointes

Bonjour,

Il faut bien sûr adapter le [A65000]

Code:
Sub essai()
  Set f = Sheets("Tableau_1")
  Tble = f.Range("A2:O" & f.[A65000].End(xlUp).Row).Value
  Set d = CreateObject("scripting.dictionary")
  For i = 1 To UBound(Tble)
    clé = Tble(i, 1) & "|" & Tble(i, 3) & "|" & Tble(i, 4) & "|" & Tble(i, 5)
    d(clé) = i     ' index
  Next i
  '--
  Set f2 = Sheets("Tableau_2")
  Tbls = f2.Range("A2:D" & f2.[A65000].End(xlUp).Row).Value
  Dim TblS2(): ReDim TblS2(1 To UBound(Tbls), 1 To 7)
  Ncol = UBound(Tbls, 2)
  For i = 1 To UBound(Tbls)
     clé = Tbls(i, 1) & "|" & Tbls(i, 2) & "|" & Tbls(i, 3) & "|" & Tbls(i, 4)
     ligne = d(clé)
     For k = 1 To 7
       TblS2(i, k) = Tble(ligne, k + 8)
     Next k
  Next i
  f2.[E2].Resize(UBound(Tbls), 7) = TblS2
End Sub

jb
 

Pièces jointes

Dernière édition:
bonjour JB,
un immense merci !
j'espère un jour parler VBA comme vous.

j'essaye de comprendre...

Dim TblS2(): ReDim TblS2(1 To UBound(Tbls), 1 To 7)
il créé tbls2 avec le nombre de ligne de tbls et sur 7 colonnes? ou ajoute 7 colonnes...

et j'ai du mal aussi à comprendre ce que fait
Resize(UBound(Tbls), 7) = TblS2

encore merci
nico
 
re-bonjour,
merci pour les explications

je réalise que j'ai oublié un détail, il se peut que dans TABLEAU_1 je n'ai pas la valeur que je cherche à partir de TABLEAU_2
du coup ça bug
je peux ajouter un "on error resume next" mais je ne suis pas sûr que ce soit une bonne solution..
 
Bonjour,

Code:
Sub copieLignes()
  Set f = Sheets("Tableau_1")
  TblE = f.Range("A2:O" & f.[A65000].End(xlUp).Row).Value
  Set d = CreateObject("scripting.dictionary")
  For i = 1 To UBound(TblE)
    clé = TblE(i, 1) & "|" & TblE(i, 3) & "|" & TblE(i, 4) & "|" & TblE(i, 5)
    d(clé) = i      ' index
  Next i
  Set f = Sheets("Tableau_2")
  TblS = f.Range("A2:D" & f.[A65000].End(xlUp).Row).Value
  Dim TblS2(): ReDim TblS2(1 To UBound(TblS), 1 To 7)
  Ncol = UBound(TblS, 2)
  For i = 1 To UBound(TblS)
     clé = TblS(i, 1) & "|" & TblS(i, 2) & "|" & TblS(i, 3) & "|" & TblS(i, 4)
     If d.exists(clé) Then
       n = n + 1
       ligne = d(clé)
       For k = 1 To 7: TblS2(i, k) = TblE(ligne, k + 8): Next k
     End If
  Next i
  If n > 0 Then f.[E2].Resize(UBound(TblS2), UBound(TblS2, 2)) = TblS2
End Sub

jb
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
6
Affichages
96
Retour