Function 自定义函数中的Excel VBA工作表函数(非子函数)

Function 自定义函数中的Excel VBA工作表函数(非子函数),function,excel,vba,Function,Excel,Vba,据我所知,Excel不允许您在vba函数(不是子例程或子例程)中使用工作表函数。有没有办法在函数中使用工作表函数?如果没有,是否有简单的替代方法来获得与COUNTA函数相同的结果?有人知道为什么工作表函数似乎与自定义函数不协调吗 Function CountIfsFast(range1 As range, val1, Optional range2 As range, Optional val2) rangesize = WorksheetFunction.CountA(range1)

据我所知,Excel不允许您在vba函数(不是子例程或子例程)中使用工作表函数。有没有办法在函数中使用工作表函数?如果没有,是否有简单的替代方法来获得与COUNTA函数相同的结果?有人知道为什么工作表函数似乎与自定义函数不协调吗

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)


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

我不得不修改它,以摆脱您未包含的
RangeToArray
函数。请注意,我更改了,将其返回值的数据类型指定为Long。我还声明了特定数据类型的变量。这将是一个良好的习惯开始:)


我算是解决了问题。我认为这是对函数的限制,因为在我的例子中,我可以在子例程中使用工作表函数,但不能在函数中使用。结果证明这与此无关。在进一步研究50290错误时,我在另一个论坛上偶然发现了这一点:

“我遇到了这个问题-这是Microsoft的一个错误。您需要在其中一个窗体或其他任何窗体(按钮、图片、标签等)上找到有问题的对象,然后将其删除。”


我做了一些实验,发现当我调用WorksheetFunctions时,我的函数集合中的某些东西导致Excel崩溃。为了让它们重新工作,我必须完全关闭Excel并开始新的工作簿。当我这样做时,工作表功能工作正常。奇怪。

如果
range1
已经是一个范围对象,那么
CountA
行应该是
rangesize=WorksheetFunction.CountA(range1)
在做出任何假设之前只需谷歌一下:)你的假设基于什么?你的功能不起作用吗?很有可能它在别处出错了。例如,代码似乎没有说明未传入的
range2
val2
,或者错误可能在
RangeToArray
中。在第一行划一段,然后尝试单步执行该函数。@DataAnalyst好的,我已经编写了“使用工作表函数的函数”,对我来说效果很好。这是代码/工作表中的其他内容。感谢您的回复。我确信是工作表函数导致了错误。尝试使用工作表函数编写简单函数。根据Microsoft的说法,它返回一个通用的“应用程序定义的或对象定义的错误”:函数不能“设置属性或执行大多数方法。”-不幸的是,Microsoft对于哪些方法不能使用的问题,其特点是含糊不清。同样,这是一个函数,它具有与子例程不同的规则/限制。除了Excel不允许在函数中使用它之外,我找不到发生这种情况的任何原因。感谢您的回复。您的函数可以工作,但由于某些原因,它仍然在单元格和VBA调试器中显示错误。也就是说,当我单击“插入函数”按钮时,我在“函数参数”窗口中获得了正确的输出,但当我单击“确定”时,单元格显示错误而不是正确的响应。
Public Function fubu(range1 As Range) As Variant
    Dim rangesize As Variant

    rangesize = WorksheetFunction.CountA(range1)

    fubu = rangesize
End Function
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