【问题标题】:Using Shell to run a batch file after saving files in a new drive将文件保存到新驱动器后使用 Shell 运行批处理文件
【发布时间】:2026-01-02 05:15:01
【问题描述】:

我有一个使用宏通过 Shell 函数运行批处理文件 (CEA.bat) 的工作簿。我在本地 D: 驱动器上创建了工作簿(C: 是主/OS 分区),它在那里工作。

我想与我的同事共享工作簿的副本,但 shell 功能似乎只能在创建它的驱动器中工作 (D:)。如果我在原始驱动器 (D:) 的另一个目录下创建工作簿的副本,它就可以工作。如果我在另一个驱动器(例如 C:)或另一台机器上创建副本,Shell 函数将不会运行批处理文件。

批处理文件和工作簿始终保存在同一个文件夹中。如果我直接运行批处理文件,它就可以工作,所以我认为它没有问题。该问题似乎与 Shell 函数有关。相关代码行如下:

Dim CEArun As String

ChDrive ThisWorkbook.Path 
ChDir ThisWorkbook.Path

CEArun = Chr(34) & ThisWorkbook.Path & "\CEA.bat" & Chr(34)

Call Shell(CEArun, vbMinimizedNoFocus)

我遇到了一种使用 WshShell 对象在 VBA 中运行批处理文件的方法,但我还没有尝试过。似乎只有在激活“Windows Script Host Object Model”时它才会起作用。我的同事的 VBA 知识比我还少,所以我更愿意为他们提供一个他们可以使用的工具,而不必乱搞 VBA 设置。

【问题讨论】:

  • 从你的代码中删除Chr(34),当你声明一个变量为String它已经有""所以你实际上告诉Shell ""C:\Folder\Cea.bat""
  • 谢谢 Damian,我对在 VBA 中正确使用引号有点困惑。不幸的是,删除它们并没有解决问题。

标签: excel vba


【解决方案1】:

这对我有用,

将带有 ping 功能的 .txt 文件保存到我自己的机器上,并在我的工作簿中运行此代码。球拍打开并进行了 ping:

Option Explicit
Sub Test()

    Dim MyPath As String: MyPath = ThisWorkbook.Path & "\CEA.bat"
    Shell MyPath, vbMinimizedNoFocus

End Sub

【讨论】:

  • 感谢达米安,这非常有效!我猜这个问题一定与“Call”语句有关。
  • @seutmatt 这应该不是问题,不是一个好的做法,但不是问题。