Excel公式/VBA代码,该代码将仅对包含值的单元格求和(跳过任何包含公式的单元格)?

Excel公式/VBA代码,该代码将仅对包含值的单元格求和(跳过任何包含公式的单元格)?,excel,conditional,sum,excel-formula,vba,Excel,Conditional,Sum,Excel Formula,Vba,是否存在只对包含值的单元格求和的公式(而不是带公式的单元格)?例如,在电子表格的A列中,输入的值和返回值的公式混合在一起。如果我在最后使用一个求和公式,它将自然地对所选数组中的所有数字求和,而不管它们是输入值还是由公式生成的值。(可能是某种SUMIF&VBA代码组合…)如果我的描述不清楚,这里是一个假设的电子表格设置,我需要以下公式: A 1| 400 2| =SUM(B1:B3) 3| =AVERAGE(B1:B3) 4| 200 5| 100 6| =COUNT(B1

是否存在只对包含值的单元格求和的公式(而不是带公式的单元格)?例如,在电子表格的A列中,输入的值和返回值的公式混合在一起。如果我在最后使用一个求和公式,它将自然地对所选数组中的所有数字求和,而不管它们是输入值还是由公式生成的值。(可能是某种SUMIF&VBA代码组合…)如果我的描述不清楚,这里是一个假设的电子表格设置,我需要以下公式:

      A
1|  400
2|  =SUM(B1:B3)
3|  =AVERAGE(B1:B3)
4|  200
5|  100
6|  =COUNT(B1:B3)
7|  I want the sum Formula in this cell (A7) to return the value 700 (the sum of the values above).

有一种方法,你可以和SUMIF结合起来做你想做的事。

有一种方法,你可以和SUMIF结合起来做你想做的事。

这会管用的,尽管感觉有些马虎,肯定有更好的方法。通过一点额外的工作,您可以将其制作成UDF

Sub SumNumbersOnly()
    Dim sumAllCells As Long
    Dim sumFormulaCells As Long
    Dim sumNumberCells As Long

    sumAllCells = Application.Sum(Selection)
    sumFormulaCells = Application.Sum(Selection.Cells.SpecialCells(xlCellTypeFormulas))

    sumNumberCells = sumAllCells - sumFormulaCells

    Debug.Print sumNumberCells //Returns 700 (400 + 200 + 100 as in your example)

End Sub

这会起作用的,尽管不知何故它感觉有些草率,而且肯定有更好的方法。通过一点额外的工作,您可以将其制作成UDF

Sub SumNumbersOnly()
    Dim sumAllCells As Long
    Dim sumFormulaCells As Long
    Dim sumNumberCells As Long

    sumAllCells = Application.Sum(Selection)
    sumFormulaCells = Application.Sum(Selection.Cells.SpecialCells(xlCellTypeFormulas))

    sumNumberCells = sumAllCells - sumFormulaCells

    Debug.Print sumNumberCells //Returns 700 (400 + 200 + 100 as in your example)

End Sub

澄清马丁的回答

无法知道单元格是否包含使用Excel公式的公式

您必须定义一个UDF(用户定义函数)。 在本教程中:

  • 打开一个新工作簿
  • 进入VBA(按Alt+F11)
  • 插入新模块(插入>模块)
  • 复制并粘贴Excel用户定义的函数示例
  • 退出VBA(按Alt+Q)
  • 使用函数(它们将出现在“用户定义”类别下的“粘贴函数”对话框Shift+F3中)
  • 您的自定义项将类似于:

    Public Function isformula(rng As Range) As Variant()
        Dim aryIn() As Variant
        Dim a As Variant
        Dim i As Integer, j As Integer
        Dim temp() As Variant
    
        aryIn = rng.Value
        ReDim temp(LBound(aryIn) To UBound(aryIn), _
                   LBound(aryIn, 2) To UBound(aryIn, 2))
        For i = LBound(aryIn) To UBound(aryIn)
            For j = LBound(aryIn, 2) To UBound(aryIn, 2)
                If (Left(rng(i, j).Formula, 1) = "=") Then
                   temp(i, j) = True
                Else
                   temp(i, j) = False
                End If
            Next j
        Next i
        isformula = temp()
    End Function
    
    {=SUM(IF(NOT(isformula(A1:A6)),A1:A6,0))}
    
    然后您可以在代码中使用它。比如:

    Public Function isformula(rng As Range) As Variant()
        Dim aryIn() As Variant
        Dim a As Variant
        Dim i As Integer, j As Integer
        Dim temp() As Variant
    
        aryIn = rng.Value
        ReDim temp(LBound(aryIn) To UBound(aryIn), _
                   LBound(aryIn, 2) To UBound(aryIn, 2))
        For i = LBound(aryIn) To UBound(aryIn)
            For j = LBound(aryIn, 2) To UBound(aryIn, 2)
                If (Left(rng(i, j).Formula, 1) = "=") Then
                   temp(i, j) = True
                Else
                   temp(i, j) = False
                End If
            Next j
        Next i
        isformula = temp()
    End Function
    
    {=SUM(IF(NOT(isformula(A1:A6)),A1:A6,0))}
    
    其中大括号{}表示数组公式(通过Ctrl-Shift-Enter输入)


    来澄清马丁的答案

    无法知道单元格是否包含使用Excel公式的公式

    您必须定义一个UDF(用户定义函数)。 在本教程中:

  • 打开一个新工作簿
  • 进入VBA(按Alt+F11)
  • 插入新模块(插入>模块)
  • 复制并粘贴Excel用户定义的函数示例
  • 退出VBA(按Alt+Q)
  • 使用函数(它们将出现在“用户定义”类别下的“粘贴函数”对话框Shift+F3中)
  • 您的自定义项将类似于:

    Public Function isformula(rng As Range) As Variant()
        Dim aryIn() As Variant
        Dim a As Variant
        Dim i As Integer, j As Integer
        Dim temp() As Variant
    
        aryIn = rng.Value
        ReDim temp(LBound(aryIn) To UBound(aryIn), _
                   LBound(aryIn, 2) To UBound(aryIn, 2))
        For i = LBound(aryIn) To UBound(aryIn)
            For j = LBound(aryIn, 2) To UBound(aryIn, 2)
                If (Left(rng(i, j).Formula, 1) = "=") Then
                   temp(i, j) = True
                Else
                   temp(i, j) = False
                End If
            Next j
        Next i
        isformula = temp()
    End Function
    
    {=SUM(IF(NOT(isformula(A1:A6)),A1:A6,0))}
    
    然后您可以在代码中使用它。比如:

    Public Function isformula(rng As Range) As Variant()
        Dim aryIn() As Variant
        Dim a As Variant
        Dim i As Integer, j As Integer
        Dim temp() As Variant
    
        aryIn = rng.Value
        ReDim temp(LBound(aryIn) To UBound(aryIn), _
                   LBound(aryIn, 2) To UBound(aryIn, 2))
        For i = LBound(aryIn) To UBound(aryIn)
            For j = LBound(aryIn, 2) To UBound(aryIn, 2)
                If (Left(rng(i, j).Formula, 1) = "=") Then
                   temp(i, j) = True
                Else
                   temp(i, j) = False
                End If
            Next j
        Next i
        isformula = temp()
    End Function
    
    {=SUM(IF(NOT(isformula(A1:A6)),A1:A6,0))}
    
    其中大括号{}表示数组公式(通过Ctrl-Shift-Enter输入)


    如果对所有函数都使用小计,则可以这样做。小计将忽略该范围内的任何其他小计函数。在A2中

    =SUBTOTAL(9,B1:B3)
    
    在A3中

    在A6中

    在A7中


    A7将是700(我想这就是你的意思)。如果您的公式不是小计中的选项,那么它将不起作用。

    如果您对所有函数都使用小计,您可以这样做。小计将忽略该范围内的任何其他小计函数。在A2中

    =SUBTOTAL(9,B1:B3)
    
    在A3中

    在A6中

    在A7中


    A7将是700(我想这就是你的意思)。如果您的公式不是小计中的选项,那么它将不起作用。

    您必须创建一个自定义项,然后按照Martin的建议使用它。您必须创建一个自定义项,然后按照Martin的建议使用它。如果其他人正在使用此方法,请确保在创建公式时按Ctrl-Shift-Enter键(而不仅仅是Shift-Enter键)的数组公式也可以使用带范围名称的XLM来执行此操作,这样解决方案就不仅仅是UDF了。谢谢。如果其他人正在使用此方法,请确保在创建公式时按Ctrl-Shift-Enter键的数组公式(而不仅仅是Shift-Enter键)也可以使用带范围名称的XLM来执行此操作,因此解决方案不仅仅是UDF。对,400+100+200等于700。我无法添加。:)对,400+100+200等于700。我无法添加。:)