Для 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.