Excel的SpecialCells方法奇怪的行为

时间:2012-08-01 06:04:50

标签: excel excel-vba vba

我已经编写了一个宏来使用excel范围对象的SpecialCells方法查找某个范围内的空白单元格。 当我尝试执行以下代码时,我得到一个例外,因为“找不到细胞”。

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

步骤: -

  1. 打开一个新的Excel实例。
  2. 按ALT + F11 /打开VBE
  3. 插入新模块
  4. 粘贴上面的代码并运行上面指定的测试宏。
  5. 收到的输出:

    运行时错误'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'/ P>

    预期输出

    $ A $ 1:$ d $ 4

    案例3:

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

    收到的输出:

    $ A $ 1:$ d $ 4

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

2 个答案:

答案 0 :(得分:4)

返回范围时,原因是SpecialCells“看起来”UsedRange

因此,在未使用的工作表上使用SpecialCells将返回Runtime Error '1004'. No Cells Found. (另外,总是使用SpecialCells进行错误处理)

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

下面的代码看起来返回Range(“A1:D4”)。SpecialCells(xlCellTypeBlanks)for

  1. 空白表 - 失败
  2. 填写了A10的表格 - A1:A4
  3. 已清除A10的工作表 - A1:A4
  4. 使用了已重置的工作表(实际上是1) - 失败

    Sub Test()
    Dim ws As Worksheet
    Set ws = Sheets.Add
    On Error Resume Next
    'blank sheet
    Debug.Print "Blank sheet " & ws.Range("A1:D4").SpecialCells(xlCellTypeBlanks).Address
    'enter in A10
    ws.[a10] = "test"
    Debug.Print "With A10 " & ws.Range("A1:D4").SpecialCells(xlCellTypeBlanks).Address
    'clear a10
    ws.[a10].ClearContents
    Debug.Print "With A10 cleared " & ws.Range("A1:D4").SpecialCells(xlCellTypeBlanks).Address
    'reset range
    ActiveSheet.UsedRange
    Debug.Print "With A10 cleared and range reset" & ws.Range("A1:D4").SpecialCells(xlCellTypeBlanks).Address
    On Error GoTo 0
    End Sub
    

答案 1 :(得分:1)

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

在全新的工作表上测试Specialcells会给你错误,因为usedrange只是$ A $ 1。如果$ A $ 1被着色,那么您将不会像上面的案例2中那样得到错误。

您必须非常谨慎地使用Specialcells。这是一个不会在新工作表上出错的示例。

Sub Sample()
    If ActiveSheet.UsedRange.Column > 1 Or ActiveSheet.UsedRange.Row > 1 Then
        Debug.Print ActiveSheet.UsedRange.SpecialCells(xlCellTypeBlanks).Address
    End If
End Sub

现在在Cell D5中键入内容。说“Blah Blah”

现在运行此代码

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

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