在Excel VBA中不使用循环计算非空单元格结果的方法,例如使用Specialcells。

3

以下是我在VBA中尝试计算的代码,希望通过'FormulaResultCount'返回一个计数变量为"3"。为什么不能计算每个单元格中公式所显示的内容;从灰色框中(请参见下面的照片)?

 Sub countNonBlanks()

        Worksheets("Sheet1").Select
        Range("C:C").Select


        FormulaResultCount = Selection.SpecialCells(xlCellTypeFormulas).Count


            'SpecialCells options from MSFT            
            '        xlCellTypeAllFormatConditions. Cells of any format -4172
            '        xlCellTypeAllValidation. Cells having validation criteria -4174
            '        xlCellTypeBlanks. Empty cells 4
            '        xlCellTypeComments. Cells containing notes -4144
            '        xlCellTypeConstants. Cells containing constants 2
            '        xlCellTypeFormulas. Cells containing formulas -4123
            '        xlCellTypeLastCell. The last cell in the used range 11
            '        xlCellTypeSameFormatConditions. Cells having the same format -4173
            '        xlCellTypeSameValidation. Cells having the same validation -4175
            '        xlCellTypeVisible. All visible cells
            '

    End Sub

参考公式如下:

enter image description here

注意:由于在动态工作时我将有更多的单元格,循环可能会使过程变慢太多。此外,我尝试使用CountA没有结果。


FormulaResultCount 被赋予了什么值? - Doug Glancy
如果D显示了你在C中的公式,我期望你的答案是5。即使它们的结果是“”,它们仍然是公式。 - Derek
@DougGlancy 给每个带有公式的单元格计数,赋值为5。相反,我想要为由B列触发的单元格分配3的值。 - Bob Hopez
4个回答

4
也许是这样的:

FormulaResultCount = WorksheetFunction.CountIf(Range("C:C"), "?*")

因此,要计算以任何字符开头的范围内的所有单元格吗?

3

xlCellTypeFormulas. 包含公式的单元格 -4123

这不是根据单元格的值返回单元格,而是判断它们是否有任何公式。根据您的工作表,应该得到 5

另外,请不要使用.Select 有趣的阅读

您的代码也可以写成

FormulaResultCount = Worksheets("Sheet1").Columns(3).SpecialCells(xlCellTypeFormulas).Count

另一个提示: 当使用SpecialCells时,请使用适当的错误处理,以便如果没有与SpecialCells条件相匹配的单元格,您的代码不会中断。请参见此示例。

Sub Sample()
    Dim ws As Worksheet
    Dim Rng As Range

    Set ws = ThisWorkbook.Sheets("Sheet1")

    With ws
        On Error Resume Next
        Set Rng = .Columns(3).SpecialCells(xlCellTypeFormulas)
        If Err <> 0 Then
            MsgBox "No Cells with formulas were found"
            Exit Sub
        End If
        On Error GoTo 0
    End With

    FormulaResultCount = Rng.Count

    Debug.Print FormulaResultCount
End Sub

评论跟进

Sub Sample()
    Dim ws As Worksheet
    Dim lRow As Long

    Set ws = ThisWorkbook.Sheets("Sheet1")

    With ws
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row

        Debug.Print Evaluate("=COUNTA(C1:C" & lRow & _
                    ")-COUNTIF(C1:C" & lRow & ","""")")
    End With
End Sub

非常有趣的方法,但它仍然返回5,而我希望返回3,即对于if()函数返回的每个值。在上面的列表中是否有“xlCellTypeFormulas”的替代方法可以与您分享的代码一起使用? - Bob Hopez
1
@BobHopez:我已经更新了帖子。请查看“评论后续”。 - Siddharth Rout
尝试不错,但仍返回5。想要只搜索C列——不确定为什么"FOLLOWUP"使用 "A"——无论如何,将"A"/"C"替换还是返回5而不是3。 - Bob Hopez
算了,@SiddharthRout!我检查了即时窗口,三个弹出来了...很多。 - Bob Hopez
读者注意:Application.SendKeys "^g ^a {DEL}" 可以清除即时窗口。 - Bob Hopez

3
你可能真正需要的是:

FormulaResultCount = Evaluate("CountA(C:C)")

我刚学习了evaluate命令,它非常厉害!而且它还给你3个:)

@Derek可能是一个不错的选择,但它仍然返回5,因为C列中有5个函数。我想要返回3,对于每个从单元格内的if()可见的值触发的值。 - Bob Hopez

1

你可以不使用VBA,只用公式就能实现这个功能。

=ROWS(range)*COLUMNS(range)-COUNTBLANK(range)

如果您想在VBA中完成此操作,可以使用以下代码:
Function non_blank_cell_results_count(r As Range) As Long
  non_blank_cell_results_count = r.Cells.Count - WorksheetFunction.CountBlank(r)
End Function

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接