Как я могу вызвать долго работающую внешнюю программу из Excel/VBA?

StackOverflow https://stackoverflow.com/questions/135158

Вопрос

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

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

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

Это было полезно?

Решение

Вам следует ознакомиться с этими двумя статьями базы знаний Microsoft.

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top