SUMIFS с несколькими листами / несколькими критериями - PullRequest
0 голосов
/ 25 октября 2018

У меня есть функция SUMIFS.Я хочу перевести эту функцию в код VBA, но не могу заставить ее работать.

Два изображения моего файла Excel показывают упрощенный пример.

enter image description here

enter image description here

У меня есть вкладка для ввода информации о нескольких продуктах, которые были куплены и проданы в разные даты.Названия продуктов показаны под ISIN.Я хочу суммировать количества из входного листа в выходной лист по определенным критериям.

У меня есть следующие аргументы, которые должны быть выполнены:

Dim Arg1 As Range 'the range i want to sum : so quantity

Dim Arg2 As Range 'criteria for range : Dates
Dim Arg3 As Range 'the criteria (range)

Dim Arg4 As Range 'criteria for range : ISIN
Dim Arg5 As Range 'the criteria (range)

Dim Arg6 As Range 'criteria for range : Type
Dim Arg7 As Range 'the criteria (range)

Set Arg1 = ThisWB.Sheets("INPUT").Range("A1:A13")

Set Arg2 = ThisWB.Sheets("INPUT").Range("B1:B13")
Set Arg3 = ThisWB.Sheets("OUTPUT").Range("A4:A8")

Set Arg4 = ThisWB.Sheets("INPUT").Range("C1:C13")

'these are rows (so ISIN codes vertically)
Set Arg5 = ThisWB.Sheets("OUTPUT").Range("B2:E2")

Set Arg6 = ThisWB.Sheets("INPUT").Range("D1:D13")

'This is the criteria that only values under Buy should be summed
Set Arg7 = ThisWB.Sheets("OUTPUT").Range("B2")

Я хочу суммировать количества, согласно коду ISIN / продукту в выходном файле.

Результаты должны быть показаны в красной рамке на выходном листе.

Это должно произойти, если даты и задачи «Купить» соответствуют значениям, отображаемым в выходном файле

Я не знаю, как правильно затемнять и устанавливать переменные правильно.Я также не знаю, как код будет выполнять все даты и коды ISIN, отображаемые в выходном файле.

Это код, который у меня есть для моего настоящего листа Excel.Не для упрощенной версии, которую я показал раньше.

Option Explicit

Sub InsertQ()
'Sum Quantities

    'Declare variables
    Dim lastRowData, lastRowInput, I, x, pasteRow As Integer

    Dim shtInput As Worksheet
    Dim shtData As Worksheet

    Dim Arg1 As Range 'the range i want to sum : so quantity

    Dim Arg2 As Range 'criteria for range : Dates
    Dim Arg3 As Range 'the criteria (range)

    Dim Arg4 As Range 'criteria for range : ISIN
    Dim Arg5 As Range 'the criteria (range)

    Dim Arg6 As Range 'criteria for range : Type
    Dim Arg7 As Range 'the criteria (range)

    'Set variables
    Set shtData = Sheets("OUTPUT")
    Set shtInput = Sheets("INPUT")
    lastRowData = shtData.Range("B4").End(xlDown).Row
    lastRowInput = shtInput.Range("A1").End(xlDown).Row
    pasteRow = 5

    Set Arg1 = shtInput.Range("G1:G1048576")

    Set Arg2 = shtInput.Range("J1:J1048576")
    Set Arg3 = shtData.Range("A4:A20")

    Set Arg4 = shtInput.Range("AF1:AF1048576")
    Set Arg5 = shtData.Range("B2:E2")

    Set Arg6 = shtInput.Range("E1:E1048576")
    Set Arg7 = shtData.Range("A2")

    'Deactivate Screen for purpose of performance
    Application.ScreenUpdating = False

    'Code

    For I = 2 To lastRowData
        For x = 2 To lastRowInput
        shtData.Cells(x, I) = _
          Application.WorksheetFunction.SumIfs(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7)
        Next x

        pasteRow = pasteRow + 1

    Next I

    'Formatting
    lastRowData = shtData.Range("B4").End(xlDown).Row
    shtData.Range("B4:XFD" & lastRowData).NumberFormat = "0.00"
    shtData.Range("E5:E" & lastRowData).NumberFormat = "0.00"

    'Confirm to user
    Application.ScreenUpdating = True

    shtData.Range("A1").Select

End Sub

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Это было бы хорошим заданием для сводной таблицы.Предположим, что следующие данные… enter image description here

Результатом этого будет… enter image description here Прошу прощения за скриншот из Германии

  1. Выберите все данные на входном листе.
  2. Вставьте сводную таблицу (выберите Вставить ›Сводную таблицу на ленте)
  3. Затем настройте Сводную
    • Добавить TypeФильтровать
    • Добавить ISIN в столбцы
    • Добавить Dates в строки
    • Добавить Quantity в значения
  4. Выберите Buy как тип в ячейке B2 и готово.
