编译错误:用户定义的类型未定义Access / Excel Reference

时间:2018-02-05 17:39:05

标签: excel vba ms-access

在声明Excel对象时,我在函数中收到消息Compile Error: User-defined type not defined。我的引用设置为Microsoft Office Object Library 14.0。

Function GetAIRR(arrAssCF, arrAssDate, Guess) As Double
    Dim objExcel As Excel.Application
    Set objExcel = New Excel.Application

    Target = objExcel.Application.Xirr(arrAssCF, arrAssDate, Guess)
End Function

2 个答案:

答案 0 :(得分:3)

引用 Microsoft Excel 类型库(即不是 Microsoft Office 类型库)。

您可以使用VBE的对象浏览器(F2)浏览类型库公开的类型及其成员。如果Excel库中没有Application库而且没有Access类,那么您就错过了参考。

则...

使函数显式Public,数组参数显式ByRef,非数组参数显式ByVal,为它们提供一个显式声明的类型。

Public Function GetAIRR(ByRef arrAssCF As Variant, ByRef arrAssDate As Variant, ByVal Guess As Long) As Double

Guess可能属于xlGuess类型,但那是......好吧,猜测Long应该足够好,但是如果存在一个enum,可以让调用代码更容易知道该参数的传递内容,那就使用它。

您不需要本地Excel.Application变量 - 只需拥有一个With块来保存该引用:

With New Excel.Application
    Target = .Xirr(arrAssCF, arrAssDate, Guess)
End With

最后,Target变量似乎没有在任何地方声明,并且该函数没有返回任何内容。你的意思是这样做的吗?

With New Excel.Application
    GetAIRR = .Xirr(arrAssCF, arrAssDate, Guess)
End With

请注意,从Xirr调用Excel.Application函数是一个后期绑定调用,将在运行时解决,如果出现问题,您将获得GetAIRR(a Double)暂时分配给某个Error值时,会出现类型不匹配错误。

通过使用Excel.WorksheetFunction.Xirr代替,调用是早期绑定的(即在编译时解析),如果出现问题,函数将引发实际运行 - 时间错误而不是返回一个;您可以使用正常的错误处理来处理该错误,或​​者您可以抑制错误并返回0,如果这是该函数可接受的事情:

    With New Excel.Application
        On Error Resume Next
        'possible type mismatch if input is invalid
        GetAIRR = .Xirr(arrAssCF, arrAssDate, Guess)

        'or early-bound:
        'possible error 1004 if input is invalid
        'GetAIRR = .WorksheetFunction.Xirr(arrAssCF, arrAssDate, Guess) 

        On Error GoTo 0
    End With

答案 1 :(得分:0)

.Xirr是一个WorksheetFunction。使用以下内容:

Application.WorksheetFunction.Xirr(arrAssCF, arrAssDate, Guess)