【发布时间】:2015-09-13 13:53:15
【问题描述】:
我想将我的 VBA 代码实现到我的 SAS 代码中,这样我可以一次运行完成整个过程。我的 SAS 代码读取一个大 SAS 表,进行一些转换,最后导出到 Excel 文件(代码如下)。我还在 Excel 文件中写了一些 VBA 代码(例如 AutoFiltering for some variables,你可以看下面的代码)。
表格如下所示:
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 表,因此将整个代码保存在一个地方会更实用。
我刚刚意识到我无法在 SAS 中以启用宏的 Excel 格式 XLSM 导出表格。我想这也是一个挑战。此外,从 Excel 文件中保存宏代码也不是很实用,因为它必须保存在 Adds-in 菜单中。所以最好在一个地方处理整个过程,比如在 SAS 编辑器中。
SAS 中将最终表格导出到 Excel 文件的代码:
PROC EXPORT DATA=File1
OUTFILE= "&server\&env\test1.xlsx"
DBMS=EXCEL REPLACE;
SHEET="sheet1";
RUN;
Excel 文件中用于为 Excel 文件中的变量创建自动筛选的 VBA 代码示例:
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;
【问题讨论】:
-
您是说您希望能够通过 DDE 创建一个新的 Excel 文件,然后通过 SAS 以编程方式在其中创建一个新的 VBA 宏?
-
基本上,是的。我希望我的 SAS 代码能够读取 SAS 表,将结果导出到 Excel 文件(如果可能,请使用 XLSM),并且我的 SAS 代码还将运行一些 VBA 代码以使 Excel 文件更美观。我希望所有这些进程都只在一个代码中运行一次......
-
你运行的excel宏总是一样的吗?使用excel模板的方法会起作用吗?我认为这是执行此操作的标准方法;您将 excel 宏存储在静态的“模板”工作簿中,然后从那里执行它(同时写入不同的工作簿,或者您可以写入模板工作簿,然后另存为不同的工作簿名称)。
-
我计划将 SAS 中的 VBA 用于相同的表变量,但每个 excel 文件中的数据都会发生变化。我只会在 SAS 文件开头使用 %let var1=&var 更改“宏变量”。您的意思是将 Excel 宏保存为静态模板工作簿,您的意思是 XLSB 格式?你的意思是我只是简单地将我的宏代码保存在任何模板中,然后在需要时复制粘贴它?
-
如果你的例子是自动过滤器,我认为标签集已经提供了一个很好的机制来做到这一点。此外,您可以导出到 XLSM,我可能已经做过很多次了。你有什么版本的 SAS?