Range.SpecialCells:xlCellTypeBlanks实际代表什么?

时间:2018-04-19 15:02:14

标签: vba excel-vba excel

Range.SpecialCells method可用于返回符合特定条件的Range对象。使用xlCellType常量指定标准类型。

其中一个常量(xlCellTypeBlanks)被描述为带有no further elaboration的“空单元格”。

有谁知道这种方法使用的“空”的定义是什么?它是否包含没有值/公式但具有各种其他功能的单元格(数据验证,普通格式化,条件格式化等)?

3 个答案:

答案 0 :(得分:3)

该类型包括范围中既不包含常数也不包含公式的单元格子集。假设从空白表开始,我们在 A1 A10 中添加了一些内容,然后运行:

tuple = (response, json)

我们得到:

enter image description here

不包括格式和注释。另请注意, 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 rangeCountA返回相同的值?

好吧,如果一个单元格包含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
相关问题