Excel Sumproduct из 2 таблиц с несколькими критериями соответствия - PullRequest
0 голосов
/ 29 апреля 2018

Мне нужна помощь, пожалуйста,

У меня есть 2 таблицы: в одной есть дни, когда сотрудник работал над проектом / предложением в месяце (январь, февраль и т. Д.), А в другой - ставки сотрудников. Мне нужно сделать несколько подходящих ставок и количество дней в январе, когда все критерии одинаковы в обеих таблицах, а затем показать суммы, если Тип: "Проект" и Год "2018". Мне нужно сделать эту сумму для каждого месяца отдельно, но если я найду, как это сделать для одного, тогда отдых должен быть простым:) [n / v] означает отсутствие значения.

Таблица 1

Год | Тип | Проект | Сотрудник | Янв (дней) | Февраль (дней)

2018 | Проект | Яблоко | Джон Н | 6 | 7

2018 | Проект | Яблоко | Алекс Т | [n / v] | 8

2017 | Предложение | Банан | Тим С | 8 | [n / v]

2017 | Предложение | Банан | Сена я | 9 | 6

2018 | Проект | Киви | Джон Н | [n / v] | 6

2018 | Проект | Киви | Йен Т | 4 | 5

Таблица 2

год | Тип | Проект | Сотрудник | Оценить

2018 | Проект | Яблоко | Джон Н | 30

2018 | Проект | Яблоко | Алекс Т | 40

2017 | Предложение | Банан | Тим С | 20

2017 | Предложение | Банан | Сена я | 30

2018 | Проект | Киви | Джон Н | 10

2018 | Проект | Киви | Йен Т | 40

Я могу сделать это с помощью SUMPRODUCT (), если в одной таблице указаны как ставки, так и дни;

Формула, которую я использовал, если оба столбца находятся в одной и той же таблице:

= IFERROR (SUMPRODUCT (((Таблица [Год] = D2) (Таблица [Тип] = "Проект") (Таблица [Янв>> 0)) * (Таблица [Скорость] * Таблица [Янв])), "")

, но с двумя отдельными таблицами он не возвращает правильное значение.

Заранее спасибо

1 Ответ

0 голосов
/ 30 апреля 2018

Моим первым побуждением было бы предложить написать запрос 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])
...