Excel范围奇怪行为的特殊单元法

Excel范围奇怪行为的特殊单元法,excel,vba,Excel,Vba,我编写了一个宏,使用excel range对象的SpecialCells方法查找特定范围内的空白单元格。 当我试图执行下面的代码时,我得到一个异常“找不到单元格” 步骤:- 打开一个新的Excel实例 按ALT+F11/打开VBE 插入新模块 粘贴上述代码,并按上述规定运行测试宏 收到的输出: 运行时错误“1004”。没有发现细胞 预期输出: $A$1:$D$4 案例1: 现在如果我对A1单元做任何操作。调用test()宏,则不会引发异常 收到的输出: $A$1 预期输出: $A$1:$D$4

我编写了一个宏,使用excel range对象的SpecialCells方法查找特定范围内的空白单元格。 当我试图执行下面的代码时,我得到一个异常“找不到单元格”

步骤:-

  • 打开一个新的Excel实例
  • 按ALT+F11/打开VBE
  • 插入新模块
  • 粘贴上述代码,并按上述规定运行测试宏
  • 收到的输出:

    运行时错误“1004”。没有发现细胞

    预期输出:

    $A$1:$D$4

    案例1:

    现在如果我对A1单元做任何操作。调用test()宏,则不会引发异常

    收到的输出:

    $A$1

    预期输出:

    $A$1:$D$4

    案例2:

    假设我在单元格B3中给出任何值。调用test()宏,不会引发异常

    收到的输出:

    $B$1:$B$2,$A$1:$A$3

    预期输出:

    $A$1:$D$4

    案例3:

    如果我尝试编辑值或填充范围“A1:D4”之外的单元格,例如E10和execute test()方法,那么它会给出正确的输出

    收到的输出:

    $A$1:$D$4


    注意:使用新的excel实例执行每个案例。

    原因是
    SpecialCells
    “查看”返回范围时的
    UsedRange

    因此,在未使用的工作表上使用
    SpecialCells
    将返回
    运行时错误“1004”。未找到单元格。
    (作为备用,请始终使用特殊单元格的错误处理)

    当您更改单元格A1时,它将成为图纸
    UsedRange
    ,因此案例1返回“A1”

    下面的代码查找返回范围(“A1:D4”)。特殊单元格(xlCellTypeBlanks)用于

  • 空白表格-失败
  • 填写A10的表格-
    A1:A4
  • 已清除A10的纸张-
    A1:A4
  • usedrange重置(有效为1)的工作表失败


  • .SpecialCells
    使用工作表的使用范围,而不是特定单元格,除非特定单元格在使用范围内

    在一张全新的工作表上测试
    Specialcells
    ,会出现错误,因为usedrange仅为$A$1。如果$A$1是彩色的,那么您将不会像上面案例2中预期的那样得到错误

    您必须极其小心地使用
    特殊单元。这里有一个例子,它不会给你一个新的工作表上的错误

    Sub Sample()
        If ActiveSheet.UsedRange.Column > 1 Or ActiveSheet.UsedRange.Row > 1 Then
            Debug.Print ActiveSheet.UsedRange.SpecialCells(xlCellTypeBlanks).Address
        End If
    End Sub
    
    现在在D5单元格中键入一些内容。说“废话”

    现在运行此代码

    Sub Sample()
        Debug.Print Sheet1.Range("A1:D4").SpecialCells(xlCellTypeBlanks).Address
    End Sub
    

    您会注意到,这将起作用,因为范围在UsedRange地址内。

    +1对于一个描述良好的问题:)
    Sub Sample()
        If ActiveSheet.UsedRange.Column > 1 Or ActiveSheet.UsedRange.Row > 1 Then
            Debug.Print ActiveSheet.UsedRange.SpecialCells(xlCellTypeBlanks).Address
        End If
    End Sub
    
    Sub Sample()
        Debug.Print Sheet1.Range("A1:D4").SpecialCells(xlCellTypeBlanks).Address
    End Sub