如何匹配2张数据并根据匹配复制数据?

这是我的困境:

我有2个Excel表。

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

我需要将源表格列C中使用的单元格与目标表格列A所使用的单元格相匹配,并将每行从源到目标(到相邻行)复制3个单元格。

所以,假设我在源表格列C中的一个单元格中具有“TESTUSERtesting”,并且在目标表格列A中的某个单元格中有相同的名称。从名称在源表格中的行,我需要复制将A,B,C列单元格(仅从该行)数据传输到名称在A列中的目标行的列到C,D,E列。 源表C列中的每个名称都需要完成相同的操作

我已经成功地从两张表中获取所需的值,但是我不知道如何匹配数据并根据这些数据进行复制。

“正确”的方式可能涉及到ADO / SQL,但是由于您已经在使用For Each循环,因此您可以使用字典将Src中的索引/行号存储在名称键下,并在您find该字典中的名称时更新Tgt 。 在代码中:

  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 

输出:

 ---- 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 

会使用Excel公式更容易? 假设您的源表名为“Sheet1”,请将此公式粘贴到目标工作表的列C:

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

这给你从Sheet1列A的值(请参阅公式中的“1”)。 然后将其复制到您的目标工作表的列D:

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

这列入E列:

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

公式中的唯一区别是对应于列A,B和C(在本例中为Sheet1)中的“1”,“2”和“3”。

(答案与这个问题的答案相似: Excel:检查列中是否存在单元格值,然后获取NEXT单元格的值 )