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

2 семестр / vba_2002

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

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

Эта функция не поддерживает аргумент Раздел (который указывает раздел в фа(ше справки).

Данная функция не поддерживает опцию "модальности" (которая позволяет приостановить работу всей системы, пока пользователь не ответит на запрос окна сообщения).

Функция MyMsgBox имеет следующий синтаксис. MyMsgBox(Запрос[, Кнопки] [, Заголовок])

Этот синтаксис полностью соответствует синтаксису функции MsgBox, кроме того, что в первой не поддерживаются два последних аргумента (Справка и Раздел). Кроме того, функция MyMsgBox использует те же предопределенные константы, что и функция MsgBox: vbOKOnly, vbQuestion, v b D e f a u l t B u t t o n l и т.д.

С листингом функции MsgBox можно ознакомиться в диалоговом справочном руководстве, где вы получите более подробную информацию о ее аргументах

Код функции MyMsgBox

Функция MyMsgBox использует диалоговое окно UserForm, которое называется MyMsgBoxForm. Данная функция очень короткая. Ее текст приводится ниже. Основная часть работы выполняется в функции обработки события I n i t i a l i z e (UserForm_Initialize>.

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

Public PromptI As String

Public Buttons1 As Integer

Public Titlel As String

Public UserClick As Integer

Function MyMsgBox(ByVal Prompt As String, _

Optional ByVal Buttons As Integer, __

Optional ByVal Title As String) As Integer

Prompt1 = Prompt

Buttonsl = Buttons

Titlel = Title

MyMsgBoxForm.Show

MyMsgBox = UserClick

End Function

На рис. 15.6 показано действие функции MyMsgBox (для текста сообщения использован другой шрифт).

Рис./5.6.Результатэмуляциифункции MsgBox (в данном случае используется другой шрифт)

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

Ниже приведен код, который запускает функцию.

Prompt = "Хотите удалить содержимое всего диска?" Buttons = vbQuestion + vbYesNo

Title = "У нас проблема"

Ans = MyMsgBox(Prompt, Buttons, Title)

Как это работает

Обратите внимание на использование переменных с глобальной областью действия. Первые три переменные (PromptI, B u t t o n s l и T i t l e l ) представляют аргументы, которые передаются функции. Еще одна переменная (UserClick) указывает значения, возвращаемые функцией. Процедура U s e r F o r m _ I n i t i a l i z e нуждается в способе получения этой информации и отправке ее обратно в функцию. Использование глобальных переменных ( P u b l i c ) является единственной возможностью реализации необходимого механизма.

Диалоговое окно UserForm (рис. 15.7) содержит четыре элемента управления Image (по одному на каждую возможную пиктограмму), три элемента управления CommandButton, a также элемент управления TextBox.

Рис. 15,7, Диалоговое окно UserForm, котороеиспользуется вфункцииMyMsgBox

Процедура U s e r F o r m _ I n i t i a l i z e проверяет значения аргументов и выполняет следующие действия.

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

Определяет, какие кнопки необходимо вывести на экран (остальные кнопки скрываются).

Определяет, какая кнопка является выбранной по умолчанию.

Выравнивает кнопки в диалоговом окне по центру.

Определяет подписи для элементов управления CommandButton.

Определяет расположение текста в диалоговом окне.

МОпределяет необходимую ширину диалогового окна (используется функция API, которая предоставляет информацию о разрешении экрана).

Определяет необходимую высоту диалогового окна.

Отображает диалоговое окно UserForm.

Три дополнительные процедуры обработки событий используются для элементов управления CommandButton. Эти процедуры определяют, на какой из кнопок щелкнул пользователь. После этого присваивается соответствующее значение переменной U s e r C l i c k .

Интерпретация второго аргумента (Кнопки) может оказаться немного сложнее. Этот аргумент выглядит следующим образом:

vbYesNoCancel + VbQuestion + VbDef.au! t B u t t o n 3

400 Глава15.ИспользованиедиалоговыхоконUserForm

Данный аргумент создает окно сообщения с тремя кнопками (Да, Нет и Отмена), отображает пиктограмму со знаком вопроса и делает третью кнопку выбранной по умолчанию. Аргумент равен 547 (3+32+512). Основной трудностью в данном случае может оказаться получение грех фрагментов информации на основе одного числа. Решить данную проблему несложно: преобразуйте числа в двоичную форму и проверьте состояние отдельных битов этого аргумента. Например, число 547 в двоичной форме записывается как 1000100011. Двоичные цифры с 4 по 6 определяют отображаемую пиктограмму, цифры с 8 по 10 определяют отображаемые кнопки, а цифры 1 и 2 определяют кнопку, которая будет выбрана по умолчанию.

Использование функции MyMsgBox

Для того чтобы применить эту функцию в собственном проекте, экспортируйте модуль MyMsgBoxMod и диалоговое окно MyMsgBoxForm. Затем эти два файла можно импортировать в собственный проект.

Немодальное диалоговое окно

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

Excei 2QQ0— это первая версия Excel, в которой поддерживаются пользовательские немодальные диалоговые окна. Таким образом, данная функциональность отсутствует в ранних версиях Excel.

Чтобы отобразить немодальное диалоговое окно UserForm, используйте следующий оператор:

UserForml.Show vbModeless

Слово v b M c d e l e s s является встроенной константой, которая имеет значение 0. Таким образом, представленный далее оператор будет идентичен предыдущему.

UserForml.Show 0

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

Этот пример доступен на Web-узле издательства.

Важным моментом в использовании немодального диалогового окна является определением времени, когда необходимо обновить содержимое диалогового окна. С этой целью в нашем примере используется два события рабочей книги: S h e e t S e l e c t i o n C h a n g e и S h e e t A c t i v a t e . Процедуры обработки этих событий находятся в модуле кода объекта ThisWorkbook.

Обратитесь к главе 18, чтобы получить дополнительную информацию о событиях.

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

401

Рис. 15-8. Этонемодальноедиалоговоеокноостается видимым на экране даже тогда, когда пользователь продолжаетработатьнарабочемлисте

Ниже приведен код процедур обработки событий.

Private Sub Workbook_SheetSelectionChange _ (ByVal Sh As Object, ByVal Target As Range)

Call UpdateBox End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object}

Call UpdateBox

End Sub

Эти процедуры вызывают процедуру UpdateBox, которая представлена ниже.

Sub UpdateBox()

With UserForml

1Проверка активного рабочего листа

If TypeName(ActiveSheet) <> "Worksheet" Then

.iblFormula.Caption = "N/A"

.lblNumFormat.Caption = "N/A"

.lblLocked.Caption = "N/A" Exit Sub

End If

.Caption = "Ячейка: • & ActiveCell.Address{False, False)

1Формула

If ActiveCell.HasFormula Then

.IblFormula.Caption = ActiveCell.Formula

Else

.IblFormula.Caption = "(нет)"

End If

'Числовой формат

.lblNumFormat.Caption = ActiveCell.NumberFormat

'Блокировка

.lblLocked.Caption = ActiveCell.Locked End With

End Sub

Процедура UpdateBox изменяет заголовок диалогового окна UserForm, который отображает адрес активной ячейки. После этого обновляется три элемента управления Label (IblFormula, lblNumFormat и lblLocked).

Ниже приведена информация, которая поможет понять, как работает этот код.

402

Глава 15. Использование диалоговых окон UserForm

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

Код в верхней части процедуры проверяет, является ли рабочий лист активным. Если это не рабочий лист, то элементы управления Label получают заголовок N/A. Диалоговое окно UserForm содержит флажок (Автоматическое обновление), который указывает на необходимость автоматического обновления диалогового окна UserForm.

Рабочая книга использует модуль класса с целью обнаружить два события для всех открытых рабочих книг: SheetSelectionChange и SheetActivate. В результате каждый раз, когда возникают эти события, автоматически выполняется код, который отображает информацию об активной ячейке. Это происходит, если установлен параметр автоматического обновления. Некоторые действия, например, изменение формата значения в ячейке, не приводят к возникновению таких событий. Именно поэтому диалоговое окно содержит кнопку Обновить.

Дополнительная информация о модулях классов изложена в главе 29.

Счетчики зависящих ячеек и ячеек, от которых зависит текущая, отображают данные

только для активного листа. Это ограничение свойств p r e c e d e n t s и D e p e n d e n t s .

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

На рис. 15.9 показана более сложная версия диалогового окна рассмотренного примера (эту версию также можно найти на Web-узле издательства). Данная версия отображает достаточно большое количество дополнительной информации о выделенной ячейке. Пользователи, которые давно используют Excel, могут заметить, что это диалоговое окно напоминает диалоговое окно Info (оно было удалено из Excel несколько лет назад). Кол этого примера слишком велик для того, чтобы приводить его в книге, однако и его, и вложенные комментарии можно просмотреть в примере рабочей книги, который находится на Web-узле.

Рис. 15.9. Это диалоговое окно UserForm отображает информациюобактивнойячейке

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

403

Несколько кнопок с одной процедурой обработки событий

Каждый элемент управления CommandButton в диалоговом окне UserForm должен иметь собственную процедуру обработки события C l i c k . Например, если на форме находится два элемента управления CommandButton, то необходимо создать как минимум две процедуры обработки событий:

Private Sub CommandButtonl_Click() 'Здесь располагается код

End Sub

Private Sub CommandButton2_Click{)

'Здесь располагается код

End Sub

Другими словами, нельзя настроить макрос так, чтобы он выполнялся при щелчке на любой из кнопок CommandButton. Каждая процедура обработки события C l i c k жестко связана с определенным элементом управления CommandButton. Однако можно заставить каждую процедуру обработки события вызывать другой макрос — при этом следует передать параметр, который будет указывать, какая из кнопок нажата. В следующих примерах щелчок на одной из кнопок (CommandButton! и C o m m a n d B u t t o n ) приведет к выполнению одной процедуры E u t t o n C l i c k . Единственный аргумент сообщает процедуре B u t t o n C l i c k , какая из кнопок была нажата.

Если в диалоговом окне UserForm находится несколько элементов управления CommandButton, то создание процедур обработки событий для каждого из элементов управления может оказаться утомительным. Целесообразно использовать единственную процедуру, которая определит, на какой из кнопок произведен щелчок, и в зависимости от этого будет выполнять соответствующие действия.

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

Этот пример доступен на Web-узле издательства.

Процедура

Процесс создания примера рабочей книги состоит из следующих этапов.

1.Создайте пользовательское диалоговое окно и добавьте в него несколько элементов управления CommandButton (пример на Web-узле содержит 16 элементов управления CommandButton). Предположим, что диалоговое окно называется UserForml .

2.Вставьте в проект модуль класса (для этого необходимо выбрать команду Inserts Class Module), назовите его B t n C l a s s и введите следующий код. Вам следует мо-

дифицировать

процедуру But t o n G r o u p _ C l i c k .

Public WithEvents ButtonGroup As MsForms.CommandButton

Private Sub ButtonGroup_Click(}

404

Глава 15, Использование диалоговых окон UserForm

Msg = "Бы телккулм. на

& ButtonGroup.Name & vbCrLf _

& vbCrLf

 

 

Msg =. Msg & "Название:

& ButtonGroup.Caption _

& vbCrLf

 

 

Msg = Msg & "Расстояние слева:

& ButtonGroup.Left _

& vbCrLf

 

 

Msg = Msg & 'Расстояние сверху: " & ButtonGroup.Гор MsgBox Msg, vblnformation, ButtonGroup.Name

End Sub

3.Вставьте обычный модуль YBA и введите приведенный ниже код. Эта процедура используется для отображения диалогового окна UserForm.

Sub ShowDialogl)

