如何在Access to Excel Automation中正确指定ATP 2.0 XIRR函数调用
如果有人能提供帮助,我需要在Access 2003 to Excel 2003 VBA问题中正确定义一些调用参数。我试图从Access使用ATP 2.0类型库中的XIRR函数。我在Access项目中引用了ATP 2.0类型库。下面是我在表单后面使用的相关VBA代码(带有一点伪代码):如何在Access to Excel Automation中正确指定ATP 2.0 XIRR函数调用,excel,ms-access,automation,vba,Excel,Ms Access,Automation,Vba,如果有人能提供帮助,我需要在Access 2003 to Excel 2003 VBA问题中正确定义一些调用参数。我试图从Access使用ATP 2.0类型库中的XIRR函数。我在Access项目中引用了ATP 2.0类型库。下面是我在表单后面使用的相关VBA代码(带有一点伪代码): Dim aCF as Variant 'this variant will hold the cash flows Dim aDates as Variant 'this variant will hold the
Dim aCF as Variant 'this variant will hold the cash flows
Dim aDates as Variant 'this variant will hold the dates
Dim oATP2 As ATP2.OCATP
Set oATP2 = New ATP2.OCATP 'used in the Form_Open event to instantiate the object
在这个模型中,我总是要处理五个现金流:作为流出的上一季度价值、三个月的净收款和当前季度的期末价值。(如果涉及到更多元素,我肯定会使用循环结构。)在用户定义的sub中,我重新定义变量,加载数组并调用XIRR:
GetAssetReturn_X()
REDIM aDates(4) 'base 0
aDates(0) = DateSerial(Year(wDBBaseDate), Month(wDBBaseDate) - 2, 1) - 1 'e.g. 3-31- 2010
aDates(1) = DateSerial(Year(wDBBaseDate), Month(wDBBaseDate) - 1, 1) - 1 'e.g. 4-30-2010
aDates(2) = DateSerial(Year(wDBBaseDate), Month(wDBBaseDate), 1) - 1 'e.g. 5-31-2010
aDates(3) = wDBBaseDate 'e.g. 6-30-2010
aDates(4) = wDBBaseDate 'e.g. 6-30-2010
REDIM aCF(4) 'base 0
'from a recordset...
aCF(0) = -rs.Fields(2) 'pprd cash flow
aCF(1) = rs.Fields(3) 'net collection cprd - 2
aCF(2) = rs.Fields(4) 'net collection cprd - 1
aCF(3) = rs.Fields(5) 'net collection cprd
aCF(4) = rs.Fields(6) 'cprd cash flow
GetAssetReturn_X = oATP2.XIRR(aCF, aDates)
End Sub
自动感知功能起作用;当我输入“oATP2”时,我会得到一个可用函数的列表。因此,我假设该对象实际上是正确实例化的。也许不是。然而,每当我运行代码时,就会出现臭名昭著的运行时错误“91:Object variable or With block variable not set.”。在我的一生中,我都忽略了这里的结构问题。所以我现在假设调用参数没有被正确描述。我在某个地方读到,这些肯定是变种。可能这些需要是数组或范围对象。谢谢。我在你的代码中添加了
Set oATP2=New ATP2.octp
,但是我得到了429错误。你终于可以使用ATP2图书馆了吗?作为替代解决方案,此代码在MS access中运行,但速度太慢:
Function tasa1(A, B)
Set AnalysisApp = CreateObject("Excel.Application")
Set AnalysisWkb = AnalysisApp.Workbooks.Open("C:\Archivos de programa\Microsoft Office\OFFICE11\Macros\Análisis\atpvbaen.xla")
AnalysisWkb.RunAutoMacros xlAutoOpen
tasa1 = AnalysisApp.Application.Run(AnalysisWkb.Name & "!XIRR", A, B, 0.1) * 100
End Function
我建议存在范围问题。您似乎依赖于全局变量,但没有说明变量的定义位置。我建议不要使用globals,除非您确实需要在多个代码上下文中使用同一个对象实例。有很多方法可以解决这个问题(例如,将参数传递给子例程,或者使用带有静态变量的函数,或者将它们封装在类模块中),但是依赖全局变量几乎总是一个坏主意。