2017-02-27 46 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