2015-06-26 77 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;