![](/img/trans.png)
[英]Selection.SpecialCells() method returns unexpected range (Excel VBA)
[英]SpecialCells method of Excel Range strange behaviour
我已经编写了一个宏来使用excel范围对象的SpecialCells方法查找某个范围内的空白单元格。 当我尝试执行以下代码时,我得到一个异常为“找不到单元格”。
Sub test()
Debug.Print Sheet1.Range("A1:D4").SpecialCells(xlCellTypeBlanks).Address
End Sub
脚步:-
收到的输出:
运行时错误'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并执行test()方法,那么它会给我正确的输出。
收到的输出:
$ 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
A1:A4
A1:A4
具有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
.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地址内。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.