【问题标题】:Windows Script Host failsWindows 脚本宿主失败
【发布时间】:2014-06-05 14:25:23
【问题描述】:

我正在尝试使用 VBA 从 Excel 运行 R 脚本。理想情况下,我会使用 .R (Rscript) 名称来调用 R 并运行该进程,或者如果这不成功,则调用 Rscript.exe 并执行传递给它的文件名。

REXcel 不好,因为它需要 32 位版本的 Excel(而且我不是在 1989 年工作)

我在 (http://shashiasrblog.blogspot.co.uk/2013/10/vba-front-end-for-r.html) 找到了一个看起来很完美的脚本,经过适当的本地化后,它看起来像这样:

Sub RunRscript()
Dim shell As Object
Set shell = VBA.CreateObject("WScript.Shell")
Dim waitTillComplete As Boolean: waitTillComplete = True
Dim style As Integer: style = 1
Dim errorCode As Integer
Dim path As String
path = "C:\Users\Charles\SkyDrive\Documents\Development\G4H\Technical evaluation     templates\Graphical analysis.R"
errorCode = shell.Run(path, style, waitTillComplete)
End Sub

这会失败并显示消息

运行时错误“-2147024894 (80070002)”: 对象“IWshShell3”的方法“运行”失败。

这并没有告诉我什么。我试过用谷歌搜索错误信息,但什么也没得到。

我已将 PATH 变量设置为包含 R 和 Rscript 所在的目录。

我怀疑这很简单,但似乎缺乏从 Excel 执行 R 的简单方法。

【问题讨论】:

  • “C:\Users\Charles\SkyDrive\Documents\Development\G4H\Technical evaluation templates\Graphical analysis.R”是什么样的?通常你会使用 RScript 来帮助运行一个脚本。你有没有引用那个 exe?
  • 这是一个相当长的 R 脚本,用于生成各种标准图形。我正在尝试编写一套小程序,允许在 Excel 中收集数据(因为大多数人都有它),然后导出数据摘要以在 R 中处理(因为它的图形比 Excel 好得多) .我正在考虑通过从 Excel 中调用 R 过程来自动化它,而一点 VBA 似乎是显而易见的路线。
  • 你可以从命令行运行它吗?如果是这样,你如何运行它。我不认为你可以像那样“运行”一个 R 文件。通常你有类似Rscript.exe scriptname.R
  • 是的,从命令行运行它可以完美运行。 CL 版本是: rscript "C:\users\Charles ... \Graphical analysis.R" 这运行得很漂亮(令我惊讶),所以它与您所展示的完全一样。我假设必须有一些很好的简单方法可以使用 VBA 从 Excel 内部启动它(而不是距离原始脚本一百万英里)。

标签: r excel vba wsh


【解决方案1】:

您需要将 Rscript 添加到您的路径中,否则 shell 不知道将文件发送到哪个程序。所以修改路径为

path = "rscript C:\Users\Charles\SkyDrive\Documents\Development\G4H\Technical evaluation templates\Graphical analysis.R"

您可能需要提供 rscript 的填充路径,具体取决于该目录是否在您的搜索路径中。

【讨论】:

  • 我正朝着那个方向前进。不幸的是,我们现在已经输入了“目录名称中的 CMD 空格”地狱!是时候开始猜测双引号应该放在哪里了。
【解决方案2】:

我不确定这是否是正确的协议(毫无疑问我会受到一些可怕的惩罚),但感谢弗利克先生和一些关于我的解决方案:

  1. 确保 rscript.exe 在系统路径中。

  2. 试着算出需要多少个引号才能让 Windows 真正理解它是一个目录。

  3. 然后:

    将外壳暗淡为对象 设置 shell = VBA.CreateObject("WScript.Shell") 将 waitTillComplete 调暗为布尔值:waitTillComplete = True 将样式暗淡为整数:样式 = 1 将错误代码调暗为整数 暗淡的路径作为字符串 path = "rscript ""C:\Users\Charles\SkyDrive\Documents\Development\G4H\Technical evaluation templates\Graphical analysis.R""" errorCode = shell.Run(path, style, waitTillComplete)

在处理目录名称中的空格时对 cmd 的可怕解析最终屈服于暴力攻击!

【讨论】:

    【解决方案3】:

    我遇到了同样的问题。更改代码以包含 Rscript.exe 和 R 文件的路径。以下代码对我有用:

    Sub RunRscript()
    'runs an external R code through Shell
    'The location of the RScript is 'C:\R_code'
    'The script name is 'hello.R'
    
    Dim shell As Object
    Set shell = VBA.CreateObject("WScript.Shell")
    Dim waitTillComplete As Boolean: waitTillComplete = True
    Dim style As Integer: style = 1
    Dim errorCode As Integer
    Dim path, p1, p2 As String
    path = "RScript E:\R_Folder\VBA_R.R"
    p1 = "E:\R-3.1.2\bin\x64"
    p2 = "E:\R_Folder"
    errorCode = shell.Run("""" & p1 & "\Rscript.exe"" /filename """ & p2 & "\VBA_R.R"" /delay 10000 /preview /quiet", style, waitTillComplete)
    'errorCode = shell.Run(path, style, waitTillComplete)
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多