2017-02-27 5 views
0

Jede Woche gebe ich eine yyyymmdd_report.xls Arbeitsmappe aus mehreren Blättern mit meinem Makrodatum im Dateinamen. Wenn ich diese Arbeitsmappe manuell zu öffnen, funktioniert der folgende vbs Skript feine Spalten automatisch anpassen:SAS ODS tagsets.excelxp: autofit Spaltenbreiten aufrufen vbscript innerhalb von SAS

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 

Gibt es eine Möglichkeit, diese in eine Art von Anruf innerhalb SAS setzen kann, wo ich nicht haben, dies zu tun manuell ? Dokumentation, die ich online gefunden habe, scheint für meine Bedürfnisse etwas zu komplex zu sein. Die Logik wäre:

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

I SAS v9.4 renne und hat MSOffice 2010.

+0

Try this: http://www2.sas.com/proceedings/sugi25/25/cc/25p098.pdf –

+0

Danke, @ RobertSoszyński. Das Papier sagt nicht genau, wie 'Macro1' gespeichert ist oder was genau es ist - ich gehe davon aus, dass es ein ähnliches Makro wie das meine oben enthalten würde. Würde ich den Text in einer '.vbs' Datei speichern und aufrufen? Da bin ich verwirrt. – Foxer

+0

Je nachdem, wie komplex Ihr Bericht ist, sehen Sie sich ODS Excel an, das es automatisch implementieren und diesen Schritt vermeiden könnte. – Reeza

Antwort

2

Es ist so eine Art bummer, dass die Tabellen Markup Language doesn't support autofit on text columns. Aber ich denke, das schön mit Ihrer spezifischen Situation passen:

Speichern Sie den Code unten an 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 

Dies wird eine Excel-Datei öffnen, fügen Sie das Makro, führen Sie das Makro, entfernen Sie das Makro, und Speichern Sie das Dokument schließlich als korrektes XLS (keine Warnmeldung wie beim Öffnen einer XML-Datei mit einer XLS-Erweiterung).

Dann nutzen Sie dieses VBScript in einem x Befehl in Ihrem SAS-Programm wie so:

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

DAS ist genau das, was ich gesucht habe! Ich sollte beachten, dass ich in Excel und Datei gehen musste -> Optionen -> Trust Center -> Trust Center Einstellungen ... -> Makro-Einstellungen und wählen Sie Trust-Zugriff auf das VBA-Projektobjektmodell. Das macht den Trick, dank einer Million @Hugs! – Foxer

+0

@Foxer, Super! Gutes Denken, ich habe diese Voraussetzung vergessen. – Hugs

+0

Kann die Vbs direkt mit der Arbeitsmappe interagieren? (Ohne ein VBA-Makro in der Arbeitsmappe hinzuzufügen und das auszuführen?) – 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; 

in Ihrer Excel-VBA-Datei (MyMacro.xlsm) sollten Sie einen Makro definieren, welche Informationen enthält Was möchten Sie in einer bestimmten oder aktiven Arbeitsmappe tun?

Zum Beispiel:

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