使用VBA计算可见的空白单元格?

时间:2015-02-11 08:40:15

标签: vba excel-vba excel

当我在单元格中输入以下函数作为UDF时:

Function VisibleBlankCells(r As Range) As Long
    On Error Resume Next
    VisibleBlankCells = Intersect(r.SpecialCells(xlCellTypeVisible), r.SpecialCells(xlCellTypeBlanks)).Count
    On Error GoTo 0
End Function

r.SpecialCells(xlCellTypeBlanks)r中的所有单元格评为空,无论它们是否包含文本。可能是什么原因和另一种解决方案?

2 个答案:

答案 0 :(得分:1)

开始摆脱On Error Resume Next - 你应该总是假设你的代码会失败并相应地解释它,简单地忽略错误只会使问题复杂化。

其次,没有必要使用Intersect - 只是直接识别可见细胞,然后使用另一个SpecialCells()方法来识别空白子细胞。

Function VisibleBlankCells(r As Range) As Long
    VisibleBlankCells = r.SpecialCells(xlCellTypeVisible).SpecialCells(xlCellTypeBlanks).Count
End Function

用这个测试:

Sub test_code()
    Dim r As Range: Set r = Selection
    Debug.Print CountBlanks(r)
End Sub

Function CountBlanks(r As Range) As Long
    CountBlanks = r.SpecialCells(xlCellTypeVisible).SpecialCells(xlCellTypeBlanks).Count
End Function

答案 1 :(得分:0)

这种过滤机制在UDF中不起作用(有关信息,请参阅this)。我建议在你的UDF中循环:

Public Function VisibleBlankCells(rng As Range) As Long
    Dim i As Integer
    Dim cell As Range
    i = 0
    For Each cell In rng
        If cell.Rows.Hidden = False And _
        cell.Columns.Hidden = False And _
        cell.Value = "" Then
            i = i + 1
        End If
    Next
    VisibleBlankCells = i
End Function 

但是,更新和功能可能存在一些问题:

  1. UDF的值仅在编辑引用范围或调用其他UDF后才会更新。因此,如果您隐藏该范围内的列或行,则不会产生即时效果
  2. 在Sub中的(工作)执行代码时,可见单元格(也)指的是工作表中尚未使用的单元格为"不可见"。但是,在我的解决方案中,所有未包含在隐藏行/列中的单元格都被视为可见。