Как я могу вызвать внешнюю программу из Excel / VBA? - PullRequest
2 голосов
/ 25 сентября 2008

Какой лучший способ запустить внешнюю программу из Excel. Это может продолжаться несколько минут. Какова лучшая практика о том, как это сделать. В идеале,

  1. Диалоговое окно модели, которое позволяет пользователю узнать, что процесс выполняется.
  2. В случае сбоя исполняемого файла пользователь должен получить уведомление.
  3. Тайм-аут должен быть установлен.
  4. В диалоговом окне должна быть кнопка отмены.

Но любые лучшие практики приветствуются. Меня интересуют решения с вызовом .dll или .exe. Желательно что-то, что работает с Excel '03 или более ранней версией, но я бы хотел услышать причину перехода на более позднюю версию.

1 Ответ

5 голосов
/ 26 сентября 2008

Вам следует ознакомиться с этими двумя статьями Microsoft KB

Как запустить приложение Win32 из Visual Basic и

Как использовать 32-разрядное приложение для определения окончания завершенного процесса

Они оба быстро дают вам основу для запуска процесса и проверки его завершения. Каждая из статей базы знаний содержит некоторые дополнительные ссылки, которые могут иметь отношение к делу.

В последней статье базы знаний предполагается, что вы хотите ждать бесконечное количество времени для завершения процесса оболочки.

Вы можете изменить вызов функции ret & = WaitForSingleObject (proc.hProcess, INFINITE), чтобы он возвращался через некоторое конечное время в миллисекундах - замените INFINITE положительным значением, представляющим миллисекунды, и оберните все это в цикле Do While. Возвращаемое значение говорит вам, если процесс завершен или таймер истек. Возвращаемое значение будет равно нулю, если процесс завершен.

Если возвращаемое значение не равно нулю, процесс все еще выполняется, но управление возвращается вашему приложению. В течение этого времени, пока у вас есть положительный контроль над вашим приложением, вы можете определить, обновлять ли какой-либо статус пользовательского интерфейса, проверять отмену и т. Д. Или вы можете повторить цикл снова и подождать еще немного.

Есть даже дополнительные опции, если программа, которую вы обрабатываете, написана вами. Вы можете подключиться к одному из его окон и получить от программы сообщения, которые вы можете прикрепить и использовать в качестве отзыва о состоянии. Это, вероятно, лучше оставить для отдельного предмета, если вам нужно рассмотреть его.

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

Мой общий подход к такого рода нуждам заключается в следующем:

  1. предоставляет пользователю диалоговое окно с немодальным статусом в начале процесса с помощью кнопки отмены, которая при нажатии устанавливает флаг, который будет проверен позже. Предоставление пользователю любого статуса, скорее всего, невозможно, поэтому предоставление ему истекшего времени или одного из этих анимированных GIF-файлов может помочь в управлении ожиданиями.
  2. Запустить процесс
  3. Подождите, пока процесс завершится, разрешив проверку отмены каждые 500 мс
  4. Если процесс завершен, закройте диалоговое окно и продолжайте.
  5. Если процесс не завершен, посмотрите, нажал ли пользователь кнопку «Отмена», и, если это так, отправьте сообщение о закрытии в окно процесса. Это может не сработать и может потребоваться прекращение процесса - будьте осторожны, если вы сделаете это. Лучше всего отказаться от процесса, если он не закроется должным образом. Вы также можете проверить тайм-аут в этот момент и попытаться выбрать тот же путь, как если бы пользователь нажал «Отмена».

Надеюсь, это поможет, Билл.

...