Menulis kode vba di sas

Saya ingin menerapkan kode VBA ke dalam kode SAS saya, sehingga saya dapat melakukan seluruh proses dalam sekali proses. Kode SAS saya membaca tabel SAS besar, melakukan beberapa transformasi, dan akhirnya mengekspor ke Excel file (kode di bawah). Saya juga menulis beberapa kode VBA di file Excel (misalnya AutoFiltering untuk beberapa variabel, Anda bisa melihat kodenya di bawah).

Tabelnya terlihat seperti ini:

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
..............
..............

Namun, Saya ingin menerapkan kode VBA saya ke dalam kode SAS saya, sehingga saya dapat melakukan seluruh proses dengan sekali proses. Saya tahu cara membuka dan menjalankan file Excel di SAS (kodenya ada di bawah ), tapi saya tidak tahu cara mengimplementasikan kode VBA di SAS saya.

Jika Anda bertanya-tanya mengapa saya ingin menerapkan kode Makro di SAS saya, saya akan bekerja dengan tabel SAS serupa berkali-kali di masa mendatang, jadi akan lebih praktis untuk menyimpan seluruh kode di satu tempat.

Saya baru menyadari bahwa saya tidak dapat mengekspor tabel di SAS dalam format Excel yang mendukung makro, XLSM. Saya rasa ini juga sebuah tantangan. Selain itu, tidak praktis menyimpan kode Makro dari file Excel, karena harus disimpan di menu Add-in. Jadi akan lebih baik jika menangani seluruh proses di satu tempat, seperti di dalam editor SAS.

Kode di SAS yang mengekspor tabel akhir ke file Excel:

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

Contoh kode VBA di file Excel untuk membuat AutoFilter untuk variabel di file 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

Kode di SAS untuk memulai dan menjalankan file Excel di 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;

person user3714330    schedule 26.06.2015    source sumber
comment
Anda mengatakan bahwa Anda ingin dapat membuat file Excel baru melalui DDE dan kemudian membuat makro VBA baru di dalamnya secara terprogram melalui SAS?   -  person Joe    schedule 26.06.2015
comment
Pada dasarnya, Ya. Saya ingin kode SAS saya membaca tabel SAS, mengekspor hasilnya ke file Excel (XLSM jika memungkinkan) dan kode SAS saya juga akan menjalankan beberapa kode VBA untuk membuat file Excel lebih indah. dan saya ingin semua proses itu hanya berjalan satu kali dalam satu kode...   -  person user3714330    schedule 26.06.2015
comment
Apakah makro excel yang Anda jalankan selalu sama? Apakah metode menggunakan templat excel akan berhasil? Saya rasa itulah cara standar untuk melakukan ini; Anda menyimpan makro Excel di buku kerja 'templat' yang statis, dan menjalankannya dari sana (saat menulis ke buku kerja lain, atau Anda bisa menulis ke buku kerja templat lalu SIMPAN SEBAGAI nama buku kerja yang berbeda).   -  person Joe    schedule 26.06.2015
comment
Saya berencana menggunakan VBA di SAS untuk variabel tabel yang sama, tetapi dengan mengubah data di setiap file excel. Saya hanya akan melakukan perubahan pada variabel makro di awal file SAS dengan %let var1=&var. Maksud Anda menyimpan Makro Excel sebagai buku kerja templat statis, maksud Anda format XLSB? dan maksud Anda saya cukup menyimpan kode Makro saya di templat apa pun, dan saya menyalin-menempelkannya kapan pun saya membutuhkannya?   -  person user3714330    schedule 26.06.2015
comment
Jika contoh Anda adalah filter otomatis, saya berpendapat bahwa Tagets sudah menyediakan mekanisme yang bagus untuk melakukan hal itu. Selain itu, Anda juga dapat mengekspor ke XLSM, saya sudah melakukannya berkali-kali. Versi SAS apa yang Anda miliki?   -  person Reeza    schedule 26.06.2015
comment
Anda bisa menyimpannya sebagai templat apa pun (.XLSM apa pun), lalu buka buku kerja templat, lalu jalankan makro dari templat tersebut. Saya tidak menggunakan templat dalam pengertian Templat Excel resmi, hanya di buku kerja yang Anda gunakan untuk memulai   -  person Joe    schedule 26.06.2015
comment
@Reeza, ini versi 9.2, saya sudah mencarinya sebelumnya, menurut saya tidak mungkin di versi ini. Saya mendapat kesalahan saat mencoba mengekspor ke xlsm.   -  person user3714330    schedule 26.06.2015
comment
Jika Anda menggunakan DDE mengapa tidak mengekspor dengan DDE?   -  person Reeza    schedule 26.06.2015
comment
Anda selalu dapat menggunakan file VBScript dan memanggilnya menggunakan x (dengan asumsi Anda menggunakan Windows). Jika Anda perlu meneruskan parameter, Anda dapat melakukannya sebagai bagian dari panggilan x.   -  person Tim Williams    schedule 26.06.2015


Jawaban (3)


Cara umum untuk melakukan ini adalah dengan menggunakan file templat. Anda telah menyimpan template Anda, yang memiliki makro excel yang disimpan di dalamnya (dan mungkin juga beberapa pemformatan telah dilakukan; menggunakan DDE Anda tidak harus memulai dengan lembar kerja kosong).

Anda bisa menggunakan DDE untuk mengisi buku kerja/lembar kerja templat, lalu "Simpan Sebagai" file lain, atau Anda bisa menggunakan DDE untuk membuat buku kerja dan lembar kerja baru, membuka buku kerja templat, menjalankan makro, dan menutup templat. Yang Anda lakukan mungkin bergantung pada apakah Anda ingin mendistribusikan makro beserta hasilnya.

