【问题标题】:Running SAS Stored Process in Excel fails after two runs两次运行后在 Excel 中运行 SAS 存储过程失败
【发布时间】:2014-08-15 12:08:25
【问题描述】:

我希望这是一个合适的地方问这个问题。

我最近在 Excel 中构建了一个数据分析工具,该工具通过向 SAS 存储过程(作为“输入流”)提交输入、运行过程并在 Excel 中显示结果来工作。

我还使用一些代码在再次运行进程之前检查并从工作簿中删除所有活动的存储进程。

这在前 2 次成功运行,但在第三次尝试时失败。第三次尝试总是失败,我不知道为什么。

此阶段是否存在某种已耗尽的 Excel VBA 内存分配?还是其他一些已用尽的缓冲区?我已经介入了 VBA 代码的每一行,它似乎在以下行挂起(在第三次运行时):

SAS.InsertStoredProcess processLoc, _
    outputSheet.Range("A1"), , , inputStream

用于启动 SAS Add-in for Microsoft Office 的代码:

Dim SAS As SASExcelAddIn
Set SAS = Application.COMAddIns.Item("SAS.ExcelAddIn").Object

用于从目标输出表中删除存储过程的代码:

Dim Processes As SASStoredProcesses
Set Processes = SAS.GetStoredProcesses(outputSheet)
Dim i As Integer
For i = 1 To Processes.Count
'    MsgBox Processes.Item(i).DisplayName
    Processes.Item(i).Delete
Next i

用于插入和运行存储过程的代码:

Dim inputStream As SASRanges
Set inputStream = New SASRanges
inputStream.Add "Prompts", inputSheet.Range("DrillDown_Input")
SAS.InsertStoredProcess processLoc, _
    outputSheet.Range("A1"), , , inputStream

干杯

【问题讨论】:

  • 这是个好问题,但我没有答案。我也使用 VBA 来调用存储过程,但从未见过这种情况。最好向 SAS 技术支持咨询。 support.sas.com
  • 您可能会受益于将Set SAS = NothingSet Processes = NothingSet inputStream = Nothing 放在您的 VBA 过程的末尾。 (由于内存问题,我知道从 VBA 执行 SQL 存储过程时这是一个很好的做法。)

标签: vba excel sas


【解决方案1】:

我不知道这是否有用,但是我在通过 VBA 运行用 C++ 编写的 DLL 时遇到了类似的问题。出现问题是因为 DLL 中的函数返回了一个 double 值,我不需要它,所以 VBA 中的代码这样做了

Call SomeProcessFromDLL()

但是该过程返回了一个双浮点值,该值“填充”了 VBA 中的一些缓冲内存,而 VBA 的缓冲区有限(我认为它在 8 次尝试时放弃了)。所以我的解决方案是

Dim TempToDiscard as Double
TempToDiscard = SomeProcessFromDLL()

也许查看被调用进程的文档会有所帮助,特别是如果它返回一些值无论如何都会被丢弃,比如

Return 0;

【讨论】:

    【解决方案2】:

    我从不喜欢在 VBA 中使用 IOM,主要是因为引用问题以及在推出应用程序时必须进行客户端安装。去年,我发现了一种连接 Excel 和 SAS 的更好方法——使用存储过程 Web 应用程序。只需使用流输出设置您的服务器端 SAS 流程,并通过 Excel Web 查询传递您的输入。无需安装客户端,无需担心 SAS 版本升级,几乎没有任何代码 - 很惊讶它没有更频繁地使用!

    见:http://rawsas.blogspot.co.uk/2016/11/sas-as-service-easy-way-to-get-sas-into.html

    【讨论】:

      【解决方案3】:

      经过反思,我的理论是您正在达到多桥连接的极限。每个多桥连接代表一个端口,拥有的端口越多,启用的并行连接就越多。默认情况下有三个,也许你有两个,或者你正在同时启动另一个 STP?

      这可以解释这种行为。我有一个称为 STP 的电子表格,它在第四次调用时总是会失败,因为前三个正在运行。您可以通过 a) 增加多桥连接的数量或 b) 链接您的进程以便它们按顺序运行来解决此问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-06
        • 2017-06-29
        • 1970-01-01
        • 1970-01-01
        • 2019-06-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多