我有一个 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 重新运行它。