Application.worksheetfunction.sumif с внутренними массивами в качестве аргумента - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь создать подпрограмму, которая проверяет определенное условие в списке клиентов, выделяет записи, которые соответствуют условию, а затем усредняет оставшиеся записи для каждого имени.Это похоже на создание сводной таблицы с VBA.Я не хотел использовать сводную таблицу, поскольку запись данных на новый лист, обновление и выполнение каких-либо действий с ним добавляет ненужную нагрузку на скорость работы инструмента.Кроме того, все массивы должны храниться в коде, а не записываться на листах.Я почти закончил с кодом, но он дает мне ошибку в самом конце, где я использую условие sumif. Уточнение: Аргумент «Number» - это глобальная переменная, объявленная в главном инструменте, которая определяется количеством имен в основном списке, который находится на листе 5.Надеюсь, что этот код говорит сам за себя. То, что я получаю во время выполнения кода, это ошибка- Ошибка времени выполнения '1004': сбой метода 'Range' объекта '_Global' на линии TaskArray(k, 1) = Application.WorksheetFunction.SumIf(Range(Names), NewList(k), Range(ParameterB))

Код -

Sub Task()

Dim Names() As Variant                                                 'Declare Names 
ReDim Names(0 To Number) As Variant                               'Declare Names as a vector
Dim ParameterA() As Variant                                           'Declare Parameter A
ReDim ParameterA(0 To Number) As Variant                         'Declare Parameter A as a vector
Dim ParameterB() As Variant                                           'Declare Parameter B
ReDim ParameterB(0 To Number) As Variant                         'Declare Parameter B as a vector


Dim i As Integer

For i = 1 To Number

Select Case Sheet5.Range("BO" & i + 1) - Sheet5.Range("BN" & i + 1)
Case 0
Names(i) = ""
ParameterA(i) = Sheet5.Range("BN" & i + 1) - Sheet5.Range("BL" & i + 1)
ParameterB(i) = ""
Case Else
Names(i) = Sheet5.Range("F" & i + 1)
ParameterA(i) = Sheet5.Range("BN" & i + 1) - Sheet5.Range("BL" & i + 1)
ParameterB(i) = Sheet5.Range("BO" & i + 1) - Sheet5.Range("BN" & i + 1)
End Select

Next i


Sheet3.Range("T159") = Application.WorksheetFunction.Sum(ParameterA())        'Write the total of Parameter A
Sheet3.Range("T160") = Application.WorksheetFunction.Sum(ParameterB())        'Write the total of Parameter B
'________________________ To isolate the list of Names (Unique) with existent Parameter B 
Dim NewList() As Variant

Dim j As Long
Dim d As Scripting.Dictionary
Set d = New Scripting.Dictionary
With d
    For j = LBound(Names) To UBound(Names)
        If IsMissing(Names(j)) = False Then
            .item(Names(j)) = 1
        End If
    Next
    NewList = .Keys
End With
'________________________To create an array of sums of Parameter B
For k = 1 To Application.WorksheetFunction.CountA(NewList) - 1
Dim TaskArray() As Variant
ReDim TaskArray(1 To k, 0 To 1) As Variant
ReDim Names(0 To Number) As Variant
ReDim ParameterB(0 To Number) As Variant
TaskArray(k, 0) = NewList(k)
TaskArray(k, 1) = Application.WorksheetFunction.SumIf(Range(Names), NewList(k), Range(ParameterB))
Sheet19.Range("H" & k + 1) = TaskArray(k, 0)
Sheet19.Range("I" & k + 1) = TaskArray(k, 1)
Next k

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...