я наткнулся на этом аналогичный вопрос и прочитать ответы: Modeless form that still pauses code executionVBA лучших практики для модулей относительно немодального UserForms
, которые я пытался применить в моей ситуации предложения, предоставленное David Zemens. В моей ситуации я не могу найти подход, который включает предложение г-на Земена, не используя также GoTo.
Мне интересно, есть ли лучшее или более элегантное решение.
Вот набросок того, что я делаю:
У меня есть UserForm с командной кнопкой, с которой начинается выполнение кода, который будет выполнять несколько действий на нескольких рабочих книг Excel. Таким образом, существует несколько блоков кода, и успешное завершение одного блока кода позволяет выполнить последующий блок кода.
В определенный момент, в зависимости от ситуации, код может требует ввода пользователем; в других ситуациях необходимые данные можно получить из Excel. Если требуется ввод данных от пользователя, отображается другой UserForm.
Пользователю может потребоваться просмотреть несколько разных листов Excel перед входом на вход, поэтому UserForm не нужен. Таким образом, код останавливается до тех пор, пока Пользователь не войдет в нужный вход и не щелкнет другой кнопкой Command.
В этот момент у меня возникают проблемы: как возобновить поток программы. Есть ли единственный способ «взять туда, где он остановился», используя инструкцию GoTo? Или есть какой-то способ организовать модули, поэтому есть один согласованный поток программ, определенный в одном месте и не дублированный с того момента, когда может потребоваться ввод пользователя?
Трудно предложить лучший способ организовать свои модули/код без предварительного просмотра ваших модулей/кода :). Другая возможность, конечно же, предусматривает способ (во второй пользовательской форме) для самой программы «выбрать» и привести необходимые рабочие листы для просмотра (например, элемент управления ComboBox, содержащий список всех книг/рабочих листов и т. д.). –
Я бы также предположил, что * идеально * вы должны сделать необходимую проверку * до * для выполнения какого-либо кода - какие условия требуют ручного вмешательства? Проверьте эти условия до того, как код * сделает что-либо и что угодно, и предложите пользователю ввести данные в эту точку, при этом завершая время выполнения. Затем, когда пользователь повторно запускает программу, он не должен требовать добавления пользователя (пользователь, предварительно исправляя недостающую информацию) –
Ну, есть много кода, уже написанных и что каждый блок кода сделал По-видимому, это не связано с общим потоком программы. В принципе, имеется командная кнопка, доступная из листа. Это Click-событие вызывает основную функцию в модуле. Эта основная функция содержит вызовы для других функций. Если вызываемая функция успешно выполняется, то фокус возвращается к основной функции, и выполняется следующая строка кода, которая является вызовом следующей функции. –