VBA:如何在Excel宏中调用用户定义的函数

时间:2017-04-17 21:48:13

标签: excel vba excel-vba function

我是VBA的新手和一般的脚本。我能够在Excel中提取资源并创建用户定义的函数,该函数将返回数组的非重复计数。当我在Excel中的单元格中调用它时,该函数正常工作。

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

不确定我做错了什么 - 非常感谢任何帮助。

编辑:包含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

1 个答案:

答案 0 :(得分:4)

GalileoCounts中您正在使用COUNTDISTINCTcol("W2:W")。这是将String传递给COUNTDISTINCTcol,但COUNTDISTINCTcol期待Range参数。所以,即使你输入像COUNTDISTINCTcol("W:W")这样的东西也行不通 - 它也需要COUNTDISTINCTcol(Range("W:W"))