![](/img/trans.png)
[英]Excel VBA use operators <,>, >=, <= with doubles as function arguments
[英]How to use comparison operators in VBA Excel UDF arguments?
我如何編寫UDF以便它們接受參數中的比較運算符?
當你使用標准函數時,你會像這樣寫= countif(range; x) ,你會得到等於x的范圍內的單元格數。
在VBA中復制此函數看起來像這樣:
Function countifUDF(rng As Range, x As Integer)
count = 0
For Each cell in rng.Cells
If cell.Value = x Then
count = count + 1
Next cell
countifUDF = sum
End Function
使用標准函數時,您可以將比較運算符傳遞給函數,如this = countif(range;“<”&x) ,您將得到小於x的單元格數。
我怎么能在UDF中這樣做? 我的UDF as = countifUDF(范圍;“<”和x)產生#VALUE
解
Function countifUDF(rng As Range, x As String)
Dim arr() As String
Dim count As Integer
Dim i As Integer
' breaking down x character by character and puts in array
ReDim arr(Len(x) - 1)
For i = 1 To Len(x)
arr(i - 1) = Mid$(x, i, 1)
Next
' if the last character in x is not numeric i assume the user want to count matching strings
' Like allows the user to use wildcards, LCase makes the comparision case insensitive
If IsNumeric(arr(UBound(arr))) = False Then
x = LCase(x)
For Each cell In rng.Cells
If LCase(cell.Value) Like x Then
count = count + 1
End If
Next cell
' if the first char in x is numeric its pretty straight forward
ElseIf IsNumeric(arr(0)) = True Then
For Each cell In rng.Cells
If cell.Value = x Then
count = count + 1
End If
Next cell
' if the first character in x is < and the second is numeric less-than operator is used
ElseIf arr(0) = "<" And IsNumeric(arr(1)) = True Then
' removing < from x
x = Replace(x, "<", "")
For Each cell In rng.Cells
If cell.Value < x Then
count = count + 1
End If
Next cell
ElseIf arr(0) = ">" And IsNumeric(arr(1)) = True Then
x = Replace(x, ">", "")
For Each cell In rng.Cells
If cell.Value > x Then
count = count + 1
End If
Next cell
' if the first char is < and the second is > the is not operator is used
ElseIf arr(0) = "<" And arr(1) = ">" Then
x = Replace(x, "<", "")
x = Replace(x, ">", "")
For Each cell In rng.Cells
If cell.Value <> x Then
count = count + 1
End If
Next cell
ElseIf arr(0) = ">" And arr(1) = "=" Then
x = Replace(x, ">", "")
x = Replace(x, "=", "")
For Each cell In rng.Cells
If cell.Value >= x Then
count = count + 1
End If
Next cell
ElseIf arr(0) = "<" And arr(1) = "=" Then
x = Replace(x, "<", "")
x = Replace(x, "=", "")
For Each cell In rng.Cells
If cell.Value <= x Then
count = count + 1
End If
Next cell
End If
countifUDF = count
End Function
鑒於我得到的答案似乎在VBA中處理UDF中的比較運算符並不方便,如果我錯了請糾正我。 我的解決方案通過通配符支持數字和字符串。 起初我嘗試使用帶有&作為分隔符的Split方法。 外觀上VBA將'“>”&x'標識為'> x'為什么我必須按字符分割x並評估用戶鍵入的比較運算符類型。
讓UDF()將第二個參數視為String :
Function countifUDF(rng As Range, x As Variant) As Long
Dim cell As Range, Count As Long, CH As String, VL As Long
VL = Replace(Replace(x, ">", ""), "<", "")
CH = Left(CStr(x), 1)
Count = 0
If CH = ">" Then
For Each cell In rng.Cells
If cell.Value > VL Then
Count = Count + 1
End If
Next cell
ElseIf CH = "<" Then
For Each cell In rng.Cells
If cell.Value < VL Then
Count = Count + 1
End If
Next cell
Else
For Each cell In rng.Cells
If cell.Value = x Then
Count = Count + 1
End If
Next cell
End If
countifUDF = Count
End Function
在此示例中, CH
是第二個參數的第一個字符, VL
是第二個參數的數字部分。
嘗試這個:
Function countifUDF(rng As Range, x As Integer)
Dim cell As Range
Dim Count As Integer
Count = 0
For Each cell In rng.Cells
If cell.Value < x Then Count = Count + 1
Next cell
countifUDF = Count
End Function
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.