【发布时间】:2019-11-20 16:08:50
【问题描述】:
我正在尝试将一些嵌入在 Excel 电子表格中的 VBA 代码转换为将所有选项卡保存为 CSV 的 VBS 脚本,我可以从命令行运行该脚本来执行相同的操作。
Set objFSO = CreateObject("Scripting.FileSystemObject")
src_file = objFSO.GetAbsolutePathName(Wscript.Arguments.Item(0))
Dim oExcel
Set oExcel = CreateObject("Excel.Application")
Dim oBook
Set oBook = oExcel.Workbooks.Open(src_file)
Dim worksheetCount
workSheetCount = oExcel.Worksheets.Count
oExcel.DisplayAlerts = False
Dim counter
Dim currentWorkSheet
For counter = 1 to workSheetCount
Set currentWorkSheet = oBook.Worksheets(counter)
currentWorkSheet.Copy
oExcel.ActiveWorkbook.SaveAs oBook & "-" & currentWorkSheet.Name & ".csv", 6
oExcel.ActiveWorkbook.Close False
ThisWorkbook.Activate
Next
oExcel.DisplayAlerts = True
oBook.Close False
oExcel.Quit
错误发生在“oExcel.ActiveWorkbook.SaveAs”行的开头,并表示对象不支持此方法。所以我假设 Excel 对象没有 ActiveWorkbook 方法?这里是否有 VBA->VBS 转换,我应该使用其他一些方法吗?
编辑
现在这对我有用:
Set objFSO = CreateObject("Scripting.FileSystemObject")
src_file = objFSO.GetAbsolutePathName(Wscript.Arguments.Item(0))
Dim oExcel
Set oExcel = CreateObject("Excel.Application")
Dim oBook
Set oBook = oExcel.Workbooks.Open(src_file)
Dim WshShell
Set WshShell = CreateObject("WScript.Shell")
Dim strCurDir
strCurDir = WshShell.CurrentDirectory & "\" & oBook.Name & "-"
Dim worksheetCount
workSheetCount = oExcel.Worksheets.Count
oExcel.DisplayAlerts = False
Dim counter
Dim currentWorkSheet
For counter = 1 to workSheetCount
Set currentWorkSheet = oBook.Worksheets(counter)
currentWorkSheet.Copy
oExcel.ActiveWorkbook.SaveAs strCurDir & currentWorkSheet.Name & ".csv", 6
oExcel.ActiveWorkbook.Close False
Next
oExcel.DisplayAlerts = True
oBook.Close False
oExcel.Quit
【问题讨论】:
-
oBook是一个工作簿 - 所以问题是oBook & "-" & currentWorkSheet.Name & ".csv"。oBook.Name也许?您不能连接工作簿... -
@GeertBellekens OP 确实需要引用活动工作簿,因为
currentWorksheet.Copy创建了一本新书。 -
当你开始使用
ActiveWorkbook和ThisWorkbook.. 之类的东西时,你必须非常小心,特别是在脚本中。我强烈建议不要使用它,而是限定您的工作表,然后引用它们 -
@BigBen 确实如此,我从未想过它会那样做。