1. Создаем небольшую форму и помещаем на нее: надпись с пояснительным текстом (например, "Label1") и две другие надписи, (скажем, «Label2» и "Label3"), низкие и широкие, которые расположим одну над другой (рис. 5.4).
К примеру, их координаты и размеры:
Зададим в качестве фонового цвета для «Label2» — серый, а для «Label3» — зеленый (свойство «BackColor», вкладка "Палитра").
Рис. 5.3.
Рис. 5.4.
2. Для того, чтобы форма появилась на экране, но могла быть модифицируема программно все время своего отображения, в ее код нужно поместить следующий текст:
Private Sub UserForm_Activate()
… остальной текст программы, которая должна выполняться во время отображения ProgressBar'а …
Unload Me
End Sub
Все, что находится в теле этого обработчика, будет выполняться, в то время как форма будет находиться на экране. По окончании выполнения программы форма будет выгружена (хотя выгружать ее не обязательно, если после окончания программы в обработчике предполагается продолжение работы с формой). Однако никакие другие события формой обрабатываться в это время не будут.
3. Идея такова. Ширину третьей надписи «Label3» можно изменять программно. Поэтому для отображения ProgressBar'а надо вставить в код строки, изменяющие ширину этой надписи. К примеру, цикл в программе выполняется
После каждой такой команды надо вставлять инструкцию "Me.Repaint", чтобы перерисовать форму с учетом новых параметров третьей надписи, — автоматической перерисовки до полного отображения формы (которое произойдет, когда кончится обработка события "UserForm_Activate()"и форма не будет выгружена) не происходит. Если форма с ProgressBar'ом должна долго находится на экране без изменений, то рекомендуется почаще использовать команду "Me.Repaint", так как без перерисовки внешний вид формы может быть легко испорчен окнами других приложений, когда пользователь решит воспользоваться ими во время работы макроса.
Итак, код для формы с ProgressBar'ом должен иметь такой вид ("n" — количество необходимых выполнений цикла):
Private Sub UserForm_Activate()
Me.Repaint
For t=1 to n
… … … … необходимые команды программы в цикле … … … …
Label3.Width = ((t / n) * 250)
Me.Repaint
Next t
Unload Me
End Sub
Разумеется, в нем возможны изменения и улучшения. Можно несколько раз использовать ProgressBar в одной форме, каждый раз обнуляя ширину третьей надписи. Можно поместить на одну форму несколько ProgressBar'ов, где один, например, показывает выполнение всего задания, а другой — его текущей части.
Хранение скрытой информации в документе
Иногда автору программы необходимо записать в документ информацию "для внутреннего пользования": например, чтобы при следующей обработке документа программой использовать определенные предыдущие данные.
Можно, конечно, использовать Свойства документа (объект "Dialogs(wdDialogFileSummaryInfo). Comments"), но лучше сделать такую запись с помощью добавления специальной переменной прямо в документ Word:
ActiveDocument.Variables.Add Name:="x1", Value:="Текст"
ActiveDocument.Variables.Add Name:="x2", Value:=12
Прочитать эти переменные можно будет с помощью похожей функции:
y1 = ActiveDocument.Variables("x1"). Value
y2 = ActiveDocument.Variables("x2"). Value
Кроме как с помощью этой функции, значения заданных в документе переменных узнать нельзя никак! Таким способом можно помещать в документ служебную информацию для макросов: сохраненные параметры, скрытые комментарии и и.д. Но не думайте, что для надежного сокрытия секретной информации достаточно поместить ее в переменные документа — с помощью функции
For Each per In ActiveDocument.Variables
Debug.Print per.Name + " " + per.Value
Next per
абсолютно все переменные будут благополучно помещены в окно отладки, где их легко и просто можно просмотреть.