2015-06-26 57 views
2

我想将我的VBA代码实现到我的SAS代码中,所以我可以在一次运行中完成整个过程。我的SAS代码读取一个大的SAS表格,进行一些转换,最后导出到一个Excel文件(代码如下)。我还在Excel文件中编写了一些VBA代码(例如一些变量的自动过滤,你可以看到下面的代码)。在sas中写入vba代码

表看起来是这样的:

A B C Var1 Var2 Var3 
-------------------- 
1 1 1 10 15 20 
1 1 2 15 20 30 
1 2 1 20 30 40 
1 2 2 30 40 50 
2 1 1 40 50 60 
2 1 2 50 60 70 
2 2 1 60 70 80 
.............. 
.............. 

然而,我要实现我的VBA代码到我的SAS代码,这样我就可以一次运行做的全过程。我知道如何打开和运行SAS中的Excel文件(代码如下),但我不知道如何在SAS中实现VBA代码。

如果你想知道为什么我想实现我的SAS我的宏代码,我会在今后发生类似的SAS-表很多次工作,所以它会更practicle以保持整个代码在一个地方。

我刚刚意识到我无法以支持宏的Excel格式(XLSM)在SAS中导出表格。我想这也是一个挑战。另外,从Excel文件中保存宏代码的操作不太现实,因为它必须保存在Adds-in菜单中。所以在一个地方处理整个过程会好很多,就像在SAS编辑器里面一样。

在SAS中的代码,其出口的最终表到Excel文件:

PROC EXPORT DATA=File1 
     OUTFILE= "&server\&env\test1.xlsx" 
     DBMS=EXCEL REPLACE; 
    SHEET="sheet1"; 
RUN; 

在Excel文件的VBA代码示例为在Excel文件变量创建自动筛选:

Sub Macro1() 
    Dim N As Long, r As Range 
With Sheets("sheet1") 
    N = .Cells(Rows.Count, "B").End(xlUp).Row 
    ReDim ary(1 To N) 
    For i = 1 To N 
     ary(i) = .Cells(i, 1) 
    Next i 
End With 

Range("A1:F20").AutoFilter 
ActiveSheet.Range("$A$1:$F$20").AutoFilter Field:=1, Criteria1:=ary, Operator:=xlFilterValues 
End Sub 

在SAS的代码来启动和运行SAS Excel文件:

OPTIONS NOXWAIT NOXSYNC; 
    DATA _NULL_; 
    RC=SYSTEM('START EXCEL'); 
    RC=SLEEP(0.5); 
RUN; 
FILENAME CMDS DDE 'EXCEL|SYSTEM'; 
DATA _NULL_; 
    FILE CMDS; 
    PUT "[OPEN(""&server\&env\test1.XLS"")]"; 
    PUT '[RUN("Macro1")]'; 
    PUT '[SAVE.AS("&server\&env\FORMATTED_FILE.XLSM")'; 
    PUT "[QUIT()]"; 
RUN; 
QUIT; 
+0

? – Joe

+0

基本上,是的。我希望我的SAS代码能够读取SAS表,将结果导出到Excel文件(如果可能的话,XLSM),我的SAS代码也会运行一些VBA代码来使Excel文件更美观。 我希望所有这些进程只用一个代码运行一次... – user3714330

+0

你运行的excel宏总是一样的吗?将使用Excel模板的方法工作?我认为这是做这件事的标准方法;将excel宏存储在静态的“模板”工作簿中,然后从那里执行(写入不同的工作簿,或写入模板工作簿,然后另存为不同的工作簿名称)。 – Joe

回答

2

的常用方法要做到这一点是使用模板文件。你已经保存了你的模板,其中保存了excel宏(也许还有一些格式化工作已经完成;使用DDE你不必从空白工作表开始)。

您可以使用DDE填充模板工作簿/工作表,然后“另存为”另一个文件,也可以使用DDE创建新的工作簿和工作表,打开模板工作簿,运行宏,关闭模板。你所做的可能取决于你是否想要将宏与结果一起分发。

这允许您以任何方式运行所有内容而不与其交互 - 因为模板宏已经存在,所以您不必为其添加任何新宏。一切都可以通过这种方式在一次运行中完成。

这例如在论文Step-by-Step in Using SAS® DDE to Create an Excel Graph Based on N Observations from a SAS Data Set中以及关于该主题的其他几篇论文中示出。

+0

&乔感谢您的链接,我会尽快检查它,如果它工作... – user3714330

0

借助DDE你可以设置在SAS过滤器:你是说,你希望能够通过DDE创建一个新的Excel文件,然后通过SAS在它创建一个新的VBA宏编程

data _null_; 
    FILE CMDS; 
    /* select your worksheet */ 
    put '[workbook.select("your_sheet")]'; 
    /* select the column range you want to set the filter */ 
    put '[select("r1c2:r1c5")]'; 
    /* set filter */ 
    put '[filter]'; 
run;