我的 Excel VBA 宏有问题。我需要它来执行与 Excel 工作簿位于同一文件夹中的批处理文件。该代码有时运行良好。我不知道是什么导致了错误。这是代码:
Sub writebatch()
Sheets("code").Select
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs FileName:=ThisWorkbook.path & "\code.bat",
FileFormat:=xlTextPrinter, CreateBackup:=False
Application.DisplayAlerts = True
ThisWorkbook.Saved = True
Shell "cmd.exe /k cd " & ThisWorkbook.path & "&&code.bat"
Application.Quit
End Sub
它写入批处理文件,但随后不执行它。只有一次我让命令窗口无法关闭,并且它说找不到 code.bat 文件。所以 Changedir 命令起作用了。是否可以运行cmd.exe并使用相对路径运行code.bat而无需更改dir?
首先,当您启动 CMD 实例时,如果您使用任何类型的运算符 (&),则需要将整个 CMD 参数括起来:
CMD /K "command1 & command2"
然后将子内部参数括起来,如下所示:
CMD /K "command "path with spaces" & command"
所以你需要做这样的事情:
Shell "cmd.exe /k ""cd " & """ & ThisWorkbook.path & """ & " && code.bat"""
请注意,我使用了“””来转义引号,但我不知道如何在 VBA 中转义引号。
PS:如果有空格,请记得附上 code.bat,但仅限于有空格时。
我很确定问题出在这一行
Shell "cmd.exe /k cd " & ThisWorkbook.path & "&&code.bat"
您需要在
&&
前面留一个空格以将其与 cd
命令分隔开,并在其后留一个空格以将其与 code.bat
分隔开。
Shell "cmd.exe /k cd " & ThisWorkbook.path & " && code.bat"
Shell "cmd.exe /k cd /d" & ThisWorkbook.path & "&& code.bat"
这里,如果没有 /d cmd 将在文档文件夹中打开。 通过 /d 它将在 d 驱动器中打开,您可以根据您的方便更改此设置。
在字符串中插入引号(")的一种方法是使用字符代码转换函数Chr(34),34是引号(")的ASCII值
希望对你有用。
Dim sfilename, fileName As String
Sub Run_file_bat()
fileName = "" & ThisWorkbook.Path & "\code.bat" & ""
VBA.Shell "Explorer.exe " & fileName, vbNormalFocus
End Sub
' 运行批处理文件
Sub RunBatchFile()
Dim batchFilePath As String
batchFilePath = "**actual path to your batch file**"
' Run the batch file and capture the process ID
Dim shellResult As Double
Dim shellProcess As Object
Set shellProcess = CreateObject("WScript.Shell")
shellResult = shellProcess.Run(batchFilePath, vbHide, True)
' Check if the batch file was executed successfully
If shellResult = 0 Then
' Batch file completed successfully
MsgBox "Batch file completed successfully.", vbInformation
Else
' Batch file failed or returned an error code
MsgBox "Batch file failed with error code: " & shellResult, vbExclamation
End If
End Sub