从 VBA 启动 R 脚本时保持 Shell/cmd 打开

Liv*_*ius 0 excel vba r

我有一个 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
Run Code Online (Sandbox Code Playgroud)

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

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

小智 6

你可能会使用

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

代替

errorcode = shell.Run(path, style, waitTillComplete)
Run Code Online (Sandbox Code Playgroud)

我们打开一个新的命令行工具实例,这样就可以使用它的参数了。参数 /k k使 cmd 窗口保持打开状态(使用 /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
Run Code Online (Sandbox Code Playgroud)

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