在声明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
答案 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)