我已经编写了一个宏来使用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'/ P>
预期输出
$ A $ 1:$ d $ 4
案例3:
如果我尝试编辑值或填充范围“A1:D4”之外的单元格(例如E10)并执行test()方法,那么它会给我正确的输出。
收到的输出:
$ A $ 1:$ d $ 4
注意:使用新的excel实例执行每个Case。
答案 0 :(得分:4)
返回范围时,原因是SpecialCells
“看起来”UsedRange
。
因此,在未使用的工作表上使用SpecialCells
将返回Runtime Error '1004'. No Cells Found.
(另外,总是使用SpecialCells进行错误处理)
当您更改单元格A1时,它将成为工作表UsedRange
,因此您的案例1将返回“A1”
下面的代码看起来返回Range(“A1:D4”)。SpecialCells(xlCellTypeBlanks)for
A1:A4
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
答案 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地址范围内。