Excel的SpecialCells方法范围奇怪的行为

我写了一个macros,使用Excel范围对象的SpecialCells方法从一定范围内查找空白单元格。 当我试图执行下面的代码,我得到一个exception为“找不到单元格”。

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

脚步:-

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

收到的输出:

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

预期产出:

$ A $ 1:$ d $ 4

情况1:

现在,如果我做单元格A1的任何操作。 给填充颜色等操作。调用test()macros,然后不抛出exception。

收到的输出:

$ A $ 1

预期产出:

$ A $ 1:$ d $ 4

案例2:

假设如果我给单元格B3中的任何值。 调用test()macros,不抛出exception。

收到的输出:

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

预期产出:

$ A $ 1:$ d $ 4

案例3:

如果我尝试编辑值或填充单元格范围“A1:D4”例如E10和执行testing()方法,然后它给我正确的输出。

收到的输出:

$ A $ 1:$ d $ 4

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

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

因此,在未使用的工作表上使用SpecialCells将返回Runtime Error '1004'. No Cells Found. 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 

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

要在一张全新的表格上testingSpecialcells会给你错误,因为usedrange只是$ A $ 1。 如果$ A $ 1是有颜色的,那么在上面的CASE 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中input一些东西。 说“Blah Blah”

现在运行这个代码

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

你会注意到,这将工作,因为范围在UsedRange地址。