Индикатор выполнения в VBA Excel - PullRequest
62 голосов
/ 03 марта 2011

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

РЕДАКТИРОВАТЬ : Моя проблема с элементом управления progressbar, я не вижу полосу «Прогресс». Это просто завершается, когда форма всплывает. Я использую цикл и DoEvent, но это не работает. Кроме того, я хочу, чтобы процесс запускался повторно, а не один раз.

Ответы [ 13 ]

1 голос
/ 27 апреля 2018

Было много других замечательных постов, однако я хотел бы сказать, что теоретически вы должны иметь возможность создать REAL элемент управления индикатора выполнения:

  1. Используйте CreateWindowEx() для создания индикатора выполнения

Пример C ++:

hwndPB = CreateWindowEx(0, PROGRESS_CLASS, (LPTSTR) NULL, WS_CHILD | WS_VISIBLE, rcClient.left,rcClient.bottom - cyVScroll,rcClient.right, cyVScroll,hwndParent, (HMENU) 0, g_hinst, NULL);

hwndParent Должен быть установлен в родительское окно. Для этого можно использовать строку состояния или пользовательскую форму! Вот структура окна Excel, найденная из Spy ++:

enter image description here

Следовательно, это должно быть относительно просто с использованием функции FindWindowEx().

hwndParent = FindWindowEx(Application.hwnd,,"MsoCommandBar","Status Bar")

После создания индикатора выполнения вы должны использовать SendMessage() для взаимодействия с индикатором:

Function MAKELPARAM(ByVal loWord As Integer, ByVal hiWord As Integer)
    Dim lparam As Long
    MAKELPARAM = loWord Or (&H10000 * hiWord)
End Function

SendMessage(hwndPB, PBM_SETRANGE, 0, MAKELPARAM(0, 100))
SendMessage(hwndPB, PBM_SETSTEP, 1, 0)
For i = 1 to 100
    SendMessage(hwndPB, PBM_STEPIT, 0, 0) 
Next
DestroyWindow(hwndPB)

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

0 голосов
/ 24 ноября 2016

Решение, опубликованное @eykanal, может оказаться не самым лучшим, если у вас есть огромный объем данных, с которыми приходится иметь дело, так как включение строки состояния замедлит выполнение кода.

Следующая ссылка объясняет хороший способ построения индикатора выполнения. Хорошо работает с большим объемом данных (~ 250K записей +):

http://www.excel -easy.com / VBA / примеры / прогресс-indicator.html

0 голосов
/ 09 апреля 2014

Хорошая диалоговая форма прогресса, которую я искал. прогрессбар от alainbryden

очень прост в использовании и хорошо выглядит.

edit: ссылка работает только для premium пользователей сейчас: /

здесь хороший альтернативный класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...