使用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程序。

编辑:屏幕截图:

  • 数据之前: DataBefore
  • 数据与DestRng = DestRng AND EntireRow.Delete注释: CommentOut
  • 数据与我的完整代码: FullCode

如果您从一张完全空的工作表开始并运行:

 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