Ini memungkinkan Anda menjalankan semuanya tanpa berinteraksi dengannya dengan cara apa pun - Anda tidak perlu menambahkan makro baru ke dalamnya atau apa pun, karena makro templat sudah ada. Semuanya bisa dilakukan dalam sekali jalan dengan cara ini.

Hal ini ditunjukkan misalnya dalam makalah Langkah-demi-Langkah dalam Menggunakan SASĀ® DDE untuk Membuat Grafik Excel Berdasarkan N Pengamatan dari Kumpulan Data SAS, serta beberapa makalah lain tentang subjek tersebut.

person Joe    schedule 26.06.2015

Saya selalu menganggap DDE agak kikuk dan membuat kesal jika Anda menyentuh buku kerja excel saat sedang berjalan. Contoh ini menulis skrip VB ke ruang kerja sas lalu mengeksekusi iut. Pada dasarnya Anda bisa mendapatkan pernyataan put untuk menulis kode untuk apa pun yang Anda ingin program lakukan dan itu dapat didorong oleh apa yang ada dalam kumpulan data SAS. Contoh ini menambahkan header dan foter ke spreadsheet excel yang ada...

%macro xlHeadFoot(WorkBookPath=,Header=FileName,Footer=SheetName,onlySheet=);

  %local _shortpath WorkBook;

  data _null_;
    length header footer $200;
    header=ifc(lowcase("&header.")='filename' or lowcase("&header.")='sheetname',tranwrd(tranwrd(lowcase("&header."),'filename','&F'),'sheetname','&A'),"&header.");
    footer=ifc(lowcase("&footer.")='filename' or lowcase("&footer.")='sheetname',tranwrd(tranwrd(lowcase("&footer."),'filename','&F'),'sheetname','&A'),"&footer.");
    call symput("header",trim(header));
    call symput("footer",trim(footer));
  run;

  %let WorkBook=%scan(&WorkBookPath.,%sysfunc(countw(&WorkBookPath.,\)),\);

    %* ***********************************************;
    %* get the short DOS name for the workspace folder;

    data _null_;
      rc=filename("inpipe",catx('"','for %I in (',"%sysfunc(pathname(work))",') do echo %~sI'),"pipe");
    run;

    data _null_;
      infile inpipe truncover end=last;
      input @1 data $256. ;
      rc=filename("inpipe","");
      if last then call symput('_shortpath',trim(data));
    run;

    %* *******************************;
    %* tidy up any previous executions;

    data _null_;
      if fileexist("&_shortpath\testx.vbs") then do;
        rc=filename("dump","&_shortpath\testx.vbs");
        rc=fdelete('dump');
        msg=sysmsg();
        if msg ne '' then put msg=;
      end;
      if fileexist("&_shortpath\xmlFile.xml") then do;
        rc=filename("dump","");
        rc=filename("dump","&_shortpath\xmlFile.xml");
        rc=fdelete('dump');
        msg=sysmsg();
        if msg ne '' then put msg=;
        rc=filename("dump","");
      end;
    run;


  %if %sysfunc(fileexist("&WorkBookPath."))=1 %then %do;


    data null;
      file "%sysfunc(pathname(work))\testx.vbs";
      put @1 'Set objExcel = CreateObject("Excel.Application")';
      put @1 'objExcel.Application.Visible = True';
      put @1 'objExcel.Workbooks.open  "' "&WorkBookPath." '"' ;
      %if %str(&onlySheet.) ne %str() %then %do;
        put @1 'onlySheetExisits=False';
        put @1 'for each sheet in objExcel.Workbooks("' "&WorkBook." '").sheets';  
        put @1 'if strcomp(sheet.name,"' "&onlySheet." '",1)=0 then onlySheetExisits=True';
        put @1 'if strcomp(sheet.name,"' "&onlySheet." '",1)=0 then sheet.PageSetup.CenterHeader = "' "%str(&Header.)" '"';
        put @1 'if strcomp(sheet.name,"' "&onlySheet." '",1)=0 then sheet.PageSetup.CenterFooter = "' "%str(&Footer.)" '"';
        put @1 'Next';
      %end;
      %else %do;
        put @1 'for each sheet in objExcel.Workbooks("' "&WorkBook." '").sheets';  
        put @1 'sheet.PageSetup.CenterHeader = "' "%str(&Header.)" '"';
        put @1 'sheet.PageSetup.CenterFooter = "' "%str(&Footer.)" '"';
        put @1 'Next'; 
      %end;

      put @1 'objExcel.Workbooks("' "&WorkBook." '").save';
      put @1 'objExcel.Workbooks("' "&WorkBook." '").Close';
      put @1 'objExcel.Application.Quit';
      %if %str(&onlySheet.) ne %str() %then %do;
        put @1 'if onlySheetExisits=False then msgbox "Error! Could not find Worksheet: '"&onlySheet."' in Workbook: "' ' & vbcr & ' '" '"&WorkBookPath." '",16,"SAS: '"&SYSMACRONAME"'"';
      %end;

    run;


    x %sysfunc(quote("&_shortpath.\testx.vbs")); 

  %end;
  %else %put %str(ERR)OR: [&SYSMACRONAME.] Unable to open: &WorkBookPath.  - check it exists!;


%mend;
person Jim E    schedule 05.02.2019

Dengan DDE Anda dapat mengatur filter di 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;
person zuluk    schedule 14.11.2017