excel - 删除后识别为空 "Range"

标签 excel vba

我使用范围,有时给定对象中的所有单元格都会被删除 (Range.Cells.Delete)

我玩过并发现了这些:

  • 删除所有单元格后,变量类型仍为 Range 并且 Is Not Nothing
  • 调用其任何成员都会导致错误“需要对象”

这是我的小子来测试它:

Sub test()
    Dim r As Range

    Debug.Print r Is Nothing        ' -> true
    Set r = ActiveSheet.Range("a2")
    Debug.Print TypeName(r)         ' -> Range
    r.Cells.Delete shift:=xlShiftUp
    On Error GoTo ErrHandler
    Debug.Print r Is Nothing        ' -> False
    Debug.Print TypeName(r)         ' -> Range
    Debug.Print r.Address           ' -> "Err: Object required"
    Debug.Print r.Cells.Count       ' -> "Err: Object required"

    Exit Sub
ErrHandler:
    MsgBox "Err: " & Err.Description
    Resume Next
End Sub

我的问题是:如何确定(希望没有错误处理)对象是否为空 Range

到目前为止我找到的最短选项:

Function IsEmptyRange(testRange As Range) As Boolean
    If TypeName(testRange) <> "Range" Then
        IsEmptyRange = False
    Else
        On Error GoTo EmptyRange
        IsEmptyRange = testRange.Cells.Count = 0
        If False Then
EmptyRange:
            Err.Clear
            IsEmptyRange = True
        End If
    End If
End Function

最佳答案

Daily Dose of Excel 上对此有一个有趣的讨论。指向类似的 Stack Overflow question 。 DDoE 没有给出“解决方案”,但关于“预期行为”的讨论很有启发性。 SO 帖子确实如此(作者:@DougGlancy),但它只是代码的一个版本(可能稍微好一点,因为不需要 If False then... 构造)。

在我看来,这里的最佳实践是记住在可以的情况下将引用变量设置为 Nothing。例如

Sub test()
    Dim r As Range

    Debug.Print r Is Nothing        ' -> true
    Set r = ActiveSheet.Range("a2")
    Debug.Print TypeName(r)         ' -> Range
    r.Cells.Delete shift:=xlShiftUp

    Set r = Nothing                 ' -> end of problem

    On Error GoTo ErrHandler

    Debug.Print r Is Nothing        ' -> True

    If Not r Is Nothing Then
        Debug.Print TypeName(r)         ' -> Range
        Debug.Print r.Address           ' -> "Err: Object required"
        Debug.Print r.Cells.Count       ' -> "Err: Object required"
    End If

    Exit Sub
ErrHandler:
    MsgBox "Err: " & Err.Description
    Resume Next
End Sub

趋势可能是让作用域处理清理工作(即,一旦 Sub 完成,r 将超出作用域),但最好这样做自己清理。

关于excel - 删除后识别为空 "Range",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46051135/

相关文章:

vba - 清理条件格式 (Excel VBA)

c# - 为 VSTO 应用创建跨项目功能区

excel - 检测是否安装了 Excel 2003 的最佳方法是什么?

arrays - 哪种方式编写数组更好(CPU 成本)?

excel - 在用户窗体初始化子中访问本工作簿中声明的变量

Excel VBA - 保存前运行宏

vba - 将Word文档中的所有图像缩放至100%的脚本

excel - 如何在不使用 VBA 的情况下在 Excel 中执行反向字符串搜索?

excel - 循环查找并打印从一个工作簿到 VBA 中的事件工作簿的相应值

vba - MS Access 2010、Excel 2010、Windows Server 2008 R2 64 位 : SaveAs method of Workbook class failed