Я хочу внедрить свой код VBA в свой код SAS, чтобы выполнить весь процесс за один запуск. Мой код SAS считывает большую таблицу SAS, выполняет некоторые преобразования и, наконец, экспортирует в Excel файл (код ниже). Я также написал некоторый код VBA в файле Excel (например, автофильтр для некоторых переменных, вы можете увидеть код ниже).
Таблица выглядит так:
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, чтобы выполнить весь процесс за один прогон. я знаю, как открыть и запустить файл Excel в SAS (код приведен ниже ), но я не знаю, как реализовать код VBA в моем SAS.
Если вам интересно, почему я хочу реализовать свой макрокод в своем SAS, я буду работать с подобными SAS-таблицами много раз в будущем, поэтому было бы практичнее хранить весь код в одном месте.
Я только что понял, что не могу экспортировать таблицу в SAS в формате Excel с поддержкой макросов, XLSM. Думаю, это тоже вызов. Также нецелесообразно сохранять макрокод из файла Excel, т.к. он должен быть сохранен в меню надстроек. Так что было бы намного лучше управлять всем процессом в одном месте, например, в редакторе SAS.
Код в SAS, который экспортирует итоговую таблицу в файл Excel:
PROC EXPORT DATA=File1
OUTFILE= "&server\&env\test1.xlsx"
DBMS=EXCEL REPLACE;
SHEET="sheet1";
RUN;
Пример кода VBA в файле Excel для создания автофильтра для переменных в файле 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 для запуска и запуска файла Excel в SAS:
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;
x
(при условии, что вы работаете в Windows). Если вам нужно передать параметры, вы можете сделать это как часть вызоваx
. - person Tim Williams   schedule 26.06.2015