2015-06-26 2 views
2

Я хочу реализовать свой код VBA в своем SAS-коде, чтобы я мог выполнить весь процесс за один проход. Мой код SAS считывает большую таблицу SAS, выполняет некоторые преобразования и, наконец, экспортирует в файл Excel (код ниже). Я также написал некоторый код VBA в файле Excel (например, AutoFiltering для некоторых переменных, вы можете увидеть код ниже).Написание кода vba в sas

таблица выглядит следующим образом:

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; 
+0

Вы говорите, что вы хотите, чтобы иметь возможность создать новый файл Excel с помощью DDE, а затем создать новый макрос VBA в нем программно с помощью SAS ? – Joe

+0

В принципе, да. Я хочу, чтобы мой код SAS прочитал SAS-таблицу, экспортировал результат в файл Excel (если возможно), и мой 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

& Joe спасибо за ссылку, я проверю ее как можно скорее, если она будет работать ... – user3714330

0

С помощью DDE вы можете установить фильтр в SAS:

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; 
Смежные вопросы