UserForml.Show

End Sub

4.В модуле кода диалогового окна UserForm введите код из листинга 15.4. Данная процедура будет запускаться при возникновении события I n i t i a l i z e для диалогового окна UserForm. Обратите внимание, что в коде исключается "реакция" на кнопку с названием OKButton. Таким образом, щелчок на кнопке OKButton не приведет к вызову процедуры ButtonGroup_Click.

Листинг 15.4. Создание массива объектов Button

Dim Buttons() As New BtnClass

Private Sub UserForm_Initialize{J

Dim ButtonCount As Integer

Dim ctl As Control

1Создание объектов Button ButtonCount - 0

For Each ctl In UserForml.Controls

If TypeName(ctl) = "CommandButton" Then

If ctl.Name <> "OKButton" Then 'Пропуск OKButton ButtonCount = ButtonCount + 1

ReDim Preserve Buttons{1 To ButtonCount) Set Buttons(ButtonCount).ButtonGroup = ctl

End If End If

Next ctl End Sub

Puc. 15.10. Процедура ButtanGroup_Cl£ck выводит сообщение с информацией об используемойкнопке

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

405

После выполнения этих инструкций можно запустить процедуру ShowPialog, для того чтобы отобразить диалоговое окно UserForm.. Щелчок на одной из кнопок CommandButton (кроме кнопки ОК) приведет к выполнению процедуры B\ittonGro\ip_Click.. На рис. 15.L0 показано окно сообщения, которое появляется после щелчка на одной из кнопок.

Адаптация кода

Данную методику можно легко адаптировать для работы и с другими элементами управления. Необходимо изменить имя типа в объявлении Public WithEvents. Например, если вместо элементов управления CommandButton используются элементы управления ОрtionButton, то воспользуйтесь следующим оператором декларации:

Public WithEvents ButtonGroup As MsForms.OptionButton

Диалоговое окно выбора цвета

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

Пример представлен одной функцией (GetAColor), которая отображает диалоговое окно UserForm и возвращает выбранное значение цвета.

ДанныйпримертакжесодержитсянаWeb-узлеиздательства.

Ниже приведен код функции GetAColor.

Public ColorValue

As

Variant

Dim Buttons(1 To

56)

As

Mew ColorButtonClass

Function GetAColor{)

As

Variant

'

Отображение формы UserForm и возвращение

'значения цвета или False, если цвет не выбран Dim c t l As Control

Dim -ButtonCount As Integer ButtonCount = 0

For

Each

c t l In UserForml.Controls

1

Здесь

указано 56 кнопок цветов'

1

1

Свойство Tag установлено в значение "ColorButton" If ctl.Tag = "ColorButton" Then

ButtonCount = ButtonCount + 1

Set Buttons(ButtonCount).ColorButton = c t l Получение цветов из активной рабочей книги

Buttons {ButtonCount) . ColorButton , BacJcColor =

ActiveWorkbook.Colors(ButtonCount)

End If

Next c t l

UserForml.Show

GetAColor

= ColorValue

End Function

 

406

Глава 15. Использование диалоговых окон UserForm

Диалоговое окно UserForro содержит 56 элементов управления CommandButton, которые соответствуют различным цветам, полученным из палитры активной рабочей книги.

Доступ к функции GetAColor можно получить с помощью следующего выражения:

UserColor = GetAColor()

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

На рис. 15.П показано диалоговое окно UserForm (в цвете оно выглядит лучше), которое содержит 56 элементов управления CommandButton. Свойство SackColor кажлого элемента управления соответствует одному из цветов палитры активной рабочей книги. Щелчок на одной из кнопок приводит к выгрузке диалогового окна из памяти и передаче значения вызывающейфункции.

Рис. 15.11. Этодиалоговоеокнопозволяетпользователювыбратьцветв результатещелчканакнопке

Файл примера на Web-узле содержит следующие компоненты.

Пользовательское диалоговое окно (UserForml), которое содержит 56 элементов управления CommandButton, а также еще несколько элементов управления.

Модуль класса (ColorButtonClass), который определяет класс Color/Button.

Модуль VBA (Modulel), который содержит процедуру GetAColor.

Два примера, которые демонстрируют использование процедуры GetAColor.

Процедура GetAColor настраивает диалоговое окно UserForm и отображает его на экране. После этого процедура возвращает значение, соответствующее кнопке, на которой щелкнул пользователь. Если пользователь щелкает на кнопке Отмена, то процедура GetAColor возвращает значение False . Когда пользователь перемещает указатель мыши над кнопкой цвета, область Образец отображает цвет, соответствующий этой кнопке.

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

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

В Excel 5 или Excel 95 можно было легко отобразить "интерактивную" диаграмму в пользовательском диалоговом окне (для этого vieпользовался диалоговый лист)', достаточно было скопировать диаграмму и вставить ее на лист. Как ни удивительно, но в диалоговом окне UserForm не существует способа непосредственного отображения диаграммы. Можно, конечно, скопировать диаграмму и добавить ее в свойство P i c t u r e элемента управления Image, но это приведет к созданию статического изображения диаграммы, что не позволяет интерактивно отображать изменения, которые вносятся в исходные данные. Хотя диалогового окна UserForm функционально превосходят старые диалоговые листы, диаграммам в диалоговых окнах не было уделено должного внимания разработчиками фирмы Microsoft.

Этот раздел содержит описание методов отображения диаграмм в диалоговых окнах UserForm,

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

407

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

Метод 1: сохранение диаграммы в виде файла

Тот факт, что Microsoft не позволяет отображать интерактивные диаграммы и диалоговом окне UserForm, совершенно не означает, что этого нельзя добиться! На рис. 15.12 показано диалоговое окно UserForm, в котором диаграмма отображена в виде объекта Image. На самом деле диаграмма находится на листе, а диалоговое окно UserForm отображает самое последнее состояние диаграммы, Описанная методика реализована благодаря копированию диаграммы во временный файл, после чего файл указывается в качестве свойства P i c t u r e элемента управления Image.

Рис. 15.12. Немного волшебства — и диалоговое окно UserForm отображаетинтерактивнуюдиаграмму

Основные этапы

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

1.Создайте диаграмму или диаграммы обычным образом.

2.Вставьте диалоговое окно UserForm и добавьте в него элемент управления Image.

3.Создайте код VBA, который будет сохранять диаграмму в виде файла в формате GIF. После этого в коде необходимо установить свойство P i c t u r e элемента управления Image равным этому файлу. Вам необходимо воспользоваться функцией VBA LoadPic t u r e .

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

Сохранение диаграммы в виде файла в формате GIF

Следующий код демонстрирует создание файла в формате GIF (который называется t e m p . g i f ) на основе диаграммы (в нашем случае первого объекта диаграммы на листе Data).

Set CurrentChart = Sheets("Data").ChartObjects(1)-Chart Fname = ThisWorkbook.Path & "\temp.gif" CurrentChart.Export FileName:=Fname, FilterName:="GIF"

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

408

Глава 15. Использованиедиалоговых окон UserForm

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