2012-06-14 3 views
14

Как я могу запустить bash файл с помощью VBA на MAC OSXКак вызвать Баш скрипт из VBA (Excel)

Я попытался следующий код

location = FolderPath(ThisWorkBook.FullName) 

, который возвращает текущий каталог минус файл имя.

следуют

Shell(location &"runmybatch.sh") 

Я сделал это, потому что сценарий Баш находится в той же папке, что и таблицы Excel.

+1

Помогает ли этот вопрос http://stackoverflow.com/questions/6136798/vba-shell-function-in-office-2011-for-mac –

+0

Вам не нужно включать символ «\» между местоположением и имя сценария? Удачи. – shellter

+2

Команде «Шелл» требуется разделение «:», хотя это не проблема. Я пробовал простой вызов Shell с полностью определенным путем, указывающим на файл оболочки bash с режимом 755, в том же каталоге, что и книга Excel, и я всегда получаю отказ в разрешении на отказ. Это похоже на довольно легкую вещь, но я не могу заставить ее работать. –

ответ

1

Я не использовал команду FolderPath, ее, похоже, не используют для меня, поэтому я буду исследовать позже, почему бы и нет. Ниже приведен пример кода, который я тестировал, чтобы убедиться, что можно запустить .sh-файл из OSX Excel.

.sh файл я использовал для тестирования был сделан на моем рабочем столе и содержит только следующую строку: «открытая /Applications/Calculator.app»

Код VBA для вызова .sh из Excel на OSX является ниже:

Dim DesktopFolder As String 
DesktopFolder = MacScript("return (path to desktop folder) as string") 

Dim ScriptFile As String 
ScriptFile = DesktopFolder & "test.sh" 

RetVal = Shell(ScriptFile, vbNormalFocus) 

я решил проверить, если его только функционал на определенных папках, так что я переехал .sh файл в папку/TMP и не может выполнить файл, просто был «файл не найден ошибок» независимо от того, как Я закодировал путь. Наконец, понял, что файл/tmp на OSX является символической ссылкой, которая отображается в/private/tmp, и когда я использовал этот путь, все это, похоже, снова работает отлично.

Dim ScriptFile As String 
ScriptFile = "Macintosh HD:private:tmp:test.sh" 
RetVal = Shell(ScriptFile, vbNormalFocus) 

В любом случае, надеюсь, что это поможет. Я буду продолжать искать лучший способ, нужно что-то, чтобы динамически находить, что местоположение файла надежно.

0

У меня нет MS Office для Mac, поэтому я не могу проверить ответ, который я предлагаю. Я полагаю, что должно быть возможно вызывать Bash двоичный файл (то есть/bin/bash) и передать имя скрипта, который вы хотите выполнить в качестве аргумента. Это позволит избежать любых проблем с битами разрешения и будет гарантировать, что имя пути для второго аргумента является обычным Unix-style/-separated. Для первого аргумента может быть достаточно вызвать bash по его имени без какого-либо пути, так как это должно использовать переменную среды PATH.

В общем, и до сих пор без тестирования, я хотел бы попробовать это:

Shell("bash runmybatch.sh") 

Или, если это не работает из-за неправильного рабочего каталога,

Shell("bash '" & location & "/runmybatch.sh'") 

где расположение/-сепарализованный путь к каталогу книги. Кавычки sngle должны заботиться о любых пробелах или других экзотических персонажах на пути.

3

Есть несколько сюрпризов, которые делают это сложнее!

  1. Shell функция ожидает пути должны быть разделены :, не /
  2. При выполнении сценария, он будет иметь корень (/) каталог в качестве рабочего каталога

Помимо этого вы должны иметь возможность запускать скрипт bash с помощью команды Shell. Ниже приведены пошаговые инструкции, которые помогут вам начать работу.

  • Создайте следующий Баш скрипт в каталоге Desktop и назовите его test.sh:
