Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2 семестр / vba_2002

.pdf
Скачиваний:
82
Добавлен:
09.04.2015
Размер:
9.9 Mб
Скачать

/*мс. /2.7. Для отображения этогодиалоговогоокнаиспользуетсяфункцияАР!

На Web-уэле издательства содержится файл рабочей книги, демонстрирующей эту процедуру в действии.

Ниже приведен код объявления необходимых функций API, которые приведены в начале модуля рабочей книги. Данная функция использует собственный тип данных — BROWSEINFO.

'Объявление 32-х функций API

Declare Function SHGetPathFromlDList Lib "shell32.dll" Alias "SHGetPathFromlDListA" (ByVal pidl As Long, ByVal _ pszPath As String) As Long

Declare Function SHBrowseForFolder Lib "shell32.dll" _

Alias "SHBrowseForFolderA" (lpBrowselnfо As BROWSEINFO)

As Long

Public Type BROWSEINFO

hOwner As Long pidlRoot As Long

pszDisplayName As String lpszTitle As String ulFlags As Long

lpfn As Long lParam As Long iImage As Long

End Type

После объявлення функции API вводится функция GetDirectory. Function GetDirectory(Optional Msg) As String

Dim blnfo As BROWSEINFO Dim path As String

Dim r As Long, x As Long, pos As Integer

1Корневая папка = Рабочий стол blnfo.pidlRoot = Q&

'Заголовок окна

If IsMissing(Msg) Then

blnfo.lpszTitle = "Выберите папку."

Else

blnfo.lpszTitle = Msg

End If

Часть IV. Работа спользовательскимиформами

' Тип возвращаемой папки blnfo.ulFlags = &H1

1Отображение диалогового окна х = SHBrowseForFolder(blnfo)

' Проверка результата path = Space$(512)

г = SHGetPathFromlDList (ByVal :к, ByVal path) If r Then

pos = InStr(path, Chr$(0)) GetDirectory = Left(path, pos - 1)

Else

GetDirectory = "" End If

End Function

Приведенная ниже простая процедура демонстрирует применение функции G e t D i r e c t o r y в коде VBA. Выполнение этой процедуры приводит к отображению диалогового окна. Как только пользователь щелкнет на кнопке ОК, функция MsgBox отобразит полный путь к выбранной папке. Если пользователь щелкнет на кнопке Отмена, то появится окно с сообщением Отменено.

Sub GetAFolderK)

1 Для Excel 97 и более поздних версий Dim Msg As String

Dim UserFile As String

Msg = "Укажите расположение резервной копии." UserFile = GetDirectory(Msg)

If UserFile = "" Then MsgBox "Отменено"

Else

MsgBox UserFile End If

End Sub

К сожалению, не существует простого способа указать начальную папку или папку по умолчанию.

Применение объекта FileDialog для выбора папки

Если все пользователи, на которых рассчитано приложение, используют Excel 2002, то рекомендуется прибегнуть к более простой методике, в которой применяется объект F i l e D i a l o g .

Объект FileDialog впервые появился в Excel 2002. Таким образом, рассмотренная ниже методика не будет поддерживаться старыми версиями программы Excel.

Представленная ниже процедура отображает диалоговое окно» которое позволяет пользователю выбрать папку. Выбранная папка (или сообщение Отменено) отображается с помощью функции MsgBox.

Sub GetAFolder2() Для Excel 2002

With

Application.FileDialog(msoFileDialogPolderPicker)

 

.InitialFileName = Application.DefaultFilePath & "\"

 

.Title = "Укажите расположение резервной копии"

 

.Show

330

Глава 12. Создание собственных диалоговых окон

If .Selectedltems.Count = 0 Then

MsgBox "Отменено"

Else

MsgBox .Selectedltems(1)

End If

End With

End Sub

Объект F i l e D i a l o g позволяет указать начальную папку. Для этого необходимо задать значение свойства i n i t i a l F i l e N a m e . В нашем случае в качестве начальной папки используется папка сохранения файлов Excel по умолчанию.

Отображение встроенных диалоговых окон Excel

VBA может выполнять команды меню Excel. Если в процессе выполнения кода VBA на экране отображаются диалоговые окна, то в коде можно автоматически "выбирать опции" диалогового окна (хотя при этом само диалоговое окно и не отображается). Например, следующий оператор VBA аналогичен выбору команды Правка^ПереЙТИ, указанию диапазона А1 :СЗ и щелчку на кнопке ОК. Однако в данном случае диалоговое окно Переход не отображается (это именно то, что необходимо).

Application.Goto Reference:=Range("Al:C3")

В некоторых случаях вам может понадобиться отобразить одно из встроенных диалоговых окон Excel, чтобы пользователь мог выбрать в нем необходимые параметры. Для этаго воспользуйтесь одним из двух способов.

Получите доступ к коллекции Dialogs объекта Application .

Непосредственно выберите соответствующую команду меню.

Использование коллекции Dialogs

Коллекция Dialogs объекта A p p l i c a t i o n состоит из 258 элементов, которые представляют большую часть встроенных диалоговых окон Excel. Каждому элементу соответствует предопределенная константа, которая позволяет указать, какое именно диалоговое окно необходимо отобразить. Например, диалоговое окно Excel Переход представлено константой xlDialogFormulaGoto.

Воспользуйтесь методом Show для фактического отображения диалогового окна. Низке приведен пример, в котором отображается диалоговое окно Переход (рис. 12.8). Application.Dialogs(xlDialogFormulaGoto).Show

Когда на экране отображается диалоговое окно Переход, пользователь может указать именованный диапазон или адрес ячейки, к которой необходимо перейти. Указанное диалоговое окно появляется при выборе команды ПравкамПерейти (также можно нажать клавишу <F5>).

Кроме того, вы вправе написать код, который будет определять, как пользователь завершил работу в диалоговом окне. Для этого воспользуйтесь переменной. В представленном ниже опе-

раторе переменная Resul t будет иметь значение True,

если

пользователь щелкнет на кнопке ОК, и False, если он щелкнет

на кнопке Отмена или нажмет клавишу <Esc>:

Рис. 12.8. Это диалоговое окно

 

выведено оператором VBA

Часть IV. Работа с пользовательскими формами

131

Result = Application.Dialogs{xlDialogFormulaGoto}.Show

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

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

При работе с диалоговым окном Переход вы сможете заметить, что при его вызове с помощью VBA кнопка Выделить остается неактивной. Данная кнопка обычно используется для отображения диалогового окна Выделение группы ячеек. Чтобы отобразить -по диалоговое окно посредством кода VBA, воспользуйтесь таким оператором:

Application . Dialogs(xlDialogSelееtSpecial) . Show

Еще одной потенциальной проблемой является невозможность корректного отображения некоторых диалоговых окон с несколькими вкладками. Например, не существует способа отображения диалогового окна Формат ячеек одновременно со всеми вкладками. Вместо этого в VBA представлена возможность отображения каждой вкладки по отдельности. Представленный далее оператор отображает вкладку Выравнивание диалогового окна Формат ячеек (рис. 12.9):

Application.Dialogs(xlDialogAlignment).Show

Для того чтобы отобразить другие вкладки диалогового окна Формат ячеек, воспользуйтесь одной из констант: xlDialogForrnatNumber, xlDialogBorder, x l D i a l o g C e l l - P r o t e c t i o n , x l D i a l o g P a t t e r n s или x l D i a l o g F o n t P r o p e r t i e s . Обратите внимание на отсутствие единого способа именования констант.

Рис. 12.9. Вкладка Выравнивание диалогового окна Формат ячеек

Получение дополнительной информации о встроенных диалоговых окнах

Список всех констант диалоговых окон можно получить в справочной системе или с помощью средства Object Browser. Следуйте приведенным ниже инструкциям для отображения членов коллекции D i a l o g s в окне Object Browser.

1.Активизировав модуль VBA, нажмите клавишу <F2> — будет отображено окно Object

Browser.

2.В диалоговом окне Object Browser выберите в верхней части списка значение Excel .

332

Глава 12. Создание собственных диалоговых окон

3.Введите xlDialog во втором списке.

4.Щелкните на кнопке с изображением бинокля.

Попытка отобразить встроенное диалоговое окно в неверном контексте приведет к ошибке. Например, если выбрать последовательность на графике и попытаться отобразить диалоговое окно xlDialogFontProperties, то будет выдано сообщение об ошибке, так как это диалоговое окно не совместимо с таким типом выделения.

Использование аргументов во встроенных диалоговых окнах

Большая часть встроенных диалоговых окон поддерживает передачу аргументов, которые (обычно) соответствуют элементам управления диалогового окна. Например, диалоговое окно Формат ячеек (вызывается с помощью константы xlDialogCellProtection) принимает два аргумента: locked и hidden. Если необходимо отобразить диалоговое окно с уже установленными флажками, воспользуйтесь следующим оператором.

Application.Dialogs(xlDialogCellProtection).Show True, True

Аргументы для каждого из встроенных диалоговых окон перечисляются в справочной системе к программе VBE. Для того чтобы найти необходимый раздел в справочном руководстве, введите в качестве критерия поиска фразу Built-in Dialog Box Argument List. К сожалению, справочная система не содержит информации о назначении каждого из аргументов.

В соответствии с содержимым найденного раздела диалоговое окно Переход (которое вызывается с помощью константы xlDialogFormulaGoTo) принимает два аргумента: reference и corner. Аргумент reference используется для отображения диапазона по умолчанию в поле Ссылка. Corner — это логическое значение, которое определяет необходимость отображения выбранного диапазона таким образом, чтобы он находился в верхнем левом углу окна. Ниже приведен пример, в котором задействованы оба этих аргумента:

Application.Dialogs(xlDialogFormulaGoto). _ Show Range("Z100"), True

Заметьте, что успешное освоение методов управления коллекции D i a l o g s требует определенного времени, которое необходимо для проверки кода методом многочисленных проб и ошибок.

Непосредственный выбор команды меню

Вторая методика отображения встроенного диалогового окна требует наличия оиределе1-£ных знаний о панелях инструментов (которые официально называются объектами CommandBar). На данный момент достаточно знать, что команду меню можно выбрать программным образом. Это позволяет отображать диалоговое окно с помощью команды меню.

Объекты CommandBar подробно рассматриваются в главах 22-23.

Следующий оператор аналогичен выбору команды Перейти в меню Правка:

Application.CommandBars("Worksheet Menu Bar"). _ Controls("Правка").Controls("Перейти...").Execute

Если выполнить этот оператор, будет отображено диалоговое окно Переход. Обратите внимание, что все названия опций должны полностью совпадать (включая троеточие после Перейти).

ЧастьIV.Работаспользовательскимиформами

333

В отличие от применения коллекции Dialogs, эта методика не позволяет активизировать элементы управления диалогового окна по умолчанию.

ВприведенномвышепримересодержатсяспецифическиедлярусскойверсииExcel ссылкинаобъектCommandBar.Следовательно,этиоператорыбудутработатьтольковрусскоязычнойверсииExcel.Вприложениях,разрабатываемыхдлядругихязыковых версий Excel, можно воспользоваться методом Findcontrol, а также свойствомidкомандыменю.Дополнительнаяинформацияприведенавглаве22.

В предыдущем разделе рассмотрен вопрос доступа к коллекции Dialogs: не существует возможности вывода диалогового окна с несколькими вкладками. Эта проблема будет решена при выводе диалоговых окон в результате программного выбора команд меню. Следующий оператор отображает диалоговое окно Формат ячеек, содержащее все вкладки:

Application.CommandBar^("Worksheet Menu Bar"). _ Controls("Формат").Controls("Ячейки...").Execute

Кстати, метод Execute поддерживается и элементами управления на панелях инструментов, которые не отображают диалоговые окна. Но подобной возможности сложно придумать достойное применение. Эффективнее оперировать свойствами выделенных ячеек, воспользовавшись следующим оператором (изменяет начертание на полужирное):

Selection . Font . Bold = Not Selection . Font - Bold

Резюме

В этой главе рассмотрены некоторые встроенные инструменты VBA и Excel, которые устраняют необходимость создания пользовательских диалоговых окон.

334

Глава 12 Создание собственных диалоговых окон

Использование

пользовательских

форм

Разработчики

приложений Excel всегда имели

возмож-

ность создавать собственные диалоговые окна.

Начиная

с Excel 97, все заметно изменилось. Пользовательские диалоговые окна заменили неуклюжие диалоговые листы, и у разработчиков появилось намного больше возможностей по управлению собственными диалоговыми окнами. Но в целях совместимости Excel 97 и более поздние версии все еще поддерживают старые диалоговые листы Excel 5/95. Хорошей новостью является то, что формы UserForm управляются намного проще и предоставляют широкий набор новых возможностей.

Excel позволяет относительно просто создавать собственные диалоговые окна в разрабатываемых приложениях. На самом деле с их помощью можно повторить внешний вид и поведение практически всех стандартных диалоговых окон Excel. Настоящая глава предлагает обзор возможностей пользовательских диалоговых окон.

Как Excel обрабатывает пользовательские диалоговые окна

Пользовательские диалоговые окна создаются на основе технологии пользовательских форм UserForm, к которым можно получить доступ из редактора Visual Basic.

Ниже приведена стандартная последовательность действий, которой следует придерживаться при создании пользовательского диалогового окна.

1. Вставьте новую форму UserForm в проект VBAProject рабочей книги.

2.Создайте процедуру, которая будет отображать форму UserForm. Эта процедура располагается в модуле кода VBA (а не в модуле кода формы UserForm).

3.Добавьте элементы управления в форму UserForm.

4.Настройте свойства добавленных элементов управления.

5.Создайте процедуры "обработчики событий" для элементов управления. Эти процедуры добавляются в модуль кода UserForm и выполняются при возникновении различных событий (например, при щелчке на кнопке).

Вставка новой формы UserForm

Для того чтобы добавить в проект форму UserForm, запустите VBE (нажмите <Alt+Fl 1>, укажите рабочую книгу в окне проекта и выберите команду Insert^ UserForm). Формы UserForm получат такие имена, как UserForml, UserForm2 и т.д.

Чтобы упростить идентификацию, можно изменить имя формы UserForm. Выберите форму и воспользуйтесь окном Properties для изменения свойства Name (нажмите клавишу <F4>, если окно Properties не отображается на экране). На рис. 13.1 приведен пример окна Properties для новой пустой формы UserForm.

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

Отображение пользовательского диалогового окна

Для того чтобы отобразить пользовательское диалоговое окно на

 

экране, воспользуйтесь методом Show объекта UserForm. Следую-

 

щая процедура, которая добавлена в обычный модуль VBA, отобра-

 

жает на экране форму UserForml.

 

 

Sub

ShowForm

 

 

 

UserForml.Show

 

 

End

Sub

 

 

Пользовательское диалоговое окно будет присутствовать на эк-

 

ране до тех пор, пока его не закроют. Обычно форма UserForm со-

 

держит объект CommandButton., который запускает процедуру за-

 

крытия пользовательского диалогового окна. Процедура может или

 

выгрузить форму UserForm (с помощью команды Unload), или

 

скрыть пользовательское диалоговое окно (с помощью метода Hide

 

объекта UserForm). Эти положения детально рассмотрены далее

Рис. 13.1. Ото Properties

в данной главе.

для пустого пользователь-

Если имя формы UserForm хранится в виде строковой пере-

ского диалогового окна

менной, то можно воспользоваться

методом Add для добавления

 

объекта UserFrom в коллекцию UserForms, после чего применить метод Show коллекции UserForms. Ниже приведен пример, в котором имя объекта UserForm присваивается переменной MyForm, в результате чего на экране отображается пользовательское диалоговое окно.

MyForm - "UserForml" UserForms.Add(MyForm).Show

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

Глава 13. Использованиепользовательскихформ

Добавление элементов управления в пользовательское диалоговое окно

Чтобы добавить элементы управления в форму UserForm, воспользуйтесь окном Toolbox

 

(в VBE отсутствуют команды меню, предназначенные для добавления элементов управления).

 

Если окно Toolbox не отображено на экране, выберите View1^Tool box. Окно Toolbox пока-

 

зано на рис. 13.2.

 

Щелкните на той кнопке в окне Toolbox, которая соответствует добавляемому элементу

 

управления. После этого щелкните внутри диалогового окна для создания элемента управле-

 

ния (используется размер элемента по умолчанию). Также можно щелкнуть

 

на элементе управления и, перетаскивая его границы в диалоговом окне, за-

 

дать необходимый размер в пользовательском диалоговом окне.

 

Рис.13.2-ВоспользуйтесьокномToolboxдлядобавления

 

элементовуправлениявпользовательскоедиалоговоеокно

 

После добавления нового элемента управления ему назначается имя, которое состоит из на-

 

звания типа элемента управления и числового кода. Например, если добавить элемент управле-

 

ния CommandButton в пустую форму UserForm, то этот элемент управления будет называть-

 

ся CommandButton!. Если добавить в окно второй элемент управления CommandButton, то

 

он будет называться CommandButton2-

 

Рекомендуем переименовывать все элементы управления, которые управляются с

 

помощью VBA-кода. Это позволит использовать более описательные имена объек-

 

тов (например, ProductListBox), а не общие последовательно нумерованные на-

 

звания (подобные ListBoxl). Для того чтобы изменить имя элемента управления,

 

воспользуйтесь окном Properties в VBE. Достаточно выделить необходимый объект

 

и ввести новое имя.

 

Доступные элементы управления

 

В следующих разделах кратко описаны элементы управления, доступные в окне Toolbox.

 

Форма UserForm может также содержать другие элементы управления ActiveX.

 

За дополнительной информацией обратитесь к разделу "Настройка панели ин-

 

струментов Toolbox" далее в этой главе.

 

CheckBox

 

Элемент управления CheckBox предоставляег пользователю выбор одного из двух вариантов:

 

да или нет, истина или ложь, включить или выключить и т.д. Если элемент управления CheckBox

 

установлен, то он имеет значение True, в противном случае — значение равно F a l s e .

 

ComboBox

 

Элемент управления ComboBox подобен объекту L i s t B o x . Отличие заключается в том,

 

что ComboBox представляет раскрывающийся список, в котором одновременно отображает-

 

ся только одно значение. Кроме того, пользователю в поле списка разрешено вводить значе-

 

ние, которое не обязательно представляет одну из опций объекта ComboBox.

 

ЧастьIV.Работаспользовательскимиформами

337

CommandButton

Каждое создаваемое диалоговое окно будет иметь как минимум один элемент управления CommandButton. Обычно используются объекты CommandButton, представляющие кнопки ОК и Отмена.

Frame

Элемент управления Frame применяется в качестве оболочки для других элементов управления. Он добавляется в диалоговое окно либо в целях эстетики, либо из соображений логического группирования однотипных элементов управления. Элемент управления Frame потребуется вам в случае, когда диалоговое окно содержит более одного набора элементов управления O p t i o n B u t t o n .

Image

Элемент управления Image используется для представления графического изображения, которое сохранено в отдельном файле или вставляется из буфера обмена. Кроме того, элемент управления Image незаменим при отображении в диалоговом окне логотипа компании. Графическое изображение сохраняется вместе с рабочей книгой. Таким образом, если передать рабочую книгу другому пользователю, то передавать вместе с ней копию графического файла не обязательно.

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

Label

Элемент управления L a b e l отображает текст в диалоговом окне.

ListBox

Элемент управления L i s t B o x предоставляет список опций, из которого пользователь может выбрать один вариант (или несколько). Элемент управления L i s t B o x невероятно гибок в использовании. Например, можно указать диапазон на листе, который содержит элементы списка. Этот диапазон может сосгоить из нескольких столбцов. Кроме того, элемент управления L i s t B o x заполняется опциями также с помощью кода VBA.

MultiPage

Элемент управления M u l t i P a g e позволяет создавать диалоговые окна с несколькими вкладками, которые подобны появляющимся при выборе команды Сервис^Параметры. По умолчанию элемент управления M u l t i P a g e состоит из двух вкладок. Чтобы создать дополнительные вкладки, щелкните правой кнопкой мыши на существующей вкладке и выберите New Page из появившегося на экране контекстного меню.

338

Глава 13. Использование пользовательских форм

Соседние файлы в папке 2 семестр