编译错误:未定义用户定义的类型访问/Excel 引用



我在声明 Excel 对象时收到消息Compile Error: User-defined type not defined函数。我已将引用设置为 Office 对象库 14.0 Microsoft。

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

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

您可以使用 VBE 的对象浏览器(F2) 浏览类型库公开的类型及其成员。如果没有Excel库,并且除了Access库中定义的类之外没有Application类,则缺少引用。

然后。。。

使函数显式Public,数组参数显式ByRef,非数组参数显式ByVal,给它们都显式声明类型。

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

Guess可能是xlGuess型,但那是...嗯,一个猜测Long应该足够好,但如果存在一个枚举,可以使调用代码更容易知道要为该参数传递什么,请使用它。

您不需要局部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

请注意,在Excel.Application调用Xirr函数是一个后期绑定调用,将在运行时解析,如果出现问题,当GetAIRR(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

.Xirr是一个工作表函数。使用以下内容:

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

最新更新