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