【问题标题】:VBA Sum If With Multiple CriteriaVBA求和如果有多个条件
【发布时间】:2013-12-05 19:18:19
【问题描述】:

我想知道是否有人可以帮助我。

大约一个星期以来,我一直在尝试整理一张表格,其中包含基于多个标准的“SumIf”公式。

我已经能够做到这一点,在单元格区域中手动输入具有所需结果的公式。

我遇到的问题确实有两个方面。

  • 我使用的公式是数组公式,但我的一些用户的技能水平可能没有我希望的那么好,所以我知道他们自己无法应对添加公式,所以我查看了可选择使用 VB 代码,
  • 这个问题是,我知道你不能在 VB 中使用数组公式,所以我有点不确定如何继续。

为了更好地说明这一点,我附上了一个文件here,显示了我想要实现的目标。

  • 在工作表“幻灯片 5”上,我想提取结果 橙色阴影列,
  • 对于每个单元格,我想执行以下“SumIf”:

    1. 对指定范围内的数字求和“Actuals”
    2. 如果命名范围“JRole”中的值与
      “Slide 5”的第6行中的值相同> 工作表,
    3. 命名范围“Months”中的值与
      单元格B3中的值相同 “幻灯片 5” 工作表,
    4. 命名范围 “PLOB” 中的值与 “幻灯片 5”
      K 列 单元格中的值相同
      工作表。

正如我所说,我已经为此工作了一段时间,但我就是想不出一个解决方案。

我只是想知道是否有人可以看看这个并就我如何能够实现这一点提供一些指导。

非常感谢和亲切的问候

【问题讨论】:

  • 如果您需要确切的解决方案,请使用 Sumproduct(),如果您需要,我可以发布...

标签: vba excel excel-2003


【解决方案1】:

如果您想运行 Sub 来填充橙色字段,那么我的代码将为您填写数据

Option Explicit

Sub GetSolution()

    ' declaring a variable of Worksheet type for easier reference
    ' instead of saying: Sheets("All Data") you can use a shorter
    ' variable name: "data"
    Dim data As Worksheet
    Set data = Sheets("All Data")

    Dim result As Worksheet
    Set result = Sheets("Slide 5")

    ' these two variables hold the SUM for both analyst types
    ' in the loops flow
    Dim seniorAnalystSum As Double
    Dim analystSum As Double

    ' using resource and projectLob Range objects for quick reference to cells
    ' in both spreadsheets
    ' so again, instead of saying data.Range("A" & i) etc
    ' simple and short way is "resource" and/or "projectLob"
    Dim resource As Range
    Dim projectLob As Range

    ' for each cell in between K8:K16 on the result/ Sheets("Slide 5")
    ' pick up one cell at a time
    For Each resource In result.Range("K8:K16")
        ' and go over all cells between B5 and last cell in Data sheet
        For Each projectLob In data.Range("B5:B" & data.Range("B" & Rows.Count).End(xlUp).Row)
            If projectLob = resource Then
                ' compare year and month between the matching cells
                If (Month(projectLob.Offset(0, 8)) = Month(result.Range("B3"))) And _
                (Year(projectLob.Offset(0, 8)) = Year(result.Range("B3"))) Then
                    ' compare to the row of the table that holds the type of analyst
                    If projectLob.Offset(0, 7) = result.Range("L6") Then
                        'C&R Senior Analyst
                        seniorAnalystSum = seniorAnalystSum + projectLob.Offset(0, 12)
                    ElseIf projectLob.Offset(0, 7) = result.Range("N6") Then
                        'C&R Analyst
                        analystSum = analystSum + projectLob.Offset(0, 12)
                    End If
                End If
            End If
        Next
        ' Assigns the sum for the senior analyst
        resource.Offset(0, 2) = seniorAnalystSum
        ' assigns the sum for normal analyst
        resource.Offset(0, 4) = analystSum
        ' reset both sums for the next loop
        seniorAnalystSum = 0
        analystSum = 0
    Next

