2

我正在使用 WshShell 从 Excel 中的 VBA 运行批处理文件。

  • 批处理文件非常简单,一行运行一个数字运算程序。我可以直接运行批处理文件而不会出现问题。
  • 我正在使用 WshShell 或 WScript.Shell,因为我希望 VBA 在计算完成后等待将结果加载回 Excel。
  • 我参考了“Microsoft Scripting Runtime”和“Windows Script Host Object Model”
  • 我已经使用相同的代码很长时间了。直到 2-3 周前它工作得很好。现在它关闭 Excel。如果我打开了一些电子表格,它会将它们全部关闭。
  • 我有两个版本,但它们都在“Set WinSh = ...”行崩溃。Excel 在几 (~10) 秒内没有响应,然后关闭。
  • 我正在使用 Office 365 MSO (16.0.12527.21294) 32 位。它由我的组织管理。
  • 我在 Word 中尝试了相同的代码,它也崩溃了。

任何人都知道最近的更新是否可以做到这一点?或者我可以使用的另一种方法?

潜艇是:

Public Sub RunBatch(FPath As String)
    Dim WinSh As Object
    Dim StrCmd As String
    Dim ErrCode As Long
    Set WinSh = New WshShell
    StrCmd = Chr(34) & FPath & Chr(34)
    ErrCode = WinSh.Run(StrCmd, WindowStyle:=1, WaitOnReturn:=True)
End Sub
  
Public Sub RunBatch2(FPath As String)
    Dim WinSh As Object
    Set WinSh = VBA.CreateObject("WScript.Shell")
    WinSh.Run FPath, 1, True
End Sub
4

1 回答 1

1

问题的根源是 Cisco AMP 安全策略的更新或更改。这会阻止使用 Windows 脚本宿主。我所在组织的安全部门正在努力寻找问题的解决方案。

与此同时,我找到了解决它的方法。我使用 shell(在恢复 VBA 代码之前不等待批处理结束)运行批处理,该批处理在进程结束时写入一个简单的文本文件,我等待文本文件以 1 秒的增量出现。它很粗糙,但到目前为止还有效。

Public Sub OneRunBatch()

Dim xlWB As Workbook
Dim fso1 As New FileSystemObject
Dim BatFile As Object
Dim IsDone As Boolean
Dim OutFileName As String
Dim DoneFileName As String
Dim OutPath As String
Dim DeleteBatFile As Boolean

Set xlWB = ThisWorkbook
OutPath = xlWB.Path
OutFileName = "HW.bat"
DoneFileName = "Done.txt"
DeleteBatFile = False

Set BatFile = fso1.CreateTextFile(OutPath & "\" & OutFileName)
BatFile.WriteLine "cd /d " & OutPath
BatFile.WriteLine "echo Hello World"
BatFile.WriteLine "dir > " & DoneFileName
BatFile.Close

IsDone = False
Call Shell(OutPath & "\" & OutFileName, vbNormalFocus)

Do Until IsDone
    If fso1.FileExists(OutPath & "\" & DoneFileName) Then IsDone = True
    Application.Wait (Now + TimeValue("00:00:01"))
Loop

fso1.DeleteFile (OutPath & "\" & DoneFileName)
If DeleteBatFile Then fso1.DeleteFile (OutPath & "\" & OutFileName)

End Sub
于 2020-12-16T14:51:31.257 回答