【问题标题】:Excel Sumproduct from 2 tables with multiple matching criteria来自具有多个匹配条件的 2 个表的 Excel Sumproduct
【发布时间】:2018-04-29 20:33:31
【问题描述】:

我需要帮助,请,

我有 2 张表格:一张有员工在一个月内(1 月、2 月等)从事项目/提案的天数,另一个有员工费率。我需要多个匹配率和 1 月天数,其中两个表中的所有条件都相同,然后在类型:“项目”和“2018 年”时显示总和。我需要分别为每个月做这个总和,但如果我找到如何做一个,那么休息应该很简单:)[n/v] 意味着没有价值。

表一

年 |类型 |项目 |员工 |一月(天) |二月(天)

2018 |项目 |苹果 |约翰 N | 6 | 7

2018 |项目 |苹果 |亚历克斯 T | [n/v] | 8

2017 |提案 |香蕉 |蒂姆 C | 8 | [n/v]

2017 |提案 |香蕉 |塞纳我 | 9 | 6

2018 |项目 |猕猴桃 |约翰 N | [n/v] | 6

2018 |项目 |猕猴桃 |日元 T | 4 | 5

表 2

年 |类型 |项目 |员工 |评分

2018 |项目 |苹果 |约翰 N | 30

2018 |项目 |苹果 |亚历克斯 T | 40

2017 |提案 |香蕉 |蒂姆 C | 20

2017 |提案 |香蕉 |塞纳我 | 30

2018 |项目 |猕猴桃 |约翰 N | 10

2018 |项目 |猕猴桃 |日元 T | 40

如果我在同一个表中同时包含费率和天数,我可以使用 SUMPRODUCT() 执行此操作;

如果两列都在同一个表中,我使用的公式是:

=IFERROR(SUMPRODUCT(((Table[Year]= D2)(Table[Type]="Project")(Table[Jan]>0))*(Table[Rate]*表[一月])),"")

但有 2 个单独的表,它不会返回正确的值。

提前致谢

【问题讨论】:

  • 你有什么版本的 Excel?如果您使用的是 Excel 2013 或更高版本,则可能有比 SUMPRODUCT 更好的方法。
  • 谢谢@jeffreyweir,我在mac上使用excel 2011
  • 好的,我相信这排除了我的替代方法。

标签: excel excel-formula multiple-tables excel-match excel-tables


【解决方案1】:

我的第一反应是建议针对工作表编写 SQL 查询:

SELECT Table1.Year, Table1.Type, Table1.Project, Table1.Employee,
    SUM(Table1.[Jan(days)] * Table2.Rate) AS SumJan,
    SUM(Table1.[Feb(days)] * Table2.Rate) AS SumFeb,
    ...
FROM Table1
INNER JOIN Table2
    ON Table1.Year = Table2.Year
    AND Table1.Project = Table2.Project
    AND Table1.Employee = Table2.Employee
WHERE Table1.Year = 2018 AND Table1.Type = 'Project'
GROUP BY Table1.Year, Table1.Type, Table1.Project, Table1.Employee

但是,您使用的是 Mac,所以 using ADOCopyFromRecordset 不可用。也许这可以通过ODBC 和 Microsoft Query 实现。


或者,您可以将第二张工作表中的所有数据加载到Scripting.Dictionary 中(Mac 的替代品here 可用)。然后,您可以编写如下函数:

Option Explicit

Dim dict As Dictionary

Sub FillDictionary()
    Set dict = New Dictionary

    ' load dictionary from table 2
    Dim rows As Variant
    rows = Table2.Range("A2").CurrentRegion.value
    Dim row As Variant, key As String
    For Each row In rows
        'assuming the first row has the column headers, we don't want to include those in the dictionary
        If row(0) <> "Year" Then
            key = Join(Array(row(0), row(1), row(2), row(3)), "_")
            dict(key) = row(4)
        End If
    Next
End Sub

Function GetSumRate(Year As Integer, RowType As String, Project As String, Employee As String, Days As Integer)
    If dict Is Nothing Then FillDictionary

    Dim key As String
    key = Join(Array(Year, RowType, Project, Employee), "_")
    If dict.Exists(key) Then GetSumRate = dict(key) * Days
End Function

然后,您可以从工作表单元格调用该函数:

=GetSumRate(Table[Year], Table[Type], Table[Project], Table[Employee], Table[Jan])

【讨论】:

  • 谢谢,Zev,根据我有限的编程知识,这将限制添加到表中的新值,因为每次表中的新行我都必须创建一个新键和价值。因此,例如,如果我想添加 2019 年新年或新员工 X,我必须在字典中定义它们 - 是这样吗?
  • @Kev 您实际上并没有手动填写字典。这是FillDictionary sub 的一部分——每次运行它都应该从Table2 重新创建字典值(我没有编写实现;我现在就这样做)。因此,如果您向Table2 添加新行,然后重新运行FillDictionary,则字典将包含来自新行的信息。
  • @Kev 更新了 FillDictionary 的实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多