Интернет-журнал "Домашняя лаборатория", 2007 №7
Шрифт:
В Microsoft Excel набора встроенных диалогов нет, однако отобразить на экране окна открытия и сохранения файлов все же можно. Для этого служат команды "Application.GetOpenFilename" и "Application.GetSaveAsFilename". В результате выполнения команды "file = Application.GetOpenFilename" будет отображено окно открытия файла, а после выбора имя файла поместится в переменную (Здесь — "file"). Команда же "rez = Application.GetSaveAsFilename" отобразит окно сохранения файла, в переменную же (здесь — rez) будет помещено True — если сохранение успешно, и False — если нет. Обе команды допускают указание параметров (например, меняющих заголовки окна и других).
* * *
Помимо привычных кнопок и
Рис. 8.5. Выпадающее меню с полем ввода.
Создать такое поле можно только программно — через окно настройки это сделать нельзя (как, впрочем, и удалить их впоследствии). Для такого создания следует в окне отладки или в отдельном модуле выполнить команду
CommandBars(х).Controls.Add Туре:=у
где "х" — номер панели (можно узнать, просто перебрав их все с помощью команды "MsgBox CommandBars(номер).Name" и выяснив, какой номер имеет панель инструментов с нужным названием), а "у" — одна из констант: "msoControlEdit", "msoControlDropdown", "msoControlComboBox", создающие соответственно поле ввода текста, выпадающее меню и выпадающее меню с возможностью ввода текста.
Управлять созданными полями, добавляя, к примеру, в них текст, можно стандартными командами работы с панелями инструментов. Так, чтобы поместить какой-либо текст в поле ввода, следует использовать команду
CommandBars(х).Controls(у).Text = "текст в поле ввода"
где "х" — номер панели, "у" — номер по счету слева направо данного поля среди кнопок этой панели. Таким образом можно использовать эти элементы для отображения нужной пользователю информации. Точно так же — командой "a=CommandBars(х).Controls(у).Text" можно считать информацию из данного поля и использовать ее в работе программы. Следует лишь внимательно следить за соответствием номеров кнопок их реальному расположению, — при изменении порядка кнопок программа может работать неверно. Назначить макрос кнопке, меню или полю ввода можно командой "CommandBars(х). Controls(у).OnAction = "Имя модуля. Имя программы"".
* * *
Если у вас на компьютере установлено несколько версий Microsoft Office, то вы наверняка сталкивались с одной весьма неприятной ситуацией. Все компоненты Microsoft Office, начиная с 2000-й версии, при каждом своем запуске сканируют системный реестр и перепрограммируют открытие файлов, которые должны ими открываться —.doc, xls — "на себя", заставляя их открываться именно в новой версии, а не в старой. Помимо того, что это занимает немало времени, подобная ситуация мешает использовать на компьютере сразу две версии Office, например, для того, чтобы, работая в старой, постепенно осваивая новую или, используя новую версию, не отказываться от возможностей, входящих только в предыдущую.
Для того, чтобы "отучить" Word2002 (из OfficeXP) перерегистрировать расширения файлов при каждом запуске, создайте в системном реестре, в разделе HKEY_CURRENT_USER\Software\Microsoft\0ffice\10.0\word\0ptions параметр NoRereg, имеющий формат Dword и равный 1, а чтобы сделать то же с Word2000, отредактируйте так же содержимое раздела HKEY_CURRENT_USER\Software\ Microsoft\Office\9.0\word\Options.
PROGRESSBAR В ВАШИХ ПРОГРАММАХ
Во
многих программах для Windows используется такой элемент, как ProgressBar — индикатор, показывающий, на сколько продвинулся тот или иной процесс. В частности, он есть практически во всех программах-инсталляторах. К сожалению, в VBA этот элемент отсутствует, но его можно сделать самостоятельно!Выглядеть он будет, например, так, как на рис. 8.6.
Рис. 8.6. ProgressBar в программе на VBA
А делается он следующим образом (предполагается, что у нас есть часть программы, в которой выполняется длинный и долгий цикл: то есть известное нам количество множество однотипных операций, и которую надо снабдить ProgressBar'ом):
1. Создаем небольшую форму и помещаем на нее: надпись с пояснительным текстом (например, "Label1") и две другие надписи, (скажем, "Label2" и "Label3"), низкие и широкие, которые расположим одну над другой (рис. 8.7).
Рис. 8.7. А вот как он сделан
К примеру, их координаты и размеры:
Label2: Тор — 45, Left — 15, Height — 15, Width — 250
Labe13: Top — 45, Left — 15, Height — 15, Width — 0
Зададим в качестве фонового цвета для "Label2" — серый, а для "Label3" — зеленый (свойство "BackColor", вкладка "Палитра" — рис. 8.8).
Рис. 8.8. Выбор фонового цвета для ProgressBar'а — здесь.
2. Для того, чтобы форма появилась на экране, но могла быть модифицируема программно все время своего отображения, в ее код нужно поместить следующий текст:
Private Sub UserForm_Activate
— остальной текст программы, которая должна выполняться во время отображения ProgressBar ' а…
Unload Me
End Sub
Все, что находится в теле этого обработчика, будет выполняться, в то время как форма будет находиться на экране. По окончании выполнения программы форма будет выгружена (хотя выгружать ее не обязательно, если после окончания программы в обработчике предполагается продолжение работы с формой). Однако никакие другие события формой обрабатываться в это время не будут.
3. Идея такова. Ширину третьей надписи "Label3" можно изменять программно. Поэтому для отображения ProgressBar'а надо вставить в код строки, изменяющие ширину этой надписи. К примеру, цикл в программе выполняется п раз. Тогда ширина надписи "Label3" будет определяться командой в теле цикла по формуле "Label3.Width = (scet / п) * 250", где "scet" — это счетчик цикла, а 250 — ширина надписи Label2.
После каждой такой команды надо вставлять инструкцию "Me.Repaint", чтобы перерисовать форму с учетом новых параметров третьей надписи, автоматической перерисовки до полного отображения формы (которое произойдет, когда кончится обработка события "UserForm_Activate" и форма не будет выгружена) не происходит. Если форма с ProgressBar'ом должна долго находится на экране без изменений, то рекомендуется почаще использовать команду "Me.Repaint", так как без перерисовки внешний вид формы может быть легко испорчен окнами других приложений, когда пользователь решит воспользоваться ими во время работы макроса.