从VBA运行R脚本

Joy*_*yce 11 vba r

如何从VBA运行R脚本?假设我有一个R脚本存储为C:\ XXX\testR.R

我尝试使用Shell,但不太成功.

Die*_*nne 20

Public Sub RunRTest()
  Shell ("Rscript test.r")
End Sub
Run Code Online (Sandbox Code Playgroud)


小智 9

请注意小心文件位置,可能需要更明确的Shell dim语句....例如,在VB中替换这些行

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 = """" & Cells.Range("RhomeDir") & """ """ & Cells.Range("MyRscript") & """"

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

其中,在Excel中,具有命名引用的单元格RhomeDir包含文本

C:\Program Files\R\R-3.2.3\bin\x64\rscript

MyRscript 包含文字 C:/Documents/Rworkings/Rscripttest.s

注意到unix R反斜杠和.s或.r后缀和VB用""替换""以在路径表达式中给出双括号(加上更多的外括号来表示字符串).在文件名中也有空格也不是一个好主意.

通过搜索VBA shell找到了上面shell命令的完整昏暗语法.


Ibo*_*Ibo 7

我把所有东西都放在一个可以轻松调用的函数中。输出是 shell.run 的输出,它是一个整数:

运行 R 脚本的函数:

Function Run_R_Script(sRApplicationPath As String, _
                        sRFilePath As String, _
                        Optional iStyle As Integer = 1, _
                        Optional bWaitTillComplete As Boolean = True) As Integer

    Dim sPath As String
    Dim shell As Object

    'Define shell object
    Set shell = VBA.CreateObject("WScript.Shell")

    'Wrap the R path with double quotations
    sPath = """" & sRApplicationPath & """"
    sPath = sPath & " "
    sPath = sPath & sRFilePath

    Run_R_Script = shell.Run(sPath, iStyle, bWaitTillComplete)
End Function
Run Code Online (Sandbox Code Playgroud)

调用方式示例:

Sub Demo()
    Dim iEerrorCode As Integer
    iEerrorCode = Run_R_Script("C:\Program Files\R\R-3.4.4\bin\x64\rscript","C:\Ibos\R\WF_Metrics\Abe.R")
End Sub
Run Code Online (Sandbox Code Playgroud)

或者

Sub Demo()
    Dim iEerrorCode As Integer
    Dim WS as WorkSheet

    Set WS=ThisWorkBook.Worksheets("Sheet1")
    iEerrorCode = Run_R_Script(WS.Range("A1"),WS.Range("A2")) 'cell A1=adderess of R application and cell A2 is the address of your R file, one can use a named range too
End Sub
Run Code Online (Sandbox Code Playgroud)