Найти MAX в диапазоне столбцов, игнорируя значения ошибок, используя синтаксис оценки - PullRequest
2 голосов
/ 16 октября 2019

Я определил диапазон под названием Rng. Columns(2) из Rng содержит числа и значения ошибок # Н / Д. Я хочу найти значение MAX в этом столбце, а затем сравнить, если оно равно >0.

Col A    Col B
--------------
ansdlsd  1
sdlsds   1
lgdfkf   2
fdlksd   2
sdlsdks  3
sds sds  5
sdlkjq   #N/A
eowmf    #N/A
pwpwo    #N/A
qwdds    #N/A
ospw     #N/A
dlsls    #N/A
qpdmf    #N/A

. Я попытался использовать сокращенный синтаксис для Application.Evaluate, то есть [], но код возвращает типОшибка несовпадения 13 - (Ошибка 2029 в окне просмотра).

If [MAX(IF(NOT(ISNA(Rng.Columns(2))),Rng.Columns(2)))] > 0 Then
    do something...
End If

Я также пытался:

If Application.Aggregate(4, 6, Rng.Columns(2), 1) > 0 Then...

получил ошибку : Error 2015 : Variant/Error.

enter image description here

Я могу получить МАКС, используя Excel Array Formula (Ctrl+Shft+Entr) на рабочем листе:

{=MAX(IF(NOT(ISNA(B2:B14)),B2:B14))}

Я полагаю, это связано с тем, что Rng.Columns(2) неправильно вычислено в скобках [].

Или что-то еще является причиной этой ошибки?

Ответы [ 2 ]

4 голосов
/ 16 октября 2019

Попробуйте:

Sub GetMax()

Dim rng As Range, lr As Long
With Sheet1 'Change accordingly
    lr = .Cells(.Rows.Count, "A").End(xlUp).Row
    Set rng = .Range("A1:B" & lr)
    If Application.Aggregate(4, 6, rng.columns(2)) > 0 Then
        Debug.Print "Max is higher than 0"
    Else
        Debug.Print "Max is not higher than 0"
    End If
End With

End Sub

Если вы хотите использовать .Evaluate, вы можете изменить эту строку: If Application.Aggregate(4, 6, rng.columns(2)) > 0 Then, для этого: If .Evaluate("AGGREGATE(4,6," & rng.Columns(2).Address & ")") > 0 Then

Причина, по которой это работаетчто мы можем использовать MAX в функции AGGREGATE и сказать ей игнорировать значения ошибок.


Почему ваши попытки не увенчались успехом:

Причина, по которой ваша попытка с [] не удалась, заключается в том, что вы не можете использовать эти скобки для вычисления формулы с переменными. Вам нужно будет использовать Application.Evaluate. Во-вторых, вам нужно будет кормить формулу реальным адресом. Я реализовал версию .Evaluate в своем ответе выше.

Причина, по которой ваша попытка с AGGREGATE вызвала ошибку, заключается в том, что вам нужно было опустить последний параметр в функции MAX функции AGGREGATE,Если вы попробуете это на листе, это также вызовет ошибку #VALUE. Вам просто не нужно вводить порядковый номер, поскольку MAX, как следует из названия, возвращает только одно значение.

2 голосов
/ 16 октября 2019

для тех, кто имеет старую версию MS Excel (<2010), которая не поддерживает <code>AGGREGATE Функция листа:

Sub GetMax_oldstyle()
    Dim rng$, lr As Long
    With Sheet1 'Change accordingly
        lr = .Cells(.Rows.Count, "A").End(xlUp).Row
        rng = .Range("A1:B" & lr).Columns(2).Address(0, 0)
        If .Evaluate("MAX(IF(NOT(ISNA(" & rng & "))," & rng & "))") > 0 Then
            Debug.Print "Max is higher than 0"
        Else
            Debug.Print "Max is not higher than 0"
        End If
    End With
End Sub

тест:

enter image description here

...