【问题标题】:VBA to VBS for ActiveWorkbook用于 ActiveWorkbook 的 VBA 到 VBS
【发布时间】: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 创建了一本新书。
  • 当你开始使用 ActiveWorkbookThisWorkbook.. 之类的东西时,你必须非常小心,特别是在脚本中。我强烈建议不要使用它,而是限定您的工作表,然后引用它们
  • @BigBen 确实如此,我从未想过它会那样做。

标签: excel vba vbscript


【解决方案1】:

问题不在于ActiveWorkbook。问题是您没有指定完整的路径。

指定一个路径,它将起作用。例如

oExcel.ActiveWorkbook.SaveAs "C:\MyFolder\" & _
oBook.Name & "-" & currentWorkSheet.Name & ".csv", 6

您将在ThisWorkbook.Activate 上收到下一个错误。完全限定它,它将起作用。

提示

您可能想删除文件扩展名,然后保存文件;)类似这样的

oExcel.ActiveWorkbook.SaveAs "C:\MyFolder\" & _
Left(oBook.Name, (InStrRev(oBook.Name, ".", -1, vbTextCompare) - 1)) & _
"-" & currentWorkSheet.Name & ".csv", 6

【讨论】:

    【解决方案2】:

    使用索引号参考工作表,或为每个循环执行一次,其中每个项目为each wksh in workbook.worksheets
    另外,我将 worksheet.close 方法移到了 for 循环之后,因为它会在你完成之前关闭你的工作簿

    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.Worksheets(counter).SaveAs oBook & "-" & currentWorkSheet.Name & ".csv", 6
        'ThisWorkbook.Activate
    Next
    oExcel.Worksheets(counter).Close False
    oExcel.DisplayAlerts = True
    oBook.Close False
    oExcel.Quit
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-02
      • 2013-08-24
      • 2017-09-13
      相关资源
      最近更新 更多