End Sub

我使用了您的示例数据并填充了如下结果

我希望这是您正在寻找的解决方案 :) 等待您的反馈

【讨论】:

  • 嗨@mehow,非常感谢您花时间回复我的帖子并提供解决方案。它工作得很好,这正是我所追求的。请问一下,因为我非常渴望了解更多关于您在代码中添加一些 cmets 的信息。非常感谢和亲切的问候。
  • @IRHM 当然,我添加了一些 cmets。请注意,您可以使用 F9 在代码中添加断点并单步执行,然后您将能够更好地可视化正在发生的事情
  • 嗨@mehow,非常感谢你。非常感谢它。我现在已经授予你赏金了。所有最好的和亲切的问候。
  • @IRHM 没问题!亲爱的,我在 SO 上的第一个赏金 :)
  • 好吧@mehow,这是当之无愧的!
【解决方案2】:

SLIDE5 COLUMN M中使用以下公式

=SUMPRODUCT(('All Data'!$I$5:$I$40='Slide 5'!$L$6:$M$6)*('All Data'!$J$5:$J$40='Slide 5'!$B$3)*('All Data'!$B$5:$B$40='Slide 5'!$K8)*('All Data'!$N$5:$N$40))

SLIDE5 COLUMN O 使用这个

=SUMPRODUCT(('All Data'!$I$5:$I$40='Slide 5'!$L$6:$M$6)*('All Data'!$J$5:$J$40='Slide 5'!$B$3)*('All Data'!$B$5:$B$40='Slide 5'!$K8)*('All Data'!$N$5:$N$40))

只需将公式拖到后续行中

【讨论】:

  • 嗨@Youbaraj Sharma,感谢您抽出宝贵时间回复我的帖子。不幸的是,正如我所说,虽然我很乐意输入公式,但此电子表格的有些用户不会,这就是我一直在寻找自动化 VB 解决方案的原因。
  • 那么您在寻找 vba 解决方案吗?这也可以轻松完成。但在更简单的方面,您可以保存此表并保护公式,以便其他用户可以在主表中输入值并且公式会自动填充......他们不必每次都输入公式。 VBA 也只能在这个程度上帮助你......
  • 嗨@Youbaraj Sharma。谢谢你回来找我,我很感激你的时间和麻烦。是的,我可以确认我正在寻找一个 VB 解决方案,如果可能的话,因为这将构成我已经编写的更大的 VB 脚本的一部分。用户不需要在工作簿中输入任何内容,因为我的目标是自动化整个过程。非常感谢和亲切的问候
  • 刚刚看到这些cmets。如果没有用户可以弄乱您的数据,您为什么不在 VBA 编码和 Excel 本机函数的值/结果之间进行游戏(应用于单元格值)?我经常这样做(通常在隐藏的工作表中),因为这可以缩短整个过程。 VBA 非常擅长这种方法,不像在编程中需要在代码中保存所有的调光/变量。在 Excel 中,您可以将它们放下(在单元格中)应用基本功能,然后在代码中重新拾取它们。
  • @YoubarajSharma 列的公式无法正常工作 - 它仅在 O12 中显示 0.26,这是错误的 - 请参阅 my answer 以获取正确的值
【解决方案3】:

快速而肮脏的解决方案

1 - 使用 evaluate 运算符获得预期结果

Evaluate('SUMPRODUCT(
   ('All Data'!$I$5:$I$40='Slide 5'!$L$6:$M$6)
   *('All Data'!$J$5:$J$40='Slide 5'!$B$3)
   *('All Data'!$B$5:$B$40='Slide 5'!$K8)
   *('All Data'!$N$5:$N$40))'
)

2 - 使用替换 SUMPRODUCT wokrksheet 函数的 Application.WorksheetFunction.Sumproduct 函数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    相关资源
    最近更新 更多