ฉันต้องการใช้โค้ด 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 ไม่สะดวกนัก เนื่องจากจะต้องบันทึกไว้ในเมนู Adds-in ดังนั้น จะดีกว่ามากหากจัดการกระบวนการทั้งหมดในที่เดียว เช่น ภายในโปรแกรมแก้ไข 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