Range.SpecialCells method可用于返回符合特定条件的Range对象。使用xlCellType常量指定标准类型。
其中一个常量(xlCellTypeBlanks)被描述为带有no further elaboration的“空单元格”。
有谁知道这种方法使用的“空”的定义是什么?它是否包含没有值/公式但具有各种其他功能的单元格(数据验证,普通格式化,条件格式化等)?
答案 0 :(得分:3)
该类型包括范围中既不包含常数也不包含公式的单元格子集。假设从空白表开始,我们在 A1 和 A10 中添加了一些内容,然后运行:
tuple = (response, json)
我们得到:
不包括格式和注释。另请注意, A10 下的所有“空”单元格也会被忽略。
答案 1 :(得分:0)
该定义确实包含在单元格中不包含任何内容的想法,即,它排除了包含以下任一单元格的任何单元格:
但是 还排除了不在A1到工作表最后使用的单元格范围内的任何单元格 (可以通过{{1}以编程方式进行标识},或使用键盘ws.cells.specialCells(xlCellTypeLastCell)
)。
因此,如果工作表包含向下到单元格C10的数据(即Ctrl+End
将焦点移至单元格C10),则运行Ctrl+End
将失败。
NB 范围Range("D:D").specialCells(xlCellTypeBlanks)
有时可能与A1 to LastCellUsed
不同。如果顶部的某些行和/或左侧的某些列从未包含任何数据,则会发生这种情况。
另一方面,无论以下任何情况,都将正确识别符合上述空定义的单元格:
在主要主题旁边,让我问一个棘手的问题,即如何在Excel中定义 Blank 一词:
used range
和CountA
返回相同的值? 好吧,如果一个单元格包含CountBlank
(将显示为空白单元格),则'
和CountA
都将在应用于该单元格时返回值1。我的猜测是,从技术上讲,它确实包含某些内容,尽管它显示为空白单元格。 here对此功能进行了讨论。
CountBlank
在此示例中,第6行和第7行都将为CountA和CountBlank返回1。
因此,在Excel中,术语空白似乎并不是唯一的定义方式:随工具而异。
答案 2 :(得分:0)
Papalew的响应指出,“ xlCellTypeBlanks”不包括不在“已用范围”的特定版本内的任何像元,该特定版本的计算方式与特殊像元类型“ xlCellTypeLastCell”相同。通过测试,我发现“ xlCellTypeLastCell”返回“ UsedRange”属性的最后一个单元格,直到上次计算该属性为止。。
换句话说,添加引用“ UsedRange”的行实际上将更改SpecialCells方法的行为。这是一种异常/意外的行为,以至于我想添加一个答案来记录它。
Sub lastCellExample()
Dim ws As Worksheet
Set ws = Sheets.Add
ws.Range("A1").Value = "x"
ws.Range("A5").Value = "x"
ws.Range("A10").Value = "x"
'Initially the "UsedRange" and calculated used range are identical
Debug.Print ws.UsedRange.Address
'$A$1:$A$10
Debug.Print ws.Range(ws.Range("A1"), _
ws.Cells.SpecialCells(xlCellTypeLastCell)).Address
'$A$1:$A$10
Debug.Print ws.Cells.SpecialCells(xlCellTypeBlanks).Address
'$A$2:$A$4,$A$6:$A$9
'After deleting a value, "UsedRange" is recalculated, but the last cell is not...
ws.Range("A10").Clear
Debug.Print ws.Range(ws.Range("A1"), _
ws.Cells.SpecialCells(xlCellTypeLastCell)).Address
'$A$1:$A$10
Debug.Print ws.Cells.SpecialCells(xlCellTypeBlanks).Address
'$A$2:$A$4,$A$6:$A$10
Debug.Print ws.UsedRange.Address
'$A$1:$A$5
'...until you try again after referencing "UsedRange"
Debug.Print ws.Range(ws.Range("A1"), _
ws.Cells.SpecialCells(xlCellTypeLastCell)).Address
'$A$1:$A$5
Debug.Print ws.Cells.SpecialCells(xlCellTypeBlanks).Address
'$A$2:$A$4
End Sub