Подстановка для MAXIFS без формулы массива - PullRequest
1 голос
/ 30 апреля 2019

После завершения запроса я вставляю следующую формулу в лист с данными запроса, используя приведенный ниже код vba. Все отлично работает в Excel Office365, но если автономная версия Excel 2016 года, формула завершится неудачно с ошибкой #NAME, так как эта функция недоступна в этой версии. У меня есть некоторые пользователи, которые застряли с ним.

Я знаю, что массив формул мог бы заменить это, но я не уверен, как это сделать и вставить его с кодом, а также то, какая самая эффективная формула может заменить эту.

 =IF(OR(ISERROR(MAXIFS(Consumed!D:D,Consumed!B:B,A2)),
MAXIFS(Consumed!D:D,Consumed!B:B,A2)=0),"",
MAXIFS(Consumed!D:D,Consumed!B:B,A2))

Любая помощь приветствуется.

strInsertFormula = "=IF(OR(ISERROR(MAXIFS(Consumed!D:D,Consumed!B:B,A2)),MAXIFS(Consumed!D:D,Consumed!B:B,A2)=0),"""",MAXIFS(Consumed!D:D,Consumed!B:B,A2))"

With Sheet3

 .Range("Individual_Bottles").Columns(.Range("EndRng").Offset(0, 1).Column).Insert Shift:=xlToRight
 .Range("EndRng").Offset(-1, 1).Cells(1, 1).Value = "Last Drank"
 .Range("EndRng").Offset(0, 1).Formula = strInsertFormula
 .Range("EndRng").Offset(0, 1).NumberFormat = "yy/mm/dd" 

End With

Ответы [ 2 ]

0 голосов
/ 06 мая 2019

@ JohnF Ну, все заработало благодаря Джону Ф. Я ожидал, что мне придется использовать цикл, но надеялся, что нет.В конце концов я это сделал, так как считаю, что метод FillDown требует выбора диапазона, и я не хотел этого делать.Вот окончательный код

        ii = .Range("EndRng").rows.Count
        ConsRows = Consumed.Range("Consumed").rows.Count

        For i = 1 To ii
            strInsertFormula = "=IF(IFERROR(MAX(IF(Consumed!B1:B" & ConsRows & "=" & _
                .Range("A1").Offset(i, 0).Address & _
                ",Consumed!D1:D" & ConsRows & ","""")),0)>0,MAX(IF(Consumed!B1:B" & ConsRows & "=" & _
                .Range("A1").Offset(i, 0).Address & _
                ",Consumed!D1:D" & ConsRows & ","""")),"""")"

            .Range("EndRng").Offset(0, 1).Cells(i, 1).FormulaArray = strInsertFormula
        Next
    End If
0 голосов
/ 30 апреля 2019

Вы можете использовать формулу массива Excel =MAX(IF(B:B=A2,D:D,"")), чтобы найти условный максимум (вы можете добавить дополнительные проверки ошибок и т. Д. Вокруг этого). Это будет работать во всех версиях с 2016 года и ранее.

Если вы введете это в ячейку, вам нужно нажать обычные клавиши Crtl + Shift + Enter (известные как CSE).

Если вы хотите ввести эту формулу массива с помощью кода, вам нужно установить свойство FormulaArray диапазона выше, а не свойство Formula. Таким образом, ваш код должен читать:

.Range("EndRng").Offset(0, 1).FormulaArray = strInsertFormula

, где strInsertFormula - формула массива, о которой я упоминал выше.

...