6

我有以下代码,我希望它打开保存为 .xlsx 的文件,然后使用相同的文件名再次保存它们,但这次保存为 .xls 文件,以便它们与 Excel 2003 兼容

Set app = CreateObject("Excel.Application")
Set fso = CreateObject("Scripting.FileSystemObject")

For Each f In fso.GetFolder("Y:\Billing_Common\autoemail").Files
  If LCase(fso.GetExtensionName(f)) = "xlsx" Then
    Set wb = app.Workbooks.Open(f.Path)

app.DisplayAlerts = False

wb.SaveAs "*.xls*"
wb.Close SaveChanges=True
app.Close
app.Quit

  End if

Set f = Nothing
Set fso = Nothing
Next
4

3 回答 3

12

正如Bathsheba已经指出的那样,Set fso = Nothing并且app.Quit属于脚本的末尾(循环之外)。不过,还有一些错误。

  • wb.SaveAs "*.xls*"

    您不能将工作簿保存为通配符名称。如果要以当前名称保存工作簿,只需使用wb.Save. 否则,您必须使用显式名称(您还应该设置文件类型):

    wb.SaveAs "new.xlsx", 51
    

    或者

    wb.SaveAs "C:\path\to\new.xls", -4143
    
  • wb.Close SaveChanges=True

    VBScript 不支持命名参数(参见此处)。如果你想调用参数设置为的Close方法,你必须这样做:SaveChangesTrue

    wb.Close True
    
  • app.Close

    应用程序对象没有Close方法。

不是错误,而是值得改进的地方:

  • app.DisplayAlerts = False除非您在循环内也重新启用它,否则应该在循环开始之前进行。

  • 我建议app.Visible = False在创建应用程序对象后添加一行。当您必须调试脚本时,您可以简单地更改该值以True在桌面上显示应用程序。这对查找错误有很大帮助。

修正脚本:

Set app = CreateObject("Excel.Application")
app.Visible = False
app.DisplayAlerts = False

Set fso = CreateObject("Scripting.FileSystemObject")

For Each f In fso.GetFolder("Y:\Billing_Common\autoemail").Files
  If LCase(fso.GetExtensionName(f)) = "xlsx" Then
    Set wb = app.Workbooks.Open(f.Path)

    wb.Save
    wb.Close True
  End if
Next

app.Quit
Set app = Nothing
Set fso = Nothing
于 2013-07-04T08:42:35.950 回答
5

两个严重的错误:

  • Set fso = Nothing不应该在你的循环中:你需要fso 在程序的持续时间内。

  • app.Quit另外,从循环中删除;保持 Excel 打开直到
    最后。

Set f = Nothing是不必要的(尽管是良性的);让循环为您选择值。

于 2013-07-04T07:55:12.290 回答
3
Dim app, fso, file, fName, wb, dir 

dir = "d:\path\"

Set app = CreateObject("Excel.Application")
Set fso = CreateObject("Scripting.FileSystemObject")

For Each file In fso.GetFolder(dir).Files
    If LCase(fso.GetExtensionName(file)) = "xlsx" Then  
    fName = fso.GetBaseName(file)

    Set wb = app.Workbooks.Open(file) 
    app.Application.Visible = False
    app.Application.DisplayAlerts = False
    app.ActiveWorkbook.SaveAs dir & fName & ".xls", 43
    app.ActiveWorkbook.Close 
    app.Application.DisplayAlerts = True 
    app.Application.Quit 

    End if
Next

Set fso = Nothing
Set wb = Nothing    
Set app = Nothing

wScript.Quit
于 2014-10-23T15:50:16.783 回答