0 голосов
/ 25 октября 2018

Таким образом, с помощью VBA в функции сборки Application.WorksheetFunction.SumIfs() можно достичь желаемого.Я полагаю, что это не самый быстрый способ выполнения SUMIFS, но это копия функции excel "=SUMIFS()".

По моему мнению, примечание состоит в том, что значения критериев могут быть только одним единственным значением(не диапазон) при каждом размещении критериев ... поэтому нам нужно пройтись по каждому значению критерия (Критерии1 и критерии2), поскольку в приложении SUMIFS должно быть только одно значение.Это делается в VBA с помощью цикла "For each .. In ...".

Application.WorksheetFunction.SumIfs(Sum_range, Criteria_range1, Criteria1, Criteria_range2, criteria2, etc..)

Рабочий лист "Ввод":

enter image description here

Рабочий список "Вывод »:

enter image description here

Код копирует правую таблицу на листе« Вывод »на рисунке выше.Мы используем некоторые диапазоны из другой таблицы «Ввод» и некоторые из этой таблицы «Вывод», где мы хотим получить результат. (Обратите внимание, что в Excel вы можете использовать диапазоны для критериев1, в VBA это невозможно.)

Цвет - это диапазоны = sumifs, которые мы используем на листах.Они воспроизведены в коде.

Код VBA:

Option Explicit
Sub Sumifs()

Dim InputSheet As Worksheet
Dim OutputSheet As Worksheet

Set InputSheet = ActiveWorkbook.Worksheets("Input")
Set OutputSheet = ActiveWorkbook.Worksheets("Output")

Dim Arg1 As Range 'the range i want to sum : so quantity

Dim Arg2 As Range 'criteria for range : Dates
Dim Arg3 As Variant 'the criteria (range)

Dim Arg4 As Range 'criteria for range : ISIN
Dim Arg5 As Variant 'the criteria (range)

Dim Arg6 As Range 'criteria for range : Type
Dim Arg7 As Variant 'the criteria (range)

Set Arg1 = InputSheet.Range("A2:A14") 'Sum_range

Set Arg2 = InputSheet.Range("B2:B14") 'Criteria_range1
Set Arg3 = OutputSheet.Range("A3:A7") 'Criteria1

Set Arg4 = InputSheet.Range("C2:C14") 'Criteria_range2
Set Arg5 = OutputSheet.Range("C2:F2") 'Criteria2 - these are rows (so ISIN codes vertically)

Set Arg6 = InputSheet.Range("D2:D14") 'Criteria_range3
Set Arg7 = OutputSheet.Range("B1")    'Criteria3 - This is the criteria that only values under Buy should be summed


Dim cell_date As Variant
Dim cell_ISIN As Variant
Dim cell_Type As Variant
Dim cell_ISIN_column As Long
Dim cell_date_row As Long

For Each cell_ISIN In Arg5 'Loop through all ISIN codes in range setin Arg 5
    cell_ISIN_column = cell_ISIN.Column 'Get current column for ISIN
    For Each cell_date In Arg3 'Loop through all Dates in range set in Arg3
        cell_date_row = cell_date.Row 'Get current row for date
                'My understanding is that the criteria values can only be only one single value at each criteria... therefore we need to loop through each criteria value (Arg3 and Arg5 needs to have only one value in SUMIFS application).
                OutputSheet.Cells(cell_date_row, cell_ISIN_column) = Application.WorksheetFunction.Sumifs(Arg1, Arg2, cell_date, Arg4, cell_ISIN, Arg6, Arg7)
    Next cell_date 'go to next date
Next cell_ISIN 'go to next ISIN

End Sub

Благодарность D_Bester в SO, и больше вдохновения / объяснений можно найти здесь в егонить:)

0 голосов
/ 25 октября 2018

Здесь нет необходимости в VBA.Вы можете сделать это с помощью простой формулы.

Скопируйте в свой красный диапазон следующее:

=SUMIFS(INPUT!$A:$A,INPUT!$B:$B,OUTPUT!$A:$A,INPUT!$C:$C,OUTPUT!$2:$2,INPUT!$D:$D,OUTPUT!$B$1)

или напишите это автоматически с помощью VBA:

Option Explicit

Sub WriteFormula()
    With Worksheets("OUTPUT")
        With .Range("C4", .Cells(.Cells(.Rows.Count, "A").End(xlUp).Row, .Cells(2, .Columns.Count).End(xlToLeft).Column))
            .Formula = "=SUMIFS(INPUT!$A:$A,INPUT!$B:$B,OUTPUT!$A:$A,INPUT!$C:$C,OUTPUT!$2:$2,INPUT!$D:$D,OUTPUT!$B$1)"
            'if needed as values not forumlas uncomment the following line
            '.Value = .Value
        End With
    End With
End Sub
...