[英]Excel VBA: How to find max/min of a range while ignoring error cells
[英]Find MAX in Column Range ignoring Error values using Evaluate Syntax
我已經定義了一個名為Rng
的范圍。 Rng
的Columns(2)
包含數字和 #N/A 錯誤值。 我想在此列中找到 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
。
我可以在工作表中使用 Excel Array Formula (Ctrl+Shft+Entr)
獲得 MAX:
{=MAX(IF(NOT(ISNA(B2:B14)),B2:B14))}
我想這與Rng.Columns(2)
沒有被[]
括號正確評估有關。
還是其他原因導致此錯誤?
嘗試這個:
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
這樣做的原因是我們可以在AGGREGATE
function 中使用MAX
並告訴它忽略錯誤值。
為什么您的嘗試沒有成功:
您嘗試[]
失敗的原因是您不能使用這些括號來評估帶有變量的公式。 您需要實際使用Application.Evaluate
。 其次,您需要為公式提供實際地址。 我在上面的答案中實現了.Evaluate
版本。
您嘗試使用AGGREGATE
引發錯誤的原因是您需要省略AGGREGATE
的MAX
function 中的最后一個參數。 如果您要在工作表上嘗試它,它也會引發#VALUE
錯誤。 您根本不需要輸入索引號,因為MAX
顧名思義,只返回一個值。
對於那些擁有不支持AGGREGATE
工作表功能的舊 ms excel 版本(<2010)的人:
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
測試:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.