Excel VBA MinIfs с Array Slice - PullRequest
       1

Excel VBA MinIfs с Array Slice

0 голосов
/ 18 февраля 2020

Я пишу код, в котором я назначаю диапазон из таблицы в двумерный массив, а затем выполняю некоторые анализы с этим массивом. Массив имеет вариантный тип со столбцами 3, 4 и 5, содержащими имя элемента, дату и значение. Макет похож на следующий:

Column 3    Column 4    Column 5
Item A  01/09/1987  0
Item A  01/10/1987  0
Item A  01/11/1987  1455
Item A  01/12/1987  1863
Item A  01/01/1988  1882
Item A  01/02/1988  1890
Item A  01/03/1988  0
Item A  01/04/1988  0
Item A  01/05/1988  0
Item B  01/09/1987  0
Item B  01/10/1987  2041
Item B  01/11/1987  1130
Item B  01/12/1987  1452
Item B  01/01/1988  1863
Item B  01/02/1988  1683
Item B  01/03/1988  1605
Item B  01/04/1988  1614
Item B  01/05/1988  1544

Затем я создаю временный массив (глобальный массив намного превышает предел в 65 тыс. Элементов для нужных мне функций), назначая соответствующие даты и значения для одного Предмет за один раз. Затем я пытаюсь использовать функцию Minifs следующим образом:

KPIMat(jCount, 3) = Application.WorksheetFunction.MinIfs( _
    Application.WorksheetFunction.Index(TempArr1, 0, 4), _
    Application.WorksheetFunction.Index(TempArr1, 0, 5), _
    ">0")

KPIMat - это массив для хранения данных KPI. Когда я запускаю код, я получаю сообщение об ошибке Run-Time 424, Object Required. Я думаю, что это связано с тем, что функция Minifs ожидает диапазон, и я передаю одномерный массив. Если так, кто-нибудь сталкивался с этой проблемой раньше? Я пытался найти решение на основе кода, кроме написания собственного UDF для решения этой проблемы.

Заранее благодарен за помощь

1 Ответ

0 голосов
/ 18 февраля 2020

Как вы обнаружили, MINIFS хочет диапазон, а не массив.

Просто выполните итерацию массива самостоятельно и используйте переменную temp:

Dim minTemp As double
minTemp = 1E+99

Dim i As Long
For i = LBound(TempArr1, 1) To UBound(TempArr1,1)
    If temparr(i, 5) > 0 And temparr(i, 4) < minTemp Then
        minTemp = temparr(i, 4)
    End If
Next i

KPIMat(jCount, 3) = minTemp
...