现象描述在Excel中运行SAS存储进程两次失败



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

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

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

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

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

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

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

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

欢呼

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

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

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

Call SomeProcessFromDLL()

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

Dim TempToDiscard as Double
TempToDiscard = SomeProcessFromDLL()

也许查看被调用进程的文档会有所帮助,特别是当它返回一些要丢弃的值时,比如

Return 0;

我一直不喜欢在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

最新更新