Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 调用用户定义的函数_Excel_Vba_Function - Fatal编程技术网

Excel 调用用户定义的函数

Excel 调用用户定义的函数,excel,vba,function,Excel,Vba,Function,我不熟悉VBA和脚本。我能够提取资源并在Excel中创建一个用户定义的函数,该函数将返回数组的不同计数。当我在Excel中的单元格内调用该函数时,该函数工作正常 现在,我想在宏中引用此函数,以提供一个消息框,说明两个不同列的计数。当我尝试使用宏时,我收到一个“类型不匹配”错误 我不知道我做错了什么-任何帮助都将不胜感激 编辑:包括COUNTDISTINCTcol代码 Sub GalileoCounts() Dim teachers As Long Dim students As L

我不熟悉VBA和脚本。我能够提取资源并在Excel中创建一个用户定义的函数,该函数将返回数组的不同计数。当我在Excel中的单元格内调用该函数时,该函数工作正常

现在,我想在宏中引用此函数,以提供一个消息框,说明两个不同列的计数。当我尝试使用宏时,我收到一个“类型不匹配”错误

我不知道我做错了什么-任何帮助都将不胜感激

编辑:包括COUNTDISTINCTcol代码

Sub GalileoCounts()

   Dim teachers As Long
   Dim students As Long

   teachers = COUNTDISTINCTcol("W2:W") 'ERROR HERE for "W2:W"
   students = COUNTDISTINCTcol("A2:A") 'ERROR with "A2:A" as well

   MsgBox "Teachers: " & teachers & vbNewLine & "Students: " & students, 
   vbOKOnly, "Galileo Counts"

End Sub
----
Public Function COUNTDISTINCTcol(ByRef rngToCheck As Range) As Variant

Dim colDistinct As Collection
Dim varValues As Variant, varValue As Variant
Dim lngCount As Long, lngRow As Long, lngCol As Long

On Error GoTo ErrorHandler

varValues = rngToCheck.Value

'if rngToCheck is more than 1 cell then
'varValues will be a 2 dimensional array
If IsArray(varValues) Then

    Set colDistinct = New Collection

    For lngRow = LBound(varValues, 1) To UBound(varValues, 1)
        For lngCol = LBound(varValues, 2) To UBound(varValues, 2)

            varValue = varValues(lngRow, lngCol)

            'ignore blank cells and throw error
            'if cell contains an error value
            If LenB(varValue) > 0 Then

                'if the item already exists then an error will
                'be thrown which we want to ignore
                On Error Resume Next
                colDistinct.Add vbNullString, CStr(varValue)
                On Error GoTo ErrorHandler

            End If

        Next lngCol
    Next lngRow

    lngCount = colDistinct.Count
Else
    If LenB(varValues) > 0 Then
        lngCount = 1
    End If

End If

COUNTDISTINCTcol = lngCount

Exit Function

ErrorHandler:
    COUNTDISTINCTcol = CVErr(xlErrValue)

End Function

在GalileoCounts中,您使用的是COUNTDISTINCTcolW2:W。这将字符串传递给COUNTDISTINCTcol,但COUNTDISTINCTcol需要一个范围参数。因此,即使您放置类似COUNTDISTINCTcolW:W的内容,它也不会工作-它需要是COUNTDISTINCTcolRangeW:W.

UDF countdistinct的参数是什么?我们可以看到COUNTDISTINCTcol的代码吗?如果看不到代码,我们无法帮助您。此外,如果它适用于A2:A或任何其他范围,但不适用于W2:W,我们需要查看函数代码和数据的外观。如果没有看到UDF,也可以尝试COUNTDISTINCTcol W2:W10…看看是否有效。好吧,你需要在那里放最后一行,你不能只放一个范围W2:W。谢谢BruceWayne-我试过你的建议,但没用。我试着把它改成W:W,但这也不起作用。我正在尝试检索整个列的计数。一个旁白-有时我的UDF必须被称为myUDF RangeW:W而不是myUDFRangeW:W…当使用一种格式而不是另一种格式时,有没有约定?它是在创建UDF时完成的,还是我如何称呼它的?使用范围是隔离是对Active工作簿的activesheet的隐式引用。最好先显式引用工作簿/工作表,然后是范围。@BruceWayne-如果返回值,请使用lhs=funcparms语法。包括UDF在内的函数通常应该返回值,因此这是正常语法。如果您不返回值,即调用子函数,或调用函数但希望忽略其返回值,则应使用func parms或Call funcparms语法。如果您尝试使用func parms语法,但意外地在parms(即func parms)周围放了括号,则VBA将通过val而不是ByRef传递parms-这将隐式地将myUDF RangeW:W更改为myUDF RangeW:W。Value@ThunderFrame-是的,当我在没有完全限定范围的情况下键入范围时,我会畏缩。但是OP的问题中没有任何提示可以参考适当的工作表,并且,如果OP从活动的工作表中成功调用COUNTDISTINCTcol,则很可能活动工作表就是OP希望在新代码中使用的工作表。感谢您的解释!:D