Почему панель загрузки в VBA создается с помощью пользовательских форм для вызова основной подпрограммы, а не наоборот?

Я прочитал немало учебников по созданию панели загрузки или индикатора выполнения с использованием пользовательских форм в VBA, но все они помогают мне выполнить следующие шаги:

  1. Создать кнопку для вызова пользовательской формы
  2. UserForm вызывает подпрограмму
  3. Подпрограмма обновляет панель
  4. Разгрузить бар в подпрограмме

Почему я не могу сделать следующее вместо этого:

  1. Создать кнопку для вызова подпрограммы
  2. Подпрограмма вызывает UserForm
  3. Подпрограмма обновляет панель
  4. Разгрузить бар в подпрограмме

Спасибо за ваше время!

2 ответа

Решение

Ничто не мешает вам делать это таким образом. Код ниже показывает грубый макет необходимого VBA.

Такой подход облегчает повторное использование формы прогресса в других и других проектах. Просто убедитесь, что логика прогресса в подпрограмме отделена от логики отображения внутри формы.

' Event fired by a button on the Excel grid.
Sub Example_OnClick()

    Dim myForm As UserForm1     ' Replace with your form here.


    ' Display the form.
    ' Ensure it is not modal, as this would prevent subsequent lines
    ' from executing while the form is open.
    myForm.Show False

    Do Until myForm.Progress = 100

        ' ToDo: Add processing logic here.

        ' Update the progress bar.
        myForm.IncrementPrgress 1
    Loop

    ' Remove the from
    Unload myForm
End Sub

Чтобы объяснить различия между 2 методами.

Способ 1

  1. Создать кнопку для вызова пользовательской формы
    Мы загружаем модальную форму пользователя (это поведение по умолчанию в Excel), поэтому пользовательская форма находится сверху, и пользователь может взаимодействовать только с этой пользовательской формой, но не с листами Excel, пока форма не будет закрыта.
  2. UserForm вызывает подпрограмму
    Только эта пользовательская форма может вызывать подпрограмму из-за модального режима.
  3. Подпрограмма обновляет панель
  4. Разгрузить бар в подпрограмме

Способ 2

  1. Создать кнопку для вызова подпрограммы

  2. Подпрограмма вызывает UserForm
    Пользовательская форма должна быть загружена без режима. Потому что, если вы загрузите его модально, выполнение подпрограммы остановится на этом этапе, пока форма снова не закроется. Если вы называете это немодальным, то выполнение подпрограммы продолжается, но форма не блокирует листы Excel, и пользователь все еще может редактировать листы, пока форма открыта. Это похоже на параллель Excel и формы вместо формы поверх Excel (модальной).

  3. Подпрограмма обновляет панель
    Подпрограмма продолжается, потому что форма немодальна. Если бы это было модально, подпрограмма остановилась бы, пока форма не закрылась, и вы больше не могли бы обновлять бар
  4. Разгрузить бар в подпрограмме

Итак, как решить, какой метод лучше для вас?

Это зависит от того, хотите ли вы предоставить пользователю доступ к рабочему листу, пока отображается индикатор выполнения (метод 2), или запретите его и сохраните форму поверх Excel (метод 1). Это зависит только от вас, какой подход вам нужен.

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