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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
7 907
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

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

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

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

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

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

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

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

Надеюсь это поможет, Счет.

Другие вопросы по теме