держать Shell / cmd открытым при запуске R-скрипта из VBA - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть сценарий R, который запускается из книги Excel с помощью кнопки, связанной с сценарием VBA.

Проблема заключается в том, что каждый раз сценарий R сталкивается с ошибкой - скажем, он не находитодин из файлов, которые он должен был прочитать - окно Shell / cmd, в котором запущен R-скрипт, мгновенно закрывается.Проблема в том, что вы не видите никаких подсказок о том, почему это не удалось.Затем мне нужно отладить его вручную, изменив код и запустив в 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

scriptPath указывает путь к сценарию R, а argument - это аргумент, который я передаю сценарию R.

Я попытался передатьобычные аргументы, чтобы держать окно cmd открытым, но мне не удалось понять это.Это также усложняется тем фактом, что, как я уже упоминал, я не очень хорошо понимаю синтаксис VBA, а переменная 'path' очень запутана из-за этих бесконечных двойных кавычек.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Вы можете использовать

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

вместо

errorcode = shell.Run(path, style, waitTillComplete)

Мы открываем новый экземпляр инструмента командной строки, поэтому можем использовать его параметры.Параметр / k k открывает окно cmd (используйте / c, чтобы 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

Если скрипт не удается, я повторно запускаю его, установив для режима отладки значение True в ячейке листа Excel.

0 голосов
/ 27 сентября 2018

Исходя из этого комментария:

@ FreeMan, вывод сценария R на самом деле представляет собой серию книг Excel, которые он открывает, печатает данные и затем сохраняет.он читает список с путями всех файлов, которые ему нужно прочитать, в качестве входных данных для генерации выходных данных, необходимых для печати в Excel.Иногда один из путей в этом списке неверен, поэтому программа останавливается на полпути, и нет понятия, почему для пользователя.(причина может быть и в другом).Было бы хорошо, если бы я мог передать текст, сгенерированный в shell / cmd автоматически, как минимум, в файл блокнота / текстового поля, чтобы пользователь мог открыть и проверить

Звучит как лучшая ставкавозможно, ваш скрипт R проверяет пути / файлы перед попыткой его обработки.Я едва знаком с R, но что я знаю о нем, там должна быть библиотека где-то , которая позволит вам проверить наличие пути и / или файла на этом пути.Если он не существует, скрипт просто поместит сообщение об ошибке в файл, который предполагалось создать / обновить, указывая, что он не может найти запрошенный путь / файл, или он может написать это сообщениев журнал ошибок, который может быть открыт вашим кодом VBA по завершении его обработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...