我有以下代码,我希望它打开我保存为.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
答案 0 :(得分:11)
正如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不支持命名参数(请参阅here)。如果您要将Close
参数设置为SaveChanges
,请调用True
方法,您必须这样做:
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
答案 1 :(得分:5)
两个严重的错误:
Set fso = Nothing
不应该在您的循环中:您需要fso
在计划期间。
此外,从循环中删除app.Quit
;保持Excel开放,直到完成为止
端。
Set f = Nothing
是不必要的(尽管是良性的);让循环为你选择值。
答案 2 :(得分: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