【问题标题】:Calling VBA macro from .vbs file throws 800A03EC error从 .vbs 文件调用 VBA 宏会引发 800A03EC 错误
【发布时间】:2014-04-29 08:57:56
【问题描述】:

我正在尝试通过 .VBS 文件(文件名:Check_final.vbs)运行 VBA 宏。这是代码

Option Explicit

run_macro

Sub run_macro()
    Dim xl1
    Dim sCurPath
    Dim xlBook
    Dim FolderFromPath
    Set xl1 = CreateObject("Excel.application")

    sCurPath =Wscript.ScriptFullName                                                                            
    Set xlBook = xl1.Workbooks.Open(sCurPath, 0, True)
    xl1.DisplayAlerts = False
    FolderFromPath = Left(sCurPath, InStrRev(sCurPath, "\"))
    xl1.Application.run FolderFromPath & "Changed_chk.xlsm!Check"

    Set xlBook = Nothing
End Sub

当我运行这个 .vbs 文件时,我会弹出“Changed_chk.xlsm 已锁定编辑”,并带有只读和通知选项。如果我使用只读或通知选项确认它,则会以 Check_final 的名称(即该 .vbs 文件的文件名)打开一个 excel 表,并且上述代码显示在该 excel 文件中。然后我收到一个 Windows 脚本主机错误(代码:800A03AC)说宏可能不可用或所有宏都被禁用。(虽然我已经启用了这里提到的宏。[http://www.addictivetips.com/windows-tips/enable-all-macros-in-excel-2010/)]. 非常感谢您对此的任何帮助。提前致谢。

【问题讨论】:

  • 您收到Read only and notify options 是因为您第一次没有关闭文件并正确释放您的对象。打开任务管理器并杀死所有的excel实例。但在您关闭并保存所有打开的实例之前。 Next 正确关闭代码中的 Excel 文件并释放你的对象

标签: vba excel vbscript


【解决方案1】:

您打开您的 vbs 文件而不是您的 excel 文件...还要确保您的函数/子是公开的。在下面的示例中,我在模块“YourModuleName”中创建了一个Public Sub Check,我从vbs 文件中调用它。

Option Explicit

run_macro

Sub run_macro()
    Dim xl1
    Dim xlBook
    Dim FolderFromPath
    Set xl1 = CreateObject("Excel.application")

    FolderFromPath = Replace(WScript.ScriptFullName, WScript.ScriptName, "") 
    set xlBook = xl1.Workbooks.Open(FolderFromPath & "Changed_chk.xlsm")
    xl1.Application.run "'" & xlBook.Name & "'!YourModuleName.Check"
    xl1.Application.Quit
End Sub

【讨论】:

  • 谢谢马努。它工作得很好。我猜您打算在您的描述中将公共子名称表示为“检查”而不是“测试”。
【解决方案2】:

试试这个简单的代码(未测试)

Dim oXlApp, oXLWb, sCurPath

Set oXlApp = CreateObject("Excel.application")

sCurPath = Replace(WScript.ScriptFullName, WScript.ScriptName, "")

Set oXLWb = oXlApp.Workbooks.Open(sCurPath & "Changed_chk.xlsm")

oXlApp.DisplayAlerts = False

oXlApp.Run "Check"

'~~> Close the file here. Save or discard the changes as per your requirement 
'oXLWb.Close (True)
'oXLWb.Close (False)
oXLWb.Close
oXlApp.Quit

Set oXLWb = Nothing
Set oXlApp = Nothing

还有你的宏在哪里?在工作表中还是在模块中?你可能想看看THIS

【讨论】:

  • sCurPath 末尾已经有一个'\' (C:\test\test.vbs => C:\test\)
  • 感谢@SiddharthRout。你的帖子很有帮助。
【解决方案3】:

我认为调用run_macro 语句可能有问题。从我在 excel VBA 中创建的测试中,如果我尝试在另一个子之外调用子,则会出现错误

Option Explicit
test

Sub test()
    MsgBox ("Test")
End Sub

我想你可能想要

Option Explicit
Sub Start
    run_macro
End Sub

Sub run_macro()
    'code here
End Sub

或完全删除run_macro 行?

【讨论】:

  • 没有。两种解决方案都不起作用。困扰我的是为什么要以 .vbs 文件的名称打开 Excel 工作表?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
相关资源
最近更新 更多