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