Я пытаюсь создать подпрограмму, которая проверяет определенное условие в списке клиентов, выделяет записи, которые соответствуют условию, а затем усредняет оставшиеся записи для каждого имени.Это похоже на создание сводной таблицы с 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