Excel的SpecialCells方法范围奇怪的行为
我写了一个macros,使用Excel范围对象的SpecialCells方法从一定范围内查找空白单元格。 当我试图执行下面的代码,我得到一个exception为“找不到单元格”。
Sub test() Debug.Print Sheet1.Range("A1:D4").SpecialCells(xlCellTypeBlanks).Address End Sub
脚步:-
- 打开一个新的Excel实例。
- 按ALT + F11 /打开VBE
- 插入一个新的模块
- 粘贴上面的代码并按照上面的指定运行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
- 一张白纸 – 失败
- 带有A10的表格填入 –
A1:A4
- A10清单 –
A1:A4
-
使用复位的表单(实际上是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地址。