2013-05-06 55 views
1

據我所知,Excel不會讓你在vba函數(不是SUB或SUBROUTINE)中使用WorksheetFunctions。有沒有辦法在FUNCTION中使用WorksheetFunctions?如果沒有,是否有簡單的替代方法來獲得與COUNTA函數相同的結果?有誰知道爲什麼WorksheetFunctions似乎沒有相處的自定義功能?Excel VBA WorksheetFunction在自定義函數中(不是子)

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 

更新:我想出了問題,排序。請參閱下面的答案。

+2

如果'range1'已經是一個範圍對象,'CountA'行應該是'rangesize = WorksheetFunction.CountA(range1)' – 2013-05-06 16:35:12

+0

只是谷歌之前作出任何假設:) – Santosh 2013-05-06 16:37:03

+0

你是根據你的假設?你的功能不起作用嗎?它似乎很有可能在其他地方出錯。例如,代碼似乎沒有考慮到'range2'或'val2'沒有被傳入,或者錯誤可能在'RangeToArray'中。在第一行中放置一段時間,然後嘗試單步執行該功能。 – 2013-05-06 17:29:30

回答

0

這個「自定義」函數返回與CountA函數中內置的值相同的值(至少在2007年)。您必須詳細介紹您在函數中傳遞的範圍,以便我們幫助您進行調試。

Function counta2(rng As Range) 
    Dim i As Integer 

    i = Application.WorksheetFunction.CountA(rng) 

    counta2 = i 

End Function 

並且你使用這樣的:= counta2(C1:C8)

0

這工作對我來說:(Excel 2010中)

Public Function fubu(range1 As Range) As Variant 
    Dim rangesize As Variant 

    rangesize = WorksheetFunction.CountA(range1) 

    fubu = rangesize 
End Function 

嘗試切割和字面上粘貼這樣的:有絕對沒有變化,然後從表單公式中調用它。

+0

感謝您的迴應。你的函數可以工作,但由於某些原因,它仍然在單元和VBA調試器中顯示錯誤。也就是說,當我單擊「插入函數」按鈕時,我在「函數參數」窗口中獲得了正確的輸出,但是當單擊「確定」時,單元顯示錯誤而不是正確的響應。 – 2013-05-06 20:30:41

+0

@DataAnalyst它顯示了什麼錯誤? – RBarryYoung 2013-05-06 20:51:13

0

我不得不修改它,以擺脫RangeToArray函數,你沒有包括。請注意,我將其更改爲指定其返回值As Long的數據類型。我也聲明特定數據類型的變量。這將是一個很好的習慣,開始:)

screenshot

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 
0

我想通了這個問題,排序的。我認爲這是對函數的限制,因爲在我的情況下,我可以在子例程中使用WorksheetFunctions,但不能在函數中使用。原來,這與它無關。進一步研究50290錯誤,我偶然發現了另一個論壇:

「我發現了這個 - 它是一個微軟的bug,你需要在你的窗體或者其他任何窗體上找到有問題的對象(按鈕,圖片,標籤等)並刪除它。「

我做了一些實驗,發現我的函數集合中的某些東西導致Excel在我調用WorksheetFunctions時嚇壞了。爲了讓他們再次工作,我必須完全關閉Excel並開始一個新的工作簿。當我這樣做時,WorksheetFunctions工作正常。奇怪。

相關問題