自定义函数中的Excel VBA Worksheet函数(不是子函数)

时间:2013-05-06 16:25:49

标签: function excel-vba vba excel

据我所知,Excel不会让你在vba FUNCTION(不是SUB或SUBROUTINE)中使用WorksheetFunctions。有没有办法在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

更新:我想出了问题。请参阅下面的答案。

4 个答案:

答案 0 :(得分:0)

此“自定义”函数返回与内置CountA函数相同的值(至少在2007年)。您必须在函数中传递一些细节,以便我们帮助您进行调试。

Function counta2(rng As Range)
     Dim i As Integer

     i = Application.WorksheetFunction.CountA(rng)

     counta2 = i

End Function

你使用它:= counta2(C1:C8)

答案 1 :(得分:0)

这对我也有用:(Excel 2010)

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

    rangesize = WorksheetFunction.CountA(range1)

    fubu = rangesize
End Function

尝试按字面意思剪切和粘贴:绝对不做任何更改,然后从图纸公式中调用它。

答案 2 :(得分: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

答案 3 :(得分:0)

我想出了这个问题。我认为这是函数的限制,因为在我的情况下,我可以在子例程中使用WorksheetFunctions,但不能在函数中使用。事实证明这与它无关。进一步研究50290错误,我偶然发现了另一个论坛:

“我遇到过这个问题 - 它是一个微软的错误。你需要在你的某个表格上找到有问题的对象或其他任何形式(按钮,图片,标签等)并删除它。”

我做了一些实验,发现当我调用WorksheetFunctions时,我的函数集合中的某些东西会导致Excel出错。为了让它们再次工作,我必须完全关闭Excel并启动一个新的工作簿。当我这样做时,WorksheetFunctions工作正常。奇怪。