Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 在工作表之间比较和复制数据_Vba_Excel - Fatal编程技术网

Vba 在工作表之间比较和复制数据

Vba 在工作表之间比较和复制数据,vba,excel,Vba,Excel,以下是我想做的: 如果 工作表A的H单元格=工作表B的E单元格(包含单词)和 工作表A的J单元格=工作表B的H单元格(包含数字)和 工作表A的K单元格=工作表B的I单元格(包含数字) 然后 将工作表A的O单元格复制到工作表B的L单元格(包含数字) 换言之: 如果工作表A的H2、J2、K2=工作表B的E1、H1、I1,则将工作表A的O2复制到工作表B的L1 如果工作表A的H3、J3、K3=工作表B的E5、H5、I5,则将工作表A的O3复制到工作表B的L5 我想要的宏应该匹配并复制整

以下是我想做的:

  • 如果
    • 工作表A的H单元格=工作表B的E单元格(包含单词)
    • 工作表A的J单元格=工作表B的H单元格(包含数字)
    • 工作表A的K单元格=工作表B的I单元格(包含数字)
  • 然后
    • 将工作表A的O单元格复制到工作表B的L单元格(包含数字)
换言之:

  • 如果工作表A的H2、J2、K2=工作表B的E1、H1、I1,则将工作表A的O2复制到工作表B的L1
  • 如果工作表A的H3、J3、K3=工作表B的E5、H5、I5,则将工作表A的O3复制到工作表B的L5
我想要的宏应该匹配并复制整个工作表A和B。工作表A中的数据只能使用一次


这是我到目前为止所做的,但它似乎不起作用

Dim sh1 As Worksheet, sh2 As Worksheet
Dim j As Long, i As Long, lastrow As Long
Set sh1 = Worksheets("Worksheet A")
Set sh2 = Worksheets("Worksheet B")

lastrow = sh1.Cells(Rows.Count, "A").End(xlUp).Row

For i = 2 To lastrow
   j = (i - 2) * 4 + 1
   If sh1.Cells(i, "H").Value = sh2.Cells(j, "E").Value And _
      sh1.Cells(i, "J").Value = sh2.Cells(j, "H").Value And _
      sh1.Cells(i, "K").Value = sh2.Cells(j, "I").Value Then
      sh1.Cells(i, "O").Copy sh2.Cells(j, "L")
   End If
   j = j + 4
Next

更新你需要两个循环来完成你想做的事情。这个新的子例程适用于任何行。只需注意多个匹配,因为它只需要最后一个匹配:

Sub CopyCells()
    Dim sh1 As Worksheet, sh2 As Worksheet
    Dim j As Long, i As Long, lastrow1 As Long, lastrow2 As Long
    Set sh1 = Worksheets("Worksheet A")
    Set sh2 = Worksheets("Worksheet B")

    lastrow1 = sh1.Cells(Rows.Count, "A").End(xlUp).Row
    lastrow2 = sh2.Cells(Rows.Count, "A").End(xlUp).Row

    For i = 2 To lastrow1
        For j = 1 To lastrow2
            If sh1.Cells(i, "H").Value = sh2.Cells(j, "E").Value And _
                sh1.Cells(i, "J").Value = sh2.Cells(j, "H").Value And _
                sh1.Cells(i, "K").Value = sh2.Cells(j, "I").Value Then
                sh1.Cells(i, "L").Value = sh2.Cells(j, "O").Value
            End If
        Next j
    Next i
End Sub

试试这个完整的子程序。已测试并适用于您给定的问题描述。该文件只是该子例程和两个工作表,其值位于适当的单元格中,因此它应该适用于您。也许你的数据逻辑或假设有缺陷?工作表B中的对应行是否真的在第1、5、9、13、17行上?这就是问题所在。。工作表B中没有对应的行(sry我对此是新的…)我如何更改它,使工作表a的每一行与工作表B中的任何一行匹配?好的,您需要两个循环来将工作表a的任何一行与工作表B的任何一行匹配。使用新的子例程更新了答案,演示了这一点。