Comment faire correspondre datatables en 2 feuilles et copyr datatables en fonction de la correspondance?

Voici mon dilemme:

J'ai 2 feuilles excel.

- One is a target sheet with already existing information - One is a source sheet 

Je devrais faire correspondre les cellules utilisées dans la colonne de la feuille de données C aux cellules usées de la colonne de la colonne cible A et copyr 3 cellules par rangée de la source à la cible (aux lignes adjacentes).

Donc, disons que j'ai "TESTUSER test" dans l'une des cellules dans la colonne de la feuille de données C, et le même nom quelque part dans une cellule dans la colonne de la colonne cible A. Dans la ligne où le nom se trouve dans la feuille de documents, je devrais copyr datatables des cellules de colonne A, B, C (uniquement de cette ligne) à la ligne de la feuille de caisse où le nom se trouve dans la colonne A, aux colonnes C, D, E. Cette même opération devrait être effectuée pour chaque nom dans la colonne C.

J'ai réussi à get les valeurs requirejses des deux feuilles avec des methods «Pour chacune», mais je ne sais pas comment associer datatables et faire la copy en fonction de cela.

La manière «correcte» impliquerait probablement ADO / SQL, mais comme vous avez travaillé For Each boucle, vous pouvez utiliser un dictionary pour stocker les nombres d'index / ligne dans Src sous la key de nom et mettre à jour Tgt si vous trouvez le nom dans ce dictionary . Dans du code:

  Const cnSKI = 2 ' Src Key Index Const cnTKI = 0 ' Tgt Key Index Const cnTUO = 2 ' Tgt Update Offset Const cnFTC = 2 ' Fields To Copy Dim aoaSrc : aoaSrc = Array( _ Array("a", "b", "A1", "NotInTgt") _ , Array("c", "d", "a1", "UpdInTgt") _ ) Dim aoaTgt : aoaTgt = Array( _ Array("B1", "NotInSrc", "x", "x", "xx") _ , Array("a1", "UpdInTgt", "?", "?", "??") _ ) Dim dicSrc : Set dicSrc = CreateObject("Scripting.Dictionary") Dim i For i = 0 To UBound(aoaSrc) dicSrc(aoaSrc(i)(cnSKI)) = i Next dumpAOA "Src", aoaSrc dumpDic "Src dic", dicSrc dumpAOA "Tgt", aoaTgt For i = 0 To UBound(aoaTgt) If dicSrc.Exists(aoaTgt(i)(cnTKI)) Then Dim r : r = dicSrc(aoaTgt(i)(cnTKI)) Dim c For c = 0 To cnFTC aoaTgt(i)(c + cnTUO) = aoaSrc(r)(c) Next End If Next dumpAOA "Tgt (updated)", aoaTgt Sub dumpAOA(sTitle, aoaX) WScript.Echo "----", sTitle Dim a For Each a In aoaX WScript.Echo "", Join(a) Next End Sub Sub dumpDic(sTitle, dicX) WScript.Echo "----", sTitle Dim k For Each k In dicX.Keys WScript.Echo "", k, dicX(k) Next End Sub 

sortie:

 ---- Src ab A1 NotInTgt cd a1 UpdInTgt ---- Src dic A1 0 a1 1 ---- Tgt B1 NotInSrc xx xx a1 UpdInTgt ? ? ?? ---- Tgt (updated) B1 NotInSrc xx xx a1 UpdInTgt cd a1 

L'utilisation de la formule Excel serait-elle plus facile? En supposant que votre feuille source s'appelle "Sheet1", collez cette formule dans la colonne C de votre feuille cible:

 =IF(ISERROR(MATCH("TESTUSER test",Sheet1!C:C, 0)), "No Match", INDIRECT(ADDRESS(MATCH("TESTUSER test",Sheet1!C:C, 0), 1,,, "Sheet1"))) 

Cela vous donne la valeur de Sheet1 colonne A (voir le "1" quelque part dans la formule). Ensuite, copyz-le dans la colonne D de votre feuille cible:

 =IF(ISERROR(MATCH("TESTUSER test",Sheet1!C:C, 0)), "No Match", INDIRECT(ADDRESS(MATCH("TESTUSER test",Sheet1!C:C, 0), 2,,, "Sheet1"))) 

et ceci dans la colonne E:

 =IF(ISERROR(MATCH("TESTUSER test",Sheet1!C:C, 0)), "No Match", INDIRECT(ADDRESS(MATCH("TESTUSER test",Sheet1!C:C, 0), 3,,, "Sheet1"))) 

La seule différence dans les formules sont les "1", "2" et "3", correspondant aux colonnes A, B et C (dans Sheet1 dans ce cas).

(la réponse est étonnamment similaire à celle de cette question: Excel: vérifiez si la valeur de la cellule existe dans la colonne, puis obtenez la valeur de la cellule NEXT )