首页 > 解决方案 > 从 VBA 启动 R 脚本时保持 Shell / cmd 打开

问题描述

我有一个 R 脚本,它通过链接到 VBA 脚本的按钮从 Excel 工作簿运行。

问题是每次 R 脚本遇到错误时 - 比如说它没有找到它应该读取的文件之一 - R 脚本正在运行的 Shell / cmd 窗口会立即关闭。问题是你看不到任何关于它为什么失败的线索。然后我必须通过修改代码并在 RStudio 中运行以查找错误来手动调试它——通常我必须为其他不了解 R 的人这样做。

我使用的 VBA 代码是从我在此处找到的 SO 帖子之一复制和修改的。我对 VBA 不是很精通,也不懂很多代码,所以我正在寻找一个简单的解决方案。我的 VBA 代码是这样的:

Option Explicit

Public Sub RunRscript()

    ActiveWorkbook.Save

    Dim shell As Object
    Set shell = VBA.CreateObject("WScript.Shell")

    Dim waitTillComplete As Boolean: waitTillComplete = True
    Dim style As Integer: style = 1

    Dim scriptPath As String
    scriptPath = Range("F5").Value

    Dim argument As String
    argument = Range("F3").Value

    Dim path As String
    path = """C:\Program Files\R\R-3.4.2\bin\Rscript.exe"" """ & scriptPath & """ """ 
& argument & """"

    ActiveWorkbook.Save

    Dim errorcode As Integer
    errorcode = shell.Run(path, style, waitTillComplete)

    ActiveWorkbook.Save

End Sub

scriptPath指向 R 脚本的路径,argument是我传递给 R 脚本的参数。

我尝试传递通常的参数来保持 cmd 窗口打开,但我没能弄清楚。这也很复杂,因为如前所述,我不太了解 VBA 语法,并且由于那些无休止的双引号,“路径”变量非常复杂。

标签: rexcelvba

解决方案


你可能会使用

errorcode = shell.Run("cmd /k " & path, style, waitTillComplete)

代替

errorcode = shell.Run(path, style, waitTillComplete)

我们打开一个命令行工具的新实例,从而可以使用它的参数。参数 /k k保持 cmd 窗口打开(使用 /c 使c丢失)。在 cmd 参数之后,我们添加要执行的脚本。

但是有一个问题:如果关闭 cmd 窗口,VBA 会引发溢出错误。我在我的 Excel 工作表中使用一个标志在调试模式和正常模式之间切换:

debugging = Range("N5").Value 'True/False
If debugging Then
    errorCode = shell.Run("cmd /k " & path, style, waitTillComplete)
Else
    errorCode = shell.Run(path, style, waitTillComplete)
End If

如果脚本失败,我会在 Excel 工作表的单元格中重新运行它,将调试模式设置为 True。


推荐阅读