Windows脚本宿主失败

我正尝试使用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'的方法'运行'失败。

哪一个告诉我什么都没有。 我试着用谷歌search错误消息,但什么都没有。

我已经设置了PATHvariables来包含R和Rscript所在的目录。

我怀疑这是直截了当的,但也有缺乏从Excel执行R的简单方法。

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

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

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

我不确定这是否是正确的协议(毫无疑问,我会受到一些可怕的惩罚),但是由于弗里克先生和一些戳声,我有一个解决办法:

  1. 确保rscript.exe在系统path中。

  2. 试着弄清楚需要多less引号才能让Windows明白它是一个目录。

  3. 然后:

    Dim shell As Object Set = 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 =“rscript”“C:\用户\ Charles \ SkyDrive \ Documents \ Development \ G4H \技术评估模板\graphics分析.R“”“errorCode = shell.Run(path,style,waitTillComplete)

在处理目录名称中的空白时,可怕的cmdparsing最终屈服于暴力攻击!

我有同样的问题。 更改代码以包含Rscript.exe和R文件的path。 下面的代码为我工作:

 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