SAS ODS tagsets.excelxp:在SAS中调用vbscript的autofit列宽

每周我输出一个yyyymmdd_report.xls工作簿,它由多个工作表组成,其中包含我的macrosdate。 如果我手动打开此工作簿,以下vbs脚本可以正常工作以自动调整列:

 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内的某种调用中,而不必手动执行? 我在网上find的文档似乎有点太复杂,我的需求。 逻辑是:

 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并有MSOffice 2010。

电子表格标记语言不支持对文本列进行自动调整,这真是糟糕透顶 。 但是,我认为这可能适合您的具体情况:

将下面的代码保存到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文件,添加macros,运行macros,删除macros,并最终将文档保存为一个适当的XLS(没有警告提示,如打开一个XLS扩展名的XML文件时)。

然后在SAS程序中的x命令中使用这个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"""; 
 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)中,您应该定义一个macros,其中包含您想要在特定或活动工作簿上执行的操作。

例如:

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