【问题标题】:Run VBA-script from a different Excel file using VBscript使用 VBscript 从不同的 Excel 文件运行 VBA 脚本
【发布时间】:2013-06-26 20:26:17
【问题描述】:

我使用此代码搜索文件夹,找到所有 excel 文件(具有相同的扩展名),从打开的 excel 文件中运行 VBA 脚本并在不提示的情况下保存它。

strPath = "my path"
pathName="xlsx"

if strPath = "" then Wscript.quit
if pathName = "" then Wscript.quit

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

Set objFso = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFso.GetFolder (strPath)

For Each objFile In objFolder.Files

If objFso.GetExtensionName (objFile.Path) = "xlsx" Then
   Set objWorkbook = objExcel.Workbooks.Open(objFile.Path)

   Set objWorksheet = objWorkbook.WorkSheets(1)
   objworksheet.Activate

objExcel.Application.Run "'filename and in quote because there is space.xlsm'!TestingMacro"


 objWorkbook.saveas(objFile.Path)
   objWorkbook.Close True 'Save changes
End If

Next

objExcel.Quit

但是,每次我运行它时,它都会在 objExcel.Application.Run 行上给我一个运行时错误 800A03EC。那么我能做些什么来解决它呢?

谢谢!

【问题讨论】:

  • 在调用其中的任何代码之前,您应该在创建的 Excel 实例中打开带有宏的文件。

标签: excel vbscript vba


【解决方案1】:

必须先打开包含宏的工作簿,然后才能从中运行宏。使用完整路径打开宏工作簿,但只使用工作簿和宏名称运行宏。

Set xl = CreateObject("Excel.Application")
xl.Visible = True

Set wbm = xl.Workbooks.Open("C:\path\to\macro workbook.xlsm")

Set fso = CreateObject("Scripting.FileSystemObject")

For Each f In fso.GetFolder("C:\some\where").Files
  If LCase(fso.GetExtensionName(f.Name)) = "xlsx" Then
    Set wb = xl.Workbooks.Open(f.Path)

    Set ws = wb.Sheets(1)
    ws.Activate

    xl.Application.Run "'macro workbook.xlsm'!TestingMacro"

    wb.Save
    wb.Close
  End If
Next

wbm.Close

xl.Quit

【讨论】:

  • 是的,它奏效了。谢谢!我之前开过。我只是不知道我需要在同一个实例中打开宏文件。
【解决方案2】:

您正在尝试从您的个人工作簿运行宏,它可能无法正常工作,因为使用 VBScript 打开 Excel 文件不会自动打开您的 PERSONAL.XLSB。你需要做这样的事情:

Dim oFSO
Dim oShell, oExcel, oFile, oSheet
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oShell = CreateObject("WScript.Shell")
Set oExcel = CreateObject("Excel.Application")
Set wb2 = oExcel.Workbooks.Open("C:\..\PERSONAL.XLSB") 'Specify foldername here

oExcel.DisplayAlerts = False


For Each oFile In oFSO.GetFolder("C:\Location\").Files
    If LCase(oFSO.GetExtensionName(oFile)) = "xlsx" Then
        With oExcel.Workbooks.Open(oFile, 0, True, , , , True, , , , False, , False)



            oExcel.Run wb2.Name & "!modForm"


            For Each oSheet In .Worksheets



                oSheet.SaveAs "C:\test\" & oFile.Name & "." & oSheet.Name & ".txt", 6


            Next
            .Close False, , False
        End With
    End If



Next
oExcel.Quit
oShell.Popup "Conversion complete", 10

因此,在循环开始时,它打开personals.xlsb 并从那里为所有其他工作簿运行宏。只是想我应该在这里发帖,以防有人像我一样遇到这个问题但无法弄清楚为什么宏仍然没有运行。

【讨论】:

    【解决方案3】:

    您可能需要在新的 excel 实例中运行 objFolder 目录中的每个 excel 文件。

    strPath = "my path"
    pathName="xlsx"
    
    if strPath = "" then Wscript.quit
    if pathName = "" then Wscript.quit
    
    Set objFso = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFso.GetFolder (strPath)
    
    For Each objFile In objFolder.Files
        If objFso.GetExtensionName (objFile.Path) = "xlsx" Then
    
            Set objExcel = CreateObject("Excel.Application")
            objExcel.Visible = True
            objExcel.DisplayAlerts = False
    
            Set objWorkbook = objExcel.Workbooks.Open(objFile.Path)
            Set objWorksheet = objWorkbook.WorkSheets(1)
            objworksheet.Activate
    
            objExcel.Application.Run "'filename and in quote because there is space.xlsm'!TestingMacro"
    
            objWorkbook.saveas(objFile.Path)
            objWorkbook.Close True 'Save changes
            objExcel.Quit
    
        End If
    Next
    

    【讨论】:

    • 抱歉,“objExcel.Application.Run”行仍然给我错误。
    • 我认为没有必要创建单独的 Excel 实例。我认为 - 但我无法测试 - 从 vbscript 运行时,您需要包含宏的完整路径:Application.Run ("'C:\somefolder\macro1.xlsm'!macro_name")
    • 恰恰相反。您必须在没有完整路径的情况下调用宏,但必须先打开包含宏的工作簿。是的,绝对没有必要创建多个 Excel 实例。
    猜你喜欢
    • 1970-01-01
    • 2011-09-08
    • 2023-03-13
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多