Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Access to Excel Automation中正确指定ATP 2.0 XIRR函数调用_Excel_Ms Access_Automation_Vba - Fatal编程技术网

如何在Access to Excel Automation中正确指定ATP 2.0 XIRR函数调用

如何在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

如果有人能提供帮助,我需要在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 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,除非您确实需要在多个代码上下文中使用同一个对象实例。有很多方法可以解决这个问题(例如,将参数传递给子例程,或者使用带有静态变量的函数,或者将它们封装在类模块中),但是依赖全局变量几乎总是一个坏主意。