Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2010 recherche valeur avec clé sur plusieurs colonnes

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

  • tableau_1_2.xlsx
    13.8 KB · Affichages: 39

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
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

  • Copie de tableau_1_2.xls
    50.5 KB · Affichages: 24
Dernière édition:

Sheldor

XLDnaute Occasionnel
Supporter XLD
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
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
>il créé tbls2 avec le nombre de ligne de tbls et sur 7 colonnes? ou ajoute 7 colonnes...

oui

On ne peut pas dimensionner un Array() avec des variables directement. Il faut utiliser Redim()

>[E2].Resize(UBound(Tbls), 7) = TblS2

On agrandit le champ [E2] avec le nombre de lignes et de colonne.

ou [E2].Resize(UBound(Tbls2), Ubound(Tbls2)) = TblS2

jb

http://boisgontierjacques.free.fr
 

Sheldor

XLDnaute Occasionnel
Supporter XLD
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..
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
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

  • Copie de ExtractionTableau2.xls
    57 KB · Affichages: 20

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…