Excel 如何检测包含公式的单元格是否为空?

Excel 如何检测包含公式的单元格是否为空?,excel,vba,excel-formula,Excel,Vba,Excel Formula,我正在尝试编写一个宏,该宏查看一列,如果一个单元格不是空的,则将所有值相加,并计算相加的单元格数 问题是列中的所有单元格都引用了单独工作表中的不同单元格。因此,从技术上讲,所有单元格中都有一些内容(例如,=Detail!E5) 要计数的单元格的数字介于0和100之间。而“空白”单元格有一个引用原始单元格的公式,并且该公式正在返回 ”(空格) 有人知道如何做到这一点吗 我尝试了一些方法,但它们总是返回所有单元格的计数,而不是填充的单元格 Set myRange = Range("J13") F

我正在尝试编写一个宏,该宏查看一列,如果一个单元格不是空的,则将所有值相加,并计算相加的单元格数

问题是列中的所有单元格都引用了单独工作表中的不同单元格。因此,从技术上讲,所有单元格中都有一些内容(例如,
=Detail!E5

要计数的单元格的数字介于0和100之间。而“空白”单元格有一个引用原始单元格的公式,并且该公式正在返回
(空格)

有人知道如何做到这一点吗

我尝试了一些方法,但它们总是返回所有单元格的计数,而不是填充的单元格

Set myRange = Range("J13")


For iCol = 0 To 18
        If myRange.Offset(0, iCol).Value > result Then
            For iRow = 17 To 31
                If myRange.Offset(iRow, iCol).Value <> " " Then
                    counter = counter + 1
                    Debug.Print (counter)
                End If
            Next iRow
        End If
Next iCol
设置myRange=范围(“J13”)
对于iCol=0到18
如果myRange.Offset(0,iCol).Value>结果,则
对于iRow=17到31
如果myRange.Offset(iRow,iCol).Value为“”,则
计数器=计数器+1
调试.打印(计数器)
如果结束
下一步
如果结束
下一个iCol

特殊单元格可以确定是否已从公式中返回文本或数字,但您最好使用简单的工作表函数

dim n as long, t as long
Set myRange = Range("J13")

For iCol = 0 To 18
    If myRange.Offset(0, iCol).Value > result Then
        with myRange.Offset(17, iCol).resize(15, 1)

            'count numbers returned from formulas
            n = application.count(.cells)
            'count text returned from formulas
            t = application.counta(.cells) - application.count(.cells)

            debug.print n & "numbers"
            debug.print t & "texts"

            on error resume next
            'count numbers returned from formulas
            n = 0
            n = .specialcells(xlCellTypeFormulas, xlNumbers).count
            'count text returned from formulas
            t = 0
            t = .specialcells(xlCellTypeFormulas, xlTextValues).count
            on error goto 0

            debug.print n & "numbers"
            debug.print t & "texts"

        end with
    End If
Next iCol
计数和求和值(循环) 尚不清楚
结果是什么。在常量部分进行调整

代码
为什么要让公式返回空格(
“”
)而不是零长度字符串(
“”
)?单元格的公式属性返回该单元格中的公式。Value属性返回由该公式计算的值=细节如果E5为空,E5将返回0。您可以使用COUNT函数对包含数字的单元格进行计数,包括零和由=Detail!生成的零!E5。使用COUNTA对非空白单元格进行计数,使用COUNTBLANK对空白单元格进行计数。有公式的单元格不是空的。使用COUNTIF或COUNTIF对包含特定值(包括“”或零)的单元格进行计数。将一个空间输入一个单元格不是一个好主意。无论你的目的是什么,都要找一个更好的。COUNTA计算
或任何文本、数字或日期,但不是真正的空白单元格。
Sub CountVals()

    Const cSheet As String = "Sheet1"
    Const cRange As String = "J13"
    Const cCols As Long = 19
    Const cFirstR As Long = 30
    Const cLastR As Long = 44
    Const result As Long = 21 ' Long, Single, Double ?

    Dim myRange As Range
    Dim FirstC As Long
    Dim LastC As Long
    Dim counter As Long
    Dim colCounter As Long
    Dim summer As Long
    Dim colSummer As Long
    Dim i As Long
    Dim j As Long


    With ThisWorkbook.Worksheets(cSheet)
        Set myRange = .Range(cRange)
        FirstC = myRange.Column
        LastC = FirstC + cCols - 1
        For j = FirstC To LastC
            Set myRange = .Cells(myRange.Row, j)
            If myRange.Value > result Then
                For i = cFirstR To cLastR
                    If IsNumeric(.Cells(i, j).Value) Then
                        summer = summer + .Cells(i, j).Value
                        colSummer = colSummer + .Cells(i, j).Value
                        counter = counter + 1
                        colCounter = colCounter + 1
                    End If
                Next
                Debug.Print "Column" & j & " = " & colSummer & "(" _
                        & summer & ") - " & colCounter & "(" _
                        & counter & ")" ' for each column
                colCounter = 0
                colSummer = 0
            End If
        Next
    End With

End Sub