两次运行后,在Excel中运行SAS存储过程失败

时间:2014-06-25 04:06:24

标签: excel vba excel-vba sas

我希望这是一个提出这个问题的合适场所。

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

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

前两次成功运行,但第三次尝试失败。它总是在第三次尝试失败,我无法弄清楚原因。

这个阶段的Excel VBA是否有某种内存分配?还是其他一些最大化的缓冲区?我已经介入VBA代码的每一行,它似乎在下一行挂起(在第三次运行):

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

用于启动Microsoft Office SAS加载项的代码:

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

干杯

3 个答案:

答案 0 :(得分:0)

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

Call SomeProcessFromDLL()

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

Dim TempToDiscard as Double
TempToDiscard = SomeProcessFromDLL()

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

Return 0;

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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