据我所知,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
更新:我想出了问题。请参阅下面的答案。
答案 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
的数据类型。我还声明了特定数据类型的变量。这将是一个良好的习惯开始:)
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工作正常。奇怪。