使用Range.Find()VBA进行error handling
我用这个工作代码回答了一个问题 :
如果传真号码已经存在,这个vba代码将循环遍历所有的ID,它将在C,D,E等列中添加ID(总是select下一个空白),然后删除该行。 最后,它交换列A和B,以便在列A中留下传真号码,而列B,C,D,E等是与该编号关联的所有ID。
testing工作:
Sub RemoveDups() Dim CurRow As Long, LastRow As Long, DestLast As Long, DestRng As Range LastRow = Range("A" & Rows.Count).End(xlUp).Row On Error Resume Next For CurRow = LastRow To 3 Step -1 Set DestRng = Range("B2:B" & CurRow - 1).Find(Range("B" & CurRow).Value, LookIn:=xlValues, LookAt:=xlWhole, SearchDirection:=xlNext) DestRng = DestRng If Err > 0 Then Err.Clear Else DestLast = Cells(DestRng.Row, Columns.Count).End(xlToLeft).Column + 1 Cells(DestRng.Row, DestLast).Value = Cells(CurRow, 1).Value Cells(CurRow, 1).EntireRow.Delete xlShiftUp End If Next CurRow Columns("B:B").Cut Columns("A:A").Insert Shift:=xlToRight Application.CutCopyMode = False MsgBox "Done" End Sub
我的问题是这样的:为什么我需要额外的线路DestRng = DestRng
? 我添加它的原因是因为代码无法正常工作,所以我添加了一个将DestRng
转储到Cells.Value
。 突然之间,代码工作,所以我做了一个简单的DestRng = DestRng
行,以确保仍然有代码可能会出错。 如果我注释掉这一行,就会返回到无function的代码。 试图找出为什么Range.Find()
不会激活error handling程序,但DestRng = DestRng
将激活error handling程序。
编辑:屏幕截图:
- 数据之前:
- 数据与
DestRng = DestRng
ANDEntireRow.Delete
注释: - 数据与我的完整代码:
如果您从一张完全空的工作表开始并运行:
Sub errorTest() Dim r As Range Set r = Cells.Find(what:="something", after:=Range("A1")) r = r End Sub
代码将会失败
r=r
线。 这是因为Set命令将r 设置为Nothing和
r=r
相当于:
r.Value=r.Value