Função VBA Shell no Office 2011 para Mac

Eu estou tentando iniciar um script de shell de uma macro VBA no Word 2011 para Mac que será executado em uma janela do Terminal. Eu tentei usar a function Shell e a function MacScript , mas o interpretador do VBA não parece encontrar o script em nenhum dos casos.

De acordo com a documentação de referência do VBA, o seguinte deve funcionar:

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

Isso produz um erro em tempo de execução 53 ‘Arquivo não encontrado’.

Alguma sugestão?

A function Shell() VBA no Mac parece exigir o caminho completo como um caminho de estilo HFS (com dois-pontos em vez de barras). Ele também não parece aceitar argumentos como no Windows (reportando um erro ‘Path not found’ se algum argumento for adicionado).

A function VBA do MacScript() também pode ser usada: MacScript("do shell script ""command""") . Esta é provavelmente a opção mais simples e o que eu sugiro fazer. A desvantagem é que tem muita sobrecarga (100-200ms por chamada).

Outra alternativa é a function system() da biblioteca C padrão:

 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 

Veja http://pubs.opengroup.org/onlinepubs/009604499/functions/system.html para documentação.

system() só retorna o código de saída. Se você quiser obter a saída do comando, você pode usar o 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 

Note que vários dos argumentos Long no exemplo acima são pointers, então terão que ser alterados se uma versão de 64 bits do Mac Word for lançada.

Espero que você tenha encontrado a resposta até agora, mas você só precisa do caminho completo:

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

Outro exemplo é algo como:

RetVal = Shell("Macintosh HD:Users:brownj:Documents:" & _ "rnaseq:IGV_2.0.14:igv.sh", vbNormalFocus)

Outro problema se apresenta exatamente assim: as permissions fazem com que o script falhe devido a diferenças entre o ambiente AppleScript e o ambiente bash do usuário. Este Q & A me ajudou a descobrir isso. Para que meu script funcionasse, tive que resolver alguns problemas de caminho e permissions (não o script em si, mas as coisas tocadas pelo script).

Aqui está a minha recomendação, que esperamos que forneça uma melhor percepção durante a sua solução de problemas do que os erros do Excel sem sentido que eu estava vendo antes de usar o AppleScript Editor:

  1. Use o AppleScript Editor para confirmar se o script realmente funciona como qualquer usuário e com qualquer variável de ambiente que seja usada:

    1. No Spotlight, comece a digitar “editor de maçãs” até que ele apareça e clique nele
    2. Criar um novo arquivo do AppleScript Editor
    3. Digite seu script simples no novo arquivo sem dobrar as aspas duplas – o meu lê

       do shell script "parseCsvAndOpen.sh" 
    4. Clique no botão “Executar” para o seu script
    5. Rastreie qualquer problema, faça alterações e repita o botão “Executar” até que ele seja executado no Editor AppleScript
      • A boa notícia é que você tem uma pesquisa mais restrita se precisar voltar ao StackOverflow ou ao Google para obter ajuda 😉
  2. agora copie seu script simples do AppleScript Editor para o seu vba e confirme que ele ainda funciona

    1. Eu era capaz de apenas dobrar minhas aspas e colocá-lo entre aspas após o código do MacScript:

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

      Isso é de fato um, dois e três caracteres de aspas duplas! (presumivelmente fugindo das aspas duplas)

Apenas não há pontos suficientes para fazer um comentário, mas sinto isso como uma adição à resposta de Robin Knights. Créditos, claro, ainda para e para ele. Para o Excel 15.18 (2015), a chamada aberta usada na function system () da biblioteca C padrão não precisa mais da palavra-chave –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 

isso funciona bem. Não testei isso em 2011.