Функция оболочки VBA в Office 2011 для Mac - PullRequest
15 голосов
/ 26 мая 2011

Я пытаюсь запустить скрипт оболочки из макроса VBA в Word 2011 для Mac, который будет запускаться в окне терминала.Я попытался использовать как функцию Shell, так и функцию MacScript, но интерпретатор VBA, похоже, не может найти сценарий ни в одном из случаев.справочная документация, должно работать следующее:

 RetVal = Shell("Macintosh HD:Applications:Calculator.app", vbNormalFocus)

Это приводит к ошибке времени выполнения 53 «Файл не найден».

Есть предложения?

Ответы [ 4 ]

18 голосов
/ 07 сентября 2012

Для Shell() функции VBA на Mac требуется полный путь в виде пути в стиле HFS (с двоеточиями вместо косых черт).Он также не принимает аргументы, как в Windows (сообщая об ошибке «Путь не найден», если добавлены какие-либо аргументы).

Можно также использовать функцию MacScript() VBA: MacScript("do shell script ""command"""),Вероятно, это будет самый простой вариант, и я бы предложил сделать.Недостатком является то, что у него довольно много служебных данных (100-200 мс на вызов).

Другой альтернативой является функция system() из стандартной библиотеки C:

Private Declare Function system Lib "libc.dylib" (ByVal command As String) As Long

Sub RunSafari()
    Dim result As Long
    result = system("open -a Safari --args http://www.google.com")
    Debug.Print Str(result)
End Sub

См. http://pubs.opengroup.org/onlinepubs/009604499/functions/system.html для документации.

system() возвращает только код выхода.Если вы хотите получить выходные данные команды, вы можете использовать popen().

Private Declare Function popen Lib "libc.dylib" (ByVal command As String, ByVal mode As String) As Long
Private Declare Function pclose Lib "libc.dylib" (ByVal file As Long) As Long
Private Declare Function fread Lib "libc.dylib" (ByVal outStr As String, ByVal size As Long, ByVal items As Long, ByVal stream As Long) As Long
Private Declare Function feof Lib "libc.dylib" (ByVal file As Long) As Long

Function execShell(command As String, Optional ByRef exitCode As Long) As String
    Dim file As Long
    file = popen(command, "r")

    If file = 0 Then
        Exit Function
    End If

    While feof(file) = 0
        Dim chunk As String
        Dim read As Long
        chunk = Space(50)
        read = fread(chunk, 1, Len(chunk) - 1, file)
        If read > 0 Then
            chunk = Left$(chunk, read)
            execShell = execShell & chunk
        End If
    Wend

    exitCode = pclose(file)
End Function

Sub RunTest()
    Dim result As String
    Dim exitCode As Long
    result = execShell("echo Hello World", exitCode)
    Debug.Print "Result: """ & result & """"
    Debug.Print "Exit Code: " & str(exitCode)
End Sub

Обратите внимание, что некоторые из аргументов Long в приведенном выше примере являются указателями, поэтому их придется изменить, есливыпущена 64-битная версия Mac Word.

6 голосов
/ 01 ноября 2011

Надеюсь, вы уже нашли ответ, но вам нужен полный путь:

RetVal = Shell("Macintosh HD:Applications:Calculator.app:" & _
              "Contents:MacOS:Calculator", vbNormalFocus)

Еще один пример:

RetVal = Shell("Macintosh HD:Users:brownj:Documents:" & _
              "rnaseq:IGV_2.0.14:igv.sh", vbNormalFocus)
2 голосов
/ 04 января 2014

Другая проблема выглядит именно так: разрешения приводят к сбою сценария из-за различий между средой AppleScript и средой bash вашего пользователя.Это вопросы и ответы помогли мне понять это.Чтобы заставить мой сценарий работать, мне пришлось решить некоторые проблемы с путями и разрешениями (не сам сценарий, а вещи, которые затронуты сценарием).

Вот моя рекомендация, которая, как мы надеемся, даст лучшее понимание во время устранения неполадок, чембессмысленные ошибки Excel, которые я видел до того, как использовал AppleScript Editor:

  1. Используйте AppleScript Editor, чтобы убедиться, что скрипт действительно работает как любой пользователь и с любой переменной среды, которая будет использоваться:

    1. В Spotlight начните вводить «редактор appleScript», пока он не появится, а затем щелкните по нему
    2. Создайте новый файл редактора AppleScript
    3. Введите свой простой скриптв новый файл без удвоение двойных кавычек - моя читает

      do shell script "parseCsvAndOpen.sh"
      
    4. Нажмите кнопку «Выполнить» для вашего сценария
    5. Отслеживайте любые проблемы,внесите изменения и повторяйте нажатие кнопки «Выполнить», пока не запустите ее из редактора AppleScript
      • Хорошие новости здесьЕсли у вас более узкий поиск, если вам нужно вернуться в StackOverflow или в Google за помощью; -)
  2. Теперь скопируйте ваш простой скрипт из AppleScriptОтредактируйте ваш vba и подтвердите, что он все еще работает

    1. Мне удалось просто удвоить свои двойные кавычки и поместить их в двойные кавычки после кода MacScript:

      MacScript "do shell script ""parseCsvAndOpen.sh"""
      

      Это действительно один, два, а затем три символа двойной кавычки!(предположительно, избегая двойных кавычек)

1 голос
/ 18 февраля 2016

Просто недостаточно очков, чтобы сделать комментарий, но почувствуйте это как дополнение к ответу Робин Найтс. Кредиты, конечно, еще и для него.
Для Excel 15.18 (2015) вызов open, используемый в функции system() из стандартной библиотеки C, больше не нуждается в ключевом слове --args:

Private Declare Function system Lib "libc.dylib" (ByVal command As String) As Long

Sub RunSafari()
    Dim result As Long
    result = system("open -a Safari http://www.google.com")
    Debug.Print Str(result)
End Sub

Это отлично работает. Не проверял это до 2011 года.

...