[英]Excel VBA WorksheetFunction in custom function (not sub)
據我所知,Excel不會讓您在vba函數中使用WorksheetFunctions(不是SUB或SUBROUTINE)。 是否可以在FUNCTION中使用WorksheetFunctions? 如果不是,是否有簡單的替代方法可以獲得與COUNTA函數相同的結果? 有誰知道為什么WorksheetFunctions似乎不能與自定義函數相處?
Function CountIfsFast(range1 As range, val1, Optional range2 As range, Optional val2)
rangesize = WorksheetFunction.CountA(range1)
range1array = RangetoArray(range1)
range2array = RangetoArray(range2)
matchcount = 0
For i = 0 To rangesize
If range1array(i) = val1 Then
If range2array(i) = val2 Then
matchcount = matchcount + 1
End If
End If
Next i
CountIfsFast = matchcount
End Function
更新:我發現了問題所在。 請參閱下面的答案。
此“自定義”函數返回的值與內置CountA函數相同(至少在2007年)。 您必須在傳遞函數的范圍內提供一些詳細信息,以幫助我們進行調試。
Function counta2(rng As Range)
Dim i As Integer
i = Application.WorksheetFunction.CountA(rng)
counta2 = i
End Function
您可以像這樣使用它:= counta2(C1:C8)
這也適用於我:(Excel 2010)
Public Function fubu(range1 As Range) As Variant
Dim rangesize As Variant
rangesize = WorksheetFunction.CountA(range1)
fubu = rangesize
End Function
嘗試按字面意義進行剪切和粘貼:絕對不要更改,然后從圖紙公式中調用它。
我必須對其進行修改,以擺脫不包含的RangeToArray
函數。 請注意,我更改了,以指定其返回值As Long
的數據類型。 我還聲明了特定數據類型的變量。 這將是一個開始的好習慣:)
Function CountIfsFast(range1 As Range, val1, Optional range2 As Range, Optional val2) As Long
Dim range1Array As Variant
Dim range2Array As Variant
Dim rangeSize As Long
Dim matchCount As Long
Dim i as Long
rangeSize = WorksheetFunction.CountA(range1)
range1Array = range1
range2Array = range2
matchCount = 0
For i = 1 To rangeSize
If range1Array(i, 1) = val1 Then
If range2Array(i, 1) = val2 Then
matchCount = matchCount + 1
End If
End If
Next i
CountIfsFast = matchCount
End Function
我發現了問題所在。 我認為這是對函數的限制,因為就我而言,我可以在子例程中使用WorksheetFunctions,但不能在函數中使用。 事實證明,這與它無關。 進一步研究50290錯誤,我在另一個論壇上偶然發現了這個錯誤:
“我碰到了這個-它是一個Microsoft錯誤。您需要在您的一種表單上或其任何內容(按鈕,圖片,標簽等)上找到有問題的對象並將其刪除。”
我做了一些實驗,發現我的函數集合中的某件事導致當我調用WorksheetFunctions時Excel表現異常。 為了使它們重新工作,我必須完全關閉Excel並啟動一個新的工作簿。 當我這樣做時,WorksheetFunctions可以正常工作。 奇怪。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.