2017-02-27 379 views
0

每週我輸出一個yyyymmdd_report.xls工作簿,其中包含多個工作表,其中包含我在文件名中的宏日期。如果我手動打開此工作簿,以下VBS腳本正常工作,以自動調整列:SAS ODS tagsets.excelxp:在SAS中調用vbscript的自動填充列寬度

Sub AutoFitAll() 
    Application.ScreenUpdating = False 
    Dim wkSt As String 
    Dim wkBk As Worksheet 
    wkSt = ActiveSheet.Name 
    For Each wkBk In ActiveWorkbook.Worksheets 
     On Error Resume Next 
     wkBk.Activate 
     Cells.EntireColumn.AutoFit 
    Next wkBk 
    Sheets(wkSt).Select 
    Application.ScreenUpdating = True  
End Sub 

有什麼辦法,我可以把這個成某種內部SAS調用的地方,我不必手動執行此操作?我在網上找到的文檔似乎有點太複雜,我的需求。邏輯是:

1. Point to/open output report .xls file (maybe some command/DDE method?) 
2. Run vbs script above 
3. Re-save the file 

我運行SAS V9.4,並有2010年的MSOffice

+0

試試這個:http://www2.sas.com/proceedings/sugi25/25/cc/25p098.pdf –

+0

謝謝,@RobertSoszyński。這篇論文並沒有說明'Macro1'是如何存儲的,究竟是什麼 - 我假設它將包含一個類似於上面的宏。我會將文本保存在'.vbs'文件中並調用它嗎?這就是我困惑的地方。 – Foxer

+0

根據您的報告的複雜程度,查看可以自動實施並避免此步驟的ODS Excel。 – Reeza

回答

2

這是一種一個令人失望的是,電子表格標記語言doesn't support autofit on text columns。但是,我認爲這可能與您的具體情況很好地適應:

保存下面的代碼來autofit.vbs

Set objExcel = CreateObject("Excel.Application") 
objExcel.Visible = True 
objExcel.DisplayAlerts = False 
Set objWorkbook = objExcel.Workbooks.Open(WScript.Arguments.Item(0)) 
Set xlmodule = objworkbook.VBProject.VBComponents.Add(1) 

strCode = _ 
"Sub AutoFitAll() "         & vbCr & _ 
" Application.ScreenUpdating = False "   & vbCr & _ 
" Dim wkSt As String "       & vbCr & _ 
" Dim wkBk As Worksheet "      & vbCr & _ 
" wkSt = ActiveSheet.Name "      & vbCr & _ 
" For Each wkBk In ActiveWorkbook.Worksheets" & vbCr & _ 
"  On Error Resume Next "      & vbCr & _ 
"  wkBk.Activate "       & vbCr & _ 
"  Cells.EntireColumn.AutoFit "    & vbCr & _ 
" Next wkBk "         & vbCr & _ 
" Sheets(wkSt).Select "       & vbCr & _ 
" Application.ScreenUpdating = True"    & vbCr & _ 
"End Sub" 

xlmodule.CodeModule.AddFromString strCode 

objExcel.Run "AutoFitAll" 

objworkbook.VBProject.VBComponents.Remove xlmodule 

objWorkbook.SaveAs WScript.Arguments.Item(0) , -4143 
objExcel.Quit 

這將打開一個Excel文件,添加宏,運行宏,刪除宏,和最後將文檔保存爲適當的XLS(在打開帶有XLS擴展名的XML文件時不會出現警告提示)。

然後在x命令你的SAS程序中利用這個VBScript中,像這樣:

ods tagsets.ExcelXP file="C:\test.xls"; 
    proc print data=sashelp.Cars; 
    run; 
ods tagsets.ExcelXP close; 

options xwait; 
x "C:\autofit.vbs ""C:\test.xls"""; 
+1

這正是我期待的!我應該注意到我必須進入Excel和文件 - >選項 - >信任中心 - >信任中心設置... - >宏設置,然後選擇信任訪問VBA項目對象模型。這就是訣竅,謝謝100萬@Hugs! – Foxer

+0

@Foxer,太棒了!好的想法,我忘記了這個先決條件。 – Hugs

+0

vbs可以直接與工作簿交互嗎? (無需在工作簿中添加vba宏並執行該操作?) – sjmc

0
options noxwait noxsync; 

/* run Excel, also you can run it manually */ 
x '"C:\Program Files (x86)\Microsoft Office\Office15\EXCEL.EXE"'; 

/* wait, Excel is starting */ 
data _null_; 
    rc = sleep(5); 
run; 

/* create a connection between SAS and Excel */ 
filename cmds dde 'excel|system'; 

data _null_; 
    file cmds; 
    /* open a file with a macro */ 
    put '[open("C:\MyMacro.xlsm")]'; 
    /* run the macro MyMacro in MyMacro file */ 
    put '[run("MyMacro.xlsm!MyMacro")]'; 
    /* close the macro file */ 
    put '[close(0)]'; 
    /* quit Excel */ 
    put '[quit()]'; 
run; 

在您的Excel VBA文件(MyMacro.xlsm),你應該定義包含信息的宏您想要在特定或活動工作簿上執行什麼操作。

例如:

Sub MyMacro() 
    Workbooks.Open Filename:="C:\Zeszyt1.xlsx" 
    Columns("A:A").ColumnWidth = 100 
    ActiveWorkbook.Save 
    ActiveWindow.Close 
End Sub