3

我编写了一个宏来使用 excel 范围对象的 SpecialCells 方法从某个范围内查找空白单元格。当我尝试执行以下代码时,出现“未找到单元格”的异常。

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

脚步:-

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

收到的输出:

运行时错误“1004”。未找到细胞。

预期输出:

$A$1:$D$4

情况1:

现在,如果我对单元格 A1 进行任何操作。诸如赋予填充颜色等操作。调用 test() 宏然后它不会抛出异常。

收到的输出:

1澳元

预期输出:

$A$1:$D$4

案例二:

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

收到的输出:

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

预期输出:

$A$1:$D$4

案例3:

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

收到的输出:

$A$1:$D$4

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

4

2 回答 2

4

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

因此SpecialCells,在未使用的工作表上使用将返回Runtime Error '1004'. No Cells Found. (顺便说一句,始终使用 SpecialCells 进行错误处理)

当您更改单元格 A1 时,它变成了 sheet UsedRange,因此您的 Case 1 返回“A1”

下面的代码看起来返回 Range("A1:D4").SpecialCells(xlCellTypeBlanks)

  1. 一张白纸 - 失败
  2. 填了A10的那张纸——A1:A4
  3. A10清空的那张纸——A1:A4
  4. 使用 usedrange 重置的工作表(实际上是 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
    
于 2012-08-01T06:38:56.590 回答
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

现在在单元格 D5 中输入一些内容。说“呸呸呸”

现在运行这段代码

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

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

于 2012-08-01T06:40:58.597 回答