#!/bin/bash 
open /Applications/Calculator.app/ 
  • Убедитесь test.sh исполняемым (от терминала окно, chmod + x test.sh)
  • Попробуйте ru (тип ./test.sh в терминале). Появится приложение калькулятора. Выходите.
  • Запуск Excel и создание новой книги, Workbook1.
  • Сохранить пустой книги в каталоге Desktop как с поддержкой макросов книги
  • Run VB: Tools> Macro> Visual Basic Editor
  • Если немедленное окно не отображается, View> Immediate Window
  • В ближайшем окне введите следующий код VBA:
Shell ActiveWorkbook.Path & ":test.sh" 
  • Приложение калькулятор должен работать.
2

Я не везло с командой оболочки, но вот то, что работало на меня через AppleScript в Excel 2011:

script_s = "do shell script ""/Users/user/path/to/script/rubyscript_09.rb""" 
MacScript script_s 

я счел необходимым иметь сценарий использовать хижину из «#!/usr/bin/env ruby» (после установки рубинового версии менеджера)

Для решения файла, который находится в подпапке папки вызывающего файла, используйте:

FilePathName_s = ThisWorkbook.Path & ":subfolder:filename" 

Это возвращает путь с :, по моему мнению, должен быть преобразован в / для do shell script.Это можно сделать с помощью AppleScript, quoted form of POSIX path of FilePathName_s или с помощью VBA FilePathName_s = "/" & Replace(FilePathName_s, ":", "/")

1

У меня также возникла проблема с тем, что мой простой скрипт bash работал, хотя я имел его на глобальном пути (/ usr/bin), и все пользователи имели читать и выполнять разрешения. Две вещи вызвали сбой моего сценария: разрешения и пути из-за различий между средой AppleScript и средой bash моего пользователя. Я нашел обсуждение в VBA Shell function in Office 2011 for Mac более полезным при решении моей проблемы. Вот процесс, в который я в конце концов обосновался.

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

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

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

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

    1. Я был в состоянии просто удвоить свои двойные кавычки и поставить его в двойных кавычках после кода MacScript:

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

      это действительно один, два, а затем три двойных Цюй ote символов! (Предположительно, спасаясь двойные кавычки)

0

Что вам нужно сделать, это написать следующую команду в вашем VBA макросов:

Shell "C:Path\to\script\location\script.sh" 

(Не забудьте включить двойные кавычки вокруг пути)

Лучший способ получить местоположение вашего сценария - записать макрос, чтобы сохранить книгу в той же папке, где находится ваш сценарий bash. Таким образом, вы можете позже увидеть, как Excel вызывает этот путь и копирует/вставляет его в команду оболочки выше.

+0

, который не будет работать на OSX – ekkis

1

Сначала отличный учебник Joel не работал для меня (на OS X 10.11.6 и Excel для Mac 2011).После некоторого слежения я обнаружил, что моя проблема вызвана «расширенными атрибутами» в файле сценария test.sh. В терминале ls -l test.sh выходы:

[email protected] 1 tgk staff 456 Mar 16 13:12 test.sh 

Обратите внимание, что «@» указывает на наличие расширенных атрибутов файлов. Более подробная информация приведена в результате применения ls [email protected] test.sh, что дает:

[email protected] 1 tgk staff 456 Mar 16 13:12 test.sh 
     com.apple.FinderInfo 32 
     com.apple.TextEncoding  15 

Другими словами, в зависимости от того, как файл был создан, он может или не может иметь расширенные атрибуты. Поэтому я снял расширенные атрибуты через xattr -c test.sh, а затем звонок Джоэла: Shell ActiveWorkbook.Path & ":test.sh" работал отлично! Огромное спасибо всем.

____

я позже узнал, что сохранение скрипта без написания расширенных атрибутов можно в TextWrangler от первого вызова defaults write com.barebones.textwrangler WriteExtendedAttributes never в терминале. Однако это предотвращает добавление атрибута com.apple.FinderInfo; атрибут com.apple.TextEncoding остается. К счастью, однако, команда Joel's VBA Script теперь работает, когда скрипт оболочки имеет только расширенный атрибут com.apple.TextEncoding! Итак, TextWrangler - редактор для меня!