2013-09-23 89 views
4

我无法让Excel 2010执行SAS中的宏。我从一些SAS表格导出数据到Excel,这很好,当我手动运行VBA宏时,它也会做它应该做的事情,但它不会自动执行。 Excel文件被称为“FIH.xls”,而宏被称为“Opryd”作为Module1。 SAS日志不会出现任何错误,Excel也不会。我已经允许所有的宏在Excel设置中运行。它仍然没有执行。DDE SAS运行VBA代码

options noxwait noxsync; 
x '"C:\FIH.xls"'; 
/* Putting SAS in sleep mode to give Excel the necessary time to open the file */ 
data _null_; x=sleep(5); 
run; 

FILENAME excel DDE 'EXCEL|Grp!r5c8:r7c20' notab; 
    DATA _NULL_; 
    SET gem.rap_konc_selskab; 
    FILE excel; 
    PUT '09'x selskab_rap '09'x gr_vis_start '09'x man_amt '09'x '09'x '09'x rest_2 '09'x ; 
    RUN; 
data _null_; 
file excel; 
put '[run ("FIH.xls!Opryd")]'; 
run; 
+0

如果VBA代码正常工作,并且您想自动执行该代码,请将代码放在Workbook_Open中:) –

+0

我已经试过了,但是在将数据从SAS导出到Excel之前,excel运行宏。我尝试了在VBA宏中延迟,但这也没有帮助。如何让VBA宏等待执行命令,直到来自SAS的数据位于电子表格中? – NHansen

+0

由于workbook_open将首先触发,所以延迟无效。我不太确定,但数据如何在Excel中完全更新? –

回答

1

的问题是,你是putrun(...)到工作簿本身,而不是Excel应用程序。

你需要你用你run(...)命令第二fileref:

 
filename cmdexcel dde 'excel|system' ; 
data _null_; 
    file cmdexcel; 
    put '[run("FIH.xls!Opryd")]'; /* no space between run and (*/ 
run; 
filename cmdexcel clear ; 
+0

当我这样做时,我在SAS日志中出现错误:“ERROR:DDE session not ready。 致命错误:执行DATA步骤程序时检测到不可恢复的I/O错误 中止执行阶段。“ – NHansen

+0

我假设工作簿仍然打开? 尝试在工作簿名称周围环绕方括号...'put'[run(“[FIH.xls]!Opryd”)]';' –

+1

或者可能没有! 'put'[run(“[FIH.xls] Opryd”)]';' –

0

看来这个问题早就已经解决,但这里对于那些谁仍然谷歌的解决方案的好处一个提示:

假设文件已打开。

filename xl dde 'excel|system'; 
data _null_; 
    file xl; 
    put %unquote(%str(%'[run("FIH.xlsm!Opryd")]%')); 
run; 

请注意xlsm扩展名。