1

据我所知,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

4 回答 4

0

这个“自定义”函数返回与内置 CountA 函数相同的值(至少在 2007 年)。您必须提供一些关于您在函数中传递的范围的详细信息,以便我们帮助您进行调试。

Function counta2(rng As Range)
     Dim i As Integer

     i = Application.WorksheetFunction.CountA(rng)

     counta2 = i

End Function

你像这样使用它:=counta2(C1:C8)

于 2013-05-06T19:22:18.273 回答
0

我不得不对其进行修改以摆脱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
于 2013-05-06T19:45:04.457 回答
0

这也适用于我:(Excel 2010)

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

    rangesize = WorksheetFunction.CountA(range1)

    fubu = rangesize
End Function

尝试从字面上剪切和粘贴:绝对没有更改,然后从表格公式中调用它。

于 2013-05-06T19:29:21.300 回答
0

我发现了问题,有点。我认为这是对函数的限制,因为就我而言,我可以在子例程中使用 WorksheetFunctions,但不能在函数中使用。原来这与它无关。进一步研究 50290 错误,我在另一个论坛中偶然发现了这个:

“我遇到了这个——它是微软的错误。你需要在你的一个表单或任何它(按钮、图片、标签等)上找到有问题的对象并将其删除。”

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

于 2013-05-08T20:53:26.223 回答