0

我需要帮助,请

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

表格1

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

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]*Table[Jan]) ),"")

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

提前致谢

4

1 回答 1

0

我的第一反应是建议针对工作表编写 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 上,所以使用 ADO并被CopyFromRecordset淘汰。也许这可以通过ODBC和 Microsoft Query 实现。


或者,您可以将第二张表中的所有数据加载到一个Scripting.Dictionary(Mac 的替代品可在此处获得)。然后,您可以编写一个类似这样的函数:

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])
于 2018-04-29T22:46:35.560 回答