【问题标题】:Error Handling with Range.Find() VBARange.Find() VBA 的错误处理
【发布时间】:2014-12-08 14:53:20
【问题描述】:

我用这个工作代码回答了question

此 vba 代码将从下向上循环遍历所有 ID,如果传真号码已存在,它将将该 ID 添加到 C、D、E 等列中的该行(始终选择下一个空白),然后删除线。最后,它交换 A 列和 B 列,因此您在 A 列中留下一个传真号码,B、C、D、E 列等都是与该号码关联的所有 ID。

测试工作:

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 行,以确保仍有可能出错的代码。如果我注释掉该行,它会返回到无法运行的代码。试图找出Range.Find() 不会激活错误处理程序,但DestRng = DestRng 会激活错误处理程序的原因。

编辑:截图:

  • 之前的数据:
  • 带有DestRng = DestRngEntireRow.Delete 的数据已注释掉:
  • 我的完整代码的数据:

【问题讨论】:

  • 我无法重现该问题。据我所知,删除 DestRng = DestRng 并不会改变行为。无论哪种方式,它都是有效的。可以用来重现问题的电子表格中最简单的数据集是什么?
  • 添加了屏幕截图@JackieChiles
  • Find 如果未找到搜索值不会出错,它会返回 Nothing 这就是您应该测试的内容:If Not DestRng Is Nothing Then
  • @Rory 我的问题更多是使用一些带有变量类型的旧代码无法使用Nothing,因此它触发了定义行上的错误。
  • @Chrismas007 我很困惑。您不能将 Find 的结果分配给无法设置为 Nothing 的变量类型。

标签: vba excel


【解决方案1】:

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

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

【讨论】:

  • 谢谢,如果不存在,我正在使用创建新工作表的代码,在这种情况下,您不能将 createNewSheet = Nothing 设置为错误。很高兴知道为什么会这样。
  • 请提及Range 默认为.value,因为它是Range 的默认成员属性。具有默认成员属性的所有对象都会发生此行为。
  • 如果默认不触发,我使用DestRng.Value = DestRng.Value触发错误会更合适吗?否则我可以将其重写为If Not Nothing Then do stuff Else Next
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-20
  • 2017-08-24
  • 2012-03-03
  • 1970-01-01
  • 2016-06-05
相关资源
最近更新 更多