Vba 合并两个工作表执行错误

Vba 合并两个工作表执行错误,vba,excel,Vba,Excel,我正在使用以下代码合并两个工作表(表5和表3)。更准确地说,我正在将第5张中的数据添加到第3张中,只要在处理代码时打开第3张,就可以正常工作。但是,当我切换到另一个工作表并运行代码时,代码不再正常工作 当我第一次运行代码时,它工作得很顺利 当我重复运行代码时,不应发生任何事情,因为我的宏只是将第5张中的数据插入第3张中尚未插入的数据,并且由于该数据已在第一次运行时插入,因此不应发生任何事情。当我停留在第3页时,情况就是这样。但是,如果我切换到另一个工作表并第二次、第三次、第四次运行代码,那么每次

我正在使用以下代码合并两个工作表(
表5
表3
)。更准确地说,我正在将
第5张
中的数据添加到
第3张
中,只要在处理代码时打开
第3张
,就可以正常工作。但是,当我切换到另一个工作表并运行代码时,代码不再正常工作

  • 当我第一次运行代码时,它工作得很顺利
  • 当我重复运行代码时,不应发生任何事情,因为我的宏只是将
    第5张
    中的数据插入
    第3张
    中尚未插入的数据,并且由于该数据已在第一次运行时插入,因此不应发生任何事情。当我停留在
    第3页时,情况就是这样。但是,如果我切换到另一个工作表并第二次、第三次、第四次运行代码,那么每次都会部分执行宏
  • 让我进一步解释一下:

    对于我的测试,我使用了三行数据。当我第一次执行按钮时,
    第5张
    中的所有三行都被添加到
    第3张
    。当我第二次、第三次、第四次按下按钮时,三行被添加到
    表3

    • 添加的第一行:为空

    • 添加的第二行和第三行:包含
      表3中第二行和第三行的数据

    有人知道这里出了什么问题吗

        Sub Consolidation()
    
        Dim lastrow As Long
        Dim NFR As Long
    
    
        lastrow = Tabelle5.Range("A" & Rows.Count).End(xlUp).Row
        NFR = Tabelle3.Range("A" & Rows.Count).End(xlUp).Offset(-3).Row
        Set myrange = Tabelle5.UsedRange
    
    
        For i = 4 To lastrow
    
        On Error Resume Next
    
        If Tabelle3.Cells(5 + i, 1) <> "" And Not IsError(Application.Match(Tabelle3.Cells(5 + i, 1), Tabelle5.Range("A:A"), False)) Then
    
    
            Tabelle3.Cells(5 + i, 2) = Application.WorksheetFunction.VLookup(Tabelle3.Cells(5 + i, 1), myrange, 2, False)
    
        End If
    
    
        If IsError(Application.Match(Tabelle5.Cells(i, 1), Tabelle3.Range("A9:A" & Range("A1048576").End(xlUp).Offset(8).Row), False)) Then
    
    
            Tabelle3.Cells(NFR + i, 1) = Application.WorksheetFunction.VLookup(Tabelle5.Cells(i, 1), myrange, 1, False)
    
    
            Tabelle3.Cells(NFR + i, 2) = Application.WorksheetFunction.VLookup(Tabelle5.Cells(i, 1), myrange, 2, False)
    
    
          End If
    
        Next i
    
        Set Rng = Tabelle3.Range("A9:A" & Range("A1048576").End(xlUp).Offset(8).Row)
        On Error Resume Next
        Rng.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    
    
    
        End Sub
    
    子合并()
    最后一排一样长
    暗NFR与长NFR相同
    lastrow=Tabelle5.Range(“A”&Rows.Count).End(xlUp).Row
    NFR=Tabelle3.Range(“A”和Rows.Count).End(xlUp).Offset(-3).Row
    设置myrange=Tabelle5.UsedRange
    对于i=4到最后一行
    出错时继续下一步
    如果Tabelle3.Cells(5+i,1)”,而不是iError(Application.Match(Tabelle3.Cells(5+i,1),Tabelle5.Range(“A:A”),则为False)
    Tabelle3.Cells(5+i,2)=Application.WorksheetFunction.VLookup(Tabelle3.Cells(5+i,1),myrange,2,False)
    如果结束
    如果IsError(Application.Match(Tabelle5.Cells(i,1),Tabelle3.Range(“A9:A”)和Range(“a048576”).End(xlUp).Offset(8.Row),False),则
    Tabelle3.Cells(NFR+i,1)=Application.WorksheetFunction.VLookup(Tabelle5.Cells(i,1),myrange,1,False)
    Tabelle3.Cells(NFR+i,2)=Application.WorksheetFunction.VLookup(Tabelle5.Cells(i,1),myrange,2,False)
    如果结束
    接下来我
    设置Rng=Tabelle3.范围(“A9:A”和范围(“A1048576”).结束(xlUp).偏移量(8).行)
    出错时继续下一步
    Rng.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    端接头
    
    类似的内容(未经测试):

    子合并()
    最后一排一样长
    与长、右、v一样暗的NFR
    lastrow=Tabelle5.Range(“A”&Rows.Count).End(xlUp).Row
    NFR=Tabelle3.Range(“A”和Rows.Count).End(xlUp).Offset(-3).Row
    设置myrange=Tabelle5.UsedRange
    对于i=4到最后一行
    v=表3.单元(5+i,1)
    如果v“”而不是IsError(Application.Match(v,Tabelle5.Range(“A:A”),False)),那么
    r=Application.VLookup(v,myrange,2,False)
    表3.单元格(5+i,2)=IIf(iError(r),“不匹配”,r)
    如果结束
    v=表5.单元(i,1)
    如果IsError(Application.Match(v,Tabelle3.Range)(“A9:A”&_
    表3.Range(“A1048576”).End(xlUp).Offset(8.Row),False)然后
    r=Application.VLookup(v,myrange,1,False)
    表3.单元格(NFR+i,1)=IIf(iError(r),“不匹配”,r)
    r=Application.VLookup(v,myrange,2,False)
    表3.单元格(NFR+i,2)=IIf(iError(r),“不匹配”,r)
    如果结束
    接下来我
    设置Rng=Tabelle3.范围(“A9:A”和范围(“A1048576”).结束(xlUp).偏移量(8).行)
    出错时继续下一步
    Rng.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    端接头
    
    下一步删除错误恢复时的
    将是一个好的开始:改用VLookup的非工作表函数版本,并测试返回值是否存在错误。这样,如果vlookup失败,您就不会出现运行时错误。此外,这没有工作表引用,这可能会把问题搞砸
    范围(“A1048576”)。End(xlUp)。Offset(8)。Row
    @SJR:您是对的,解决了问题。非常感谢:)@TimWilliams:你能不能再稍微解释一下你的想法好吧,我明白你的意思:)但是这种方法有什么更好的地方呢?当我修复了SJR所描述的
    范围
    定义时,我的代码与错误恢复下一行上的
    运行平稳。
    错误恢复下一行
    忽略所有错误(甚至意外错误),因此除非必要,最好避免它。这样,您就不会遗漏可能影响代码可靠性的潜在问题。
    Sub Consolidation()
    
        Dim lastrow As Long
        Dim NFR As Long, r, v
    
        lastrow = Tabelle5.Range("A" & Rows.Count).End(xlUp).Row
        NFR = Tabelle3.Range("A" & Rows.Count).End(xlUp).Offset(-3).Row
        Set myrange = Tabelle5.UsedRange
    
    
        For i = 4 To lastrow
    
            v = Tabelle3.Cells(5 + i, 1)
            If v <> "" And Not IsError(Application.Match(v, Tabelle5.Range("A:A"), False)) Then
    
                r = Application.VLookup(v, myrange, 2, False)
                Tabelle3.Cells(5 + i, 2) = IIf(IsError(r), "No match", r)
    
            End If
    
            v = Tabelle5.Cells(i, 1)
            If IsError(Application.Match(v, Tabelle3.Range("A9:A" & _
                   Tabelle3.Range("A1048576").End(xlUp).Offset(8).Row), False)) Then
    
                r = Application.VLookup(v, myrange, 1, False)
                Tabelle3.Cells(NFR + i, 1) = IIf(IsError(r), "No match", r)
    
                r = Application.VLookup(v, myrange, 2, False)
                Tabelle3.Cells(NFR + i, 2) = IIf(IsError(r), "No match", r)
            End If
    
        Next i
    
        Set Rng = Tabelle3.Range("A9:A" & Range("A1048576").End(xlUp).Offset(8).Row)
    
        On Error Resume Next
        Rng.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    
    End Sub