- •Об авторе
- •Введение
- •Глава 1. Excel 2010: история программы
- •Краткая история электронных таблиц
- •Все начиналось с VisiCalc
- •Quattro Pro
- •Microsoft Excel
- •Почему программа Excel так удобна разработчикам
- •Место Excel в стратегии Microsoft
- •Объектное мышление
- •Рабочие книги
- •Рабочие листы
- •Листы диаграмм
- •Листы макросов XLM
- •Пользовательский интерфейс Excel
- •Ввод данных
- •Формулы, функции и имена
- •Выделение объектов
- •Форматирование
- •Глава 3. Особенности формул
- •О формулах
- •Вычисление формул
- •Ссылки на ячейки и диапазоны
- •Зачем нужны неотносительные ссылки
- •Ссылки на другие листы или рабочие книги
- •Применение имен к существующим ссылкам
- •Пересечение имен
- •Присвоение имен столбцам и строкам
- •Определение области действия
- •Присвоение имен константам
- •Присвоение имен объектам
- •Ошибки в формулах Excel
- •Формулы массивов
- •Пример формулы массива
- •Создание календаря с помощью формулы массива
- •Достоинства и недостатки формул массивов
- •Примеры формул суммирования
- •Другие инструменты подсчета
- •Работа со значениями даты и времени
- •Использование дат до 1900 года
- •Создание мегаформул
- •Глава 4. Файлы Excel
- •Запуск Excel
- •Типы файлов
- •Форматы файлов Excel
- •Форматы текстовых файлов
- •Форматы файлов баз данных
- •Другие форматы файлов
- •Создание шаблонов
- •Создание шаблонов рабочих книг
- •Файл XLB
- •Файлы надстроек
- •Настройки Excel
- •Глава 5. Приложения электронных таблиц
- •О приложениях электронных таблиц
- •Разработчик и конечный пользователь
- •Кто такие разработчики и чем они занимаются
- •Классификация пользователей электронных таблиц
- •Для кого предназначены приложения электронных таблиц
- •Решение проблем с помощью Excel
- •Основные типы электронных таблиц
- •Однопользовательские приложения
- •Приложения-утилиты
- •Надстройки с функциями рабочих листов
- •Одноблоковые бюджеты
- •Электронные таблицы для хранения данных и доступа к ним
- •Клиентские приложения баз данных
- •Глава 6. Принципы разработки приложений электронных таблиц
- •Этапы разработки приложения
- •Определение потребностей пользователя
- •Проектирование приложения с учетом потребностей пользователя
- •Определение удобного пользовательского интерфейса
- •Работа с конечным пользователем
- •Тестирование приложения
- •Создание привлекательных и интуитивно понятных приложений
- •Документирование усилий, затраченных на разработку
- •Распространение приложения среди пользователей
- •Обновление приложения
- •Другие вопросы разработки приложений
- •Версия Excel, установленная у пользователя
- •Трудности, касающиеся поддержки языка
- •Видеорежимы
- •Глава 7. Введение в VBA
- •Основы языка BASIC
- •Обзор VBA
- •Объектные модели
- •Сравнение VBA и XLM
- •Основы VBA
- •Работа с Project Explorer
- •Добавление нового модуля VBA
- •Удаление модуля VBA
- •Экспорт и импорт объектов
- •Работа с окнами кода
- •Сворачивание и восстановление окон
- •Сохранение кода VBA
- •Ввод кода VBA
- •Настройка среды VBE
- •Что записывается
- •Параметры записи
- •Улучшение записанных макросов
- •Об объектах и коллекциях
- •Иерархия объектов
- •О коллекциях
- •Ссылки на объекты
- •Свойства и методы
- •Свойства объекта
- •Методы объекта
- •Свойства объекта Comment
- •Методы объекта Comment
- •Коллекция Comments
- •Работа с объектами Range
- •Свойство Range
- •Свойство Offset
- •Что следует знать об объектах
- •Важные концепции для запоминания
- •Узнайте больше об объектах и свойствах
- •Обзор элементов и конструкций VBA
- •Комментарии
- •Переменные, типы данных и константы
- •Определение типов данных
- •Объявление переменных
- •Работа с константами
- •Операторы присваивания
- •Массивы
- •Объявление массивов
- •Объявление многомерных массивов
- •Объявление динамических массивов
- •Объектные переменные
- •Пользовательские типы данных
- •Встроенные функции
- •Управление объектами и коллекциями
- •Конструкция With - End With
- •Конструкция For Each - Next
- •Контроль за выполнением кода
- •Конструкция Select Case
- •Циклическая обработка инструкций
- •Глава 9. Работа с процедурами VBA
- •О процедурах
- •Объявление процедуры Sub
- •Область действия процедуры
- •Выполнение процедуры
- •Выполнение процедуры с помощью ленты
- •Выполнение процедуры из пользовательского контекстного меню
- •Выполнение процедуры из другой процедуры
- •Выполнение процедуры по щелчку на объекте
- •Выполнение процедуры по событию
- •Выполнение процедуры в окне отладки
- •Передача аргументов процедурам
- •Обработка ошибок
- •Перехват ошибок
- •Реальный пример
- •Цель
- •Требования к проекту
- •Исходные данные
- •Подход
- •Что необходимо знать
- •Написание кода
- •Создание процедуры сортировки
- •Устранение проблем
- •Доступность
- •Глава 10. Создание функций
- •Процедуры и функции
- •Назначение пользовательских функций
- •Простой пример функции
- •Анализ пользовательской функции
- •Синтаксис функции
- •Область действия функции
- •Аргументы функций
- •Примеры функций
- •Функции без аргументов
- •Функция с одним аргументом
- •Функция с двумя аргументами
- •Функция с аргументом в виде массива
- •Функция с необязательными аргументами
- •Функция VBA, возвращающая массив
- •Функция с неопределенным количеством аргументов
- •Расширенные функции для работы с датами
- •Отладка функций
- •Определение категории функции
- •Использование надстроек для хранения пользовательских функций
- •Использование функций Windows API
- •Примеры функций Windows API
- •Определение папки Windows
- •Определение состояния клавиши <Shift>
- •Дополнительная информация о функциях Windows API
- •Учимся на примерах
- •Работа с диапазонами
- •Копирование диапазона
- •Перемещение диапазона
- •Подсчет выделенных ячеек
- •Определение типа выделенного диапазона
- •Удаление всех пустых строк
- •Дублирование строк
- •Чтение и запись диапазонов
- •Перенесение одномерных массивов
- •Перенесение диапазона в массив типа Variant
- •Выбор ячеек по значению
- •Копирование несмежных диапазонов
- •Управление рабочими книгами и листами
- •Сохранение всех рабочих книг
- •Синхронизация рабочих книг
- •Методы программирования на VBA
- •Переключение значения булева свойства
- •Определение количества страниц для печати
- •Отображение списка шрифтов
- •Обработка последовательности файлов
- •Полезные функции для программ VBA
- •Функция FileExists
- •Функция FileNameOnly
- •Функция PathExists
- •Функция RangeNameExists
- •Функция SheetExists
- •Получение значения из закрытой рабочей книги
- •Полезные функции в формулах Excel
- •Получение информации о форматировании ячейки
- •Беседа с рабочим листом
- •Отображение даты сохранения файла или вывода файла на печать
- •Основы иерархии объектов
- •Подсчет количества ячеек между двумя значениями
- •Соответствует ли строка шаблону
- •Возвращение из строки n-го элемента
- •Возвращение максимального значения всех рабочих листов
- •Возвращение массива случайных целых чисел без повторов
- •Расположение значений диапазона в произвольном порядке
- •Определение текущего видеорежима
- •Чтение и запись параметров системного реестра
- •Глава 12. Создание собственных диалоговых окон
- •Перед созданием диалоговых окон...
- •Использование окон ввода данных
- •Функция VBA MsgBox
- •Отображение формы ввода данных с помощью VBA
- •CommandButton
- •Frame
- •Image
- •Label
- •ListBox
- •MultiPage
- •OptionButton
- •RefEdit
- •ScrollBar
- •SpinButton
- •TabStrip
- •TextBox
- •ToggleButton
- •Настройка элементов управления пользовательского диалогового окна
- •Общие свойства
- •Отображение пользовательского диалогового окна
- •Отображение немодальной формы
- •Отображение пользовательского диалогового окна на основе значения переменной
- •Загрузка пользовательского диалогового окна
- •О процедурах обработки событий
- •Закрытие пользовательского диалогового окна
- •Пример создания пользовательского диалогового окна
- •Создание пользовательской формы
- •Создание кода для отображения диалогового окна
- •Проверка правильности введенных данных
- •События объекта UserForm
- •События объекта UserForm
- •События элемента управления SpinButton
- •Ссылка на элементы управления пользовательского диалогового окна
- •Настройка панели инструментов Toolbox
- •Добавление новых страниц
- •Настройка или комбинирование элементов управления
- •Вопросы для самоконтроля
- •Создание заставки
- •Отключение кнопки закрытия пользовательского диалогового окна
- •Изменение размера диалогового окна
- •Добавление опций в элемент управления ListBox
- •Определение выделенного элемента списка
- •Определение нескольких выделенных элементов списка
- •Работа с многоколоночными элементами управления ListBox
- •Использование элемента управления ListBox для выделения строк на листе
- •Использование элемента управления ListBox для активизации листа
- •Использование внешних элементов управления
- •Глава 15. Дополнительные приемы работы с пользовательскими формами
- •Отображение индикатора текущего состояния
- •Создание мастеров
- •Программирование зависимостей
- •Выполнение задачи
- •Имитация работы функции MsgBox
- •Несколько кнопок с одной процедурой обработки событий
- •Глава 16. Разработка утилит Excel с помощью VBA
- •Об утилитах Excel
- •Создание утилит с помощью VBA
- •Признаки хорошей утилиты
- •Утилита Text Tools
- •Рабочая книга утилиты
- •Как работает утилита
- •Оценка проекта
- •Принципы работы утилиты
- •Дополнительно об утилитах Excel
- •Глава 17. Работа со сводными таблицами
- •Вводный пример
- •Просмотр созданного кода
- •Код сводной таблицы
- •Создание обратной сводной таблицы
- •Кратко о диаграммах
- •Создание внедренной диаграммы
- •Размещение диаграммы на листе диаграммы
- •Активизация диаграммы с помощью кода VBA
- •Деактивизация диаграммы
- •Определение активности диаграммы
- •Изменение размеров и выравнивание диаграмм
- •Экспорт диаграммы
- •События диаграмм
- •Поддержка событий для встроенных диаграмм
- •Тонкости создания диаграмм
- •Печать встроенных диаграмм на всю страницу
- •Отображение/сокрытие рядов данных
- •Создание фиксированной диаграммы
- •Анимирование диаграмм
- •Прокрутка диаграммы
- •Глава 19. Концепция событий Excel
- •Типы событий Excel
- •Понимание последовательности событий
- •Отключение событий
- •Ввод кода процедуры обработки события
- •События уровня объекта Workbook
- •Событие Open
- •Событие Activate
- •Событие SheetActivate
- •Событие NewSheet
- •Событие Deactivate
- •Событие BeforePrint
- •Событие Change
- •Включение событий уровня объекта Application
- •Определение факта открытия рабочей книги
- •События объекта UserForm
- •Запуск другого приложения из Excel
- •Использование функции Shell
- •Использование API-Функции ShellExecute
- •Инструкция AppActivate
- •Работа с внешними объектами
- •Раннее и позднее связывание
- •Простой пример позднего связывания
- •Использование метода SendKeys
- •Глава 21. Создание и использование надстроек
- •Определение надстройки
- •Основные причины создания надстроек
- •Создание надстройки
- •Пример надстройки
- •Установка надстройки
- •Тестирование надстройки
- •Распространение надстройки
- •Изменение надстройки
- •Членство в коллекциях
- •Получение доступа к VBA-процедурам надстройки
- •События объекта AddIn
- •Оптимизация производительности надстроек
- •Проблемы, связанные с использованием надстроек
- •Правильная установка
- •Ссылки на другие файлы
- •Указание правильной версии Excel
- •Глава 22. Работа с лентой
- •Начальные сведения о ленте
- •Активизация вкладки
- •Настройка ленты
- •Простой пример кода RibbonX
- •Некоторые замечания о настройке ленты
- •Код панели инструментов
- •Глава 23. Работа с контекстными меню
- •Обзор объекта CommandBar
- •Типы объектов CommandBar
- •Отображение контекстных меню
- •Настройка контекстных меню с помощью VBA
- •Сброс контекстных меню
- •Отключение контекстного меню
- •Отключение элементов контекстного меню
- •Добавление подменю в контекстное меню
- •Автоматическое добавление и удаление меню
- •Создание нового контекстного меню
- •Справка в приложениях Excel
- •Справочная система, созданная с помощью компонентов Excel
- •Использование примечаний к ячейке для предоставления справки
- •Использование средства HTML Help
- •Связывание файлов справочного руководства с приложением
- •Глава 25. Разработка пользовательских приложений
- •Что такое приложение, ориентированное на пользователя
- •Как это работает
- •Концепции разработки приложений
- •Концепция совместимости
- •Проблемы совместимости
- •Избегайте использования новых возможностей
- •Использование 64-разрядной версии Excel
- •Создание интернациональных приложений
- •Многоязычные приложения
- •Идентификация настроек системы
- •Параметры настройки даты и времени
- •Часто выполняемые операции с файлами
- •Управление файлами с помощью функций VBA
- •Использование объекта FileSystemObject
- •Открытие текстового файла
- •Чтение текстового файла
- •Запись в текстовый файл
- •Получение номера файла
- •Определение или установка позиции в файле
- •Примеры управления текстовыми файлами
- •Импортирование данных из текстового файла
- •Экспортирование диапазона в текстовый файл
- •Импортирование текстового файла в диапазон
- •Протоколирование операций в Excel
- •Фильтрация текстового файла
- •Экспортирование диапазона в формат HTML
- •Введение в IDE
- •Объектная модель IDE
- •Использование VBA для создания кода VBA
- •Простой пример
- •Глава 29. Модули классов
- •Определение модуля класса
- •Пример создания модуля класса
- •Дополнительные сведения о модулях классов
- •События модуля класса
- •Модуль класса CSVFileClass
- •Глава 30. Работа с цветом
- •Определение цвета
- •Цветовая модель RGB
- •Темы документа
- •Изменение цветов диаграммы
- •Списки часто задаваемых вопросов
- •Общие вопросы об Excel
- •Редактор Visual Basic
- •Процедуры
- •Функции
- •Объекты, свойства, методы и события
- •Пользовательские диалоговые окна
- •Надстройки
- •Пользовательский интерфейс
- •Справочная система Excel
- •Техническая поддержка со стороны компании Microsoft
- •Группы новостей
- •Веб-сайты
- •Сайт Йона Пелтиера
- •Системные требования
- •Использование компакт-диска
- •Файлы и программы, находящиеся на компакт-диске
- •Решение проблем
- •Предметный указатель
Глава 15. Дополнительные приемы работы с пользовательскими формами |
491 |
||||||
I f |
obWord2 Then C e lls (г, |
7) |
= |
О |
|
||
I f |
obWord3 Then |
C e lls ( r , |
7) |
= |
1 |
|
|
I f |
obWord4 Then |
C e lls ( r , |
7) |
= |
2 |
|
|
I f |
obAccessl Then |
C e lls ( r , |
8 ) |
= "" |
|
||
I f |
obAccess2 Then |
C e lls ( r , |
8 ) |
= 0 |
|
||
I f |
obAccess3 Then |
C e lls ( r , |
8 ) |
= 1 |
|
||
I f |
obAccess4 Then |
C e lls ( r , |
8 ) |
= 2 |
|
||
1 В ы гр узи ть форму
Unload Me End Sub
Как только мастер будет испытан и все станет работать должным образом, можно из менить значение свойства S t y le элемента управления M u ltiP a g e . Это свойство должно иметь значение 2 — fm T a b S ty le N o n e .
Имитация работы функции MsgBox
Функция VBA MsgBox достаточно необычна. В отличие от остальных функций она
отображает диалоговое окно. С другой стороны, она, как и другие функции, возвращает значение — целое число, представляющее кнопку, на которой щелкнул пользователь.
В приведенном ниже примере содержится пользовательская функция, которая эмули рует функцию VBA MsgBox. Вначале может показаться, что это легкая задача. Учиты вая то, что функция M sgBox невероятно гибкая (благодаря огромному количеству аргу
ментов, которые она принимает), можно утверждать: создать пользовательскую функ цию, эмулирующую поведение функции MsgBox, весьма непросто.
Примечание
Основная наша задача заключается не в создании альтернативной функции для отображения окон сообщений. Необходимо продемонстрировать раз работку достаточно сложной функции, которая использует диалоговое окно userForm . Кроме того, некоторым пользователям нравится сама идея соз дания функций для отображения окон сообщений. Созданную функцию лег ко модифицировать. Например, можно изменять используемый шрифт, цвет, надписи на кнопках и т.д.
Создаваемая функция, которая будет имитировать поведение функции MsgBox, по лучила название MyMsgBox. Имитация не является безупречной, так как функция MyMsgBox имеет следующие ограничения:
• не поддерживает аргумент с п р а в к а (он способствует появлению кнопки Справ ка, щелчок на которой позволяет открыть файл справочной системы);
•не поддерживает аргумент р а з д е л (он указывает раздел в файле справки);
•не поддерживает опцию модальности (которая приостанавливает работу всей программы до тех пор, пока пользователь не ответит на запрос окна сообщения);
•не воспроизводит звук при вызове.
Ниже приведен синтаксис функции MyMsgBox.
MyMsgBox( з а п р о с [, кн о п ки ] [, з а г о л о в о к ])
Этот синтаксис полностью соответствует синтаксису функции MsgBox, кроме того
что в первой не поддерживаются два последних аргумента ( с п р а в к а и р а з д е л ). Функ
492 Часть IV. Пользовательские формы
ция MyMsgBox использует те же предопределенные константы, что и функция MsgBox: vbO K O nly, v b Q u e s tio n , v b D e f a u lt B u t t o n l и т.д.
Примечание
Если вы не знакомы с функцией VBA MsgBox, обратитесь к справочной сис теме для получения информации о ее аргументах.
Код функции M yM sgB ox
Функция MyMsgBox использует диалоговое окно U serF orm , которое называется MyMsgBoxForm. Данная функция очень короткая. Ее текст приводится ниже. Основная часть работы выполняется в функции обработки события I n i t i a l i z e (UserForm I n i t i a l i z e ) .
Компакт-диск
Полный код функции MyMsgBox слишком длинный, чтобы приводить его здесь, но он доступен в рабочей книге msgbox e m u la tio n .x ls m , находя щейся на прилагаемом к книге компакт-диске. Эта рабочая книга настроена так, что вы сможете проверять работу различных опций.
P u b lic |
Prom pt1 As S trin g |
||
P u b lic |
B u tto n s l |
As |
In te g e rP u b lic T i t l e l As S trin g |
P u b lic |
U s e rC lic k |
As |
In te g e r |
F u n c tio n MyMsgBox(ByVal |
Prompt As |
S trin g , _ |
|||||
O p tio n a l |
ByVal |
B u tto n s |
As In te g e r, |
_ |
|||
O p tio n a l |
ByVal |
T it l e |
As |
S trin g ) |
As |
In te g e r |
|
Prom pt1 |
= Prompt |
|
|
|
|
||
B u tto n s l |
= |
B u tto n s |
|
|
|
|
|
T i t l e l |
= |
T it le |
|
|
|
|
|
MyMsgBoxForm. Show |
|
|
|
|
|||
MyMsgBox |
= U s e rC lic k |
|
|
|
|
||
End F u n c tio n |
|
|
|
|
|
|
|
На рис. 15.11 показан результат выполнения функции MyMsgBox. Он напоминает окно
сообщения VBA, но в этом случае применяется другой шрифт для выделения текста сооб щения (Calibri, 12 пунктов, полужирный), а также используются другие пиктограммы.
Если к вашему компьютеру подключено несколько мониторов, форма U serForm
может не попасть в центральную часть окна Excel. Для устранения этой проблемы вос пользуйтесь следующим кодом, отображающим форму MyMsgBoxForm.
W ith MyMsgBoxForm |
|
|
|
|
||
. S ta rtU p P o s itio n = 0 |
|
|
|
|
||
. L e f t = |
A p p lic a tio n . L e ft |
+ (0 .5 |
* A p p lic a tio n . W idth) |
- |
_ |
|
0 .5 |
* |
.W idth) |
|
|
|
|
.Top = |
A p p lic a tio n .T o p + |
(0 .5 * |
A p p lic a tio n . H e ig h t) |
- |
_ |
|
(0 .5 |
|
* .H e ig h t) |
|
|
|
|
. Show |
|
|
|
|
|
|
End W ith |
|
|
|
|
|
|
Ниже приведен код, который использовался для вызова функции на выполнение.
Prompt |
="Вы в ы брали |
с о х р а н е н и е р а б о ч е й к н и г и " |
& vb C rL f |
|||
Prompt |
=Prompt |
& "н а |
д и с к е , |
к о то р ы й н е д о с т у п е н " |
& |
vb C rL f |
Prompt |
=Prompt |
& "д л я в с е х |
с о т р у д н и к о в ." & vb C rL f |
& vb C rL f |
||
Prompt |
=Prompt |
& "П р о д о л ж а ть ? " |
|
|
||
B u tto n s |
= vb Q u e stio n |
+ vbYesNo |
|
|
||
494 |
Часть IV. Пользовательские формы |
•определяет расположение текста в диалоговом окне;
•определяет ширину диалогового окна (используется API-функция, которая пре доставляет информацию о разрешении экрана);
•определяет необходимую высоту диалогового окна;
•отображает диалоговое окно U se г Form.
Три дополнительные процедуры обработки событий используются для элементов управления CommandButton. Эти процедуры определяют, на какой из кнопок щелкнул пользователь. Затем переменной U s e r C lic k присваивается соответствующее значение.
Интерпретация второго аргумента (Кнопки) может оказаться немного сложнее. Этот аргумент может включать ряд констант и выглядеть следующим образом:
VbYesNoCancel + V bQ uestion + V b D e fa u ltB u tto n 3
Данный аргумент создает окно сообщения с тремя кнопками MsgBox (Да, Нет и От мена), отображает пиктограмму со знаком вопроса и делает третью кнопку выбранной по
умолчанию. Аргумент равен 547 (3+32+512). Основной трудностью в данном случае может оказаться получение трех фрагментов информации на основе одного числа. Решить данную проблему несложно: преобразуйте числа в двоичную форму и проверьте состояние отдельных битов этого аргумента. Например, число 547 в двоичной форме записывается как 1000100011. Двоичные цифры 4-6 определяют отображаемую пиктограмму, цифры 8 -10 — отображае
мые кнопки, а цифры 1 и 2 — кнопку, которая будет выбрана по умолчанию.
Использование функции M yM sgB ox
Для того чтобы применить эту функцию в собственном проекте, экспортируйте мо дуль MyMsgBoxMod и диалоговое окно MyMsgBoxForm. Затем можете импортировать эти два файла в собственный проект. Используйте функцию MyMsgBox в коде точно так же, как функцию MsgBox.
Диалоговое окно U serForm с перемещаемыми элементами управления
Этот пример вряд ли имеет практическую ценность, но зато он помогает разобраться в событиях мыши. В диалоговом окне UserForm , показанном на рис. 15.13, содержатся три элемента управления Im age. Пользователь может перетаскивать эти изображения в диалоговом окне.
Компакт-диск
Рассматриваемый в этой главе пример доступен на прилагаемом к книге компакт-диске и находится в файле move c o n tr o ls . xlsm .
Каждый из элементов управления Im age включает две ассоциированные с ним про цедуры обработки событий: MouseDown и MouseMove. Ниже приводится код процедур обработки событий для элемента управления Im age 1 (другие процедуры идентичны, за исключением используемых имен элементов управления).
P riv a te |
Sub Imagel_MouseDown(ByVal B u tto n As |
In te g e r, |
_ |
ByVal |
S h if t As In te g e r, ByVal X As S in g le , |
ByVal Y |
As S in g le ) |
1 Н а ч а л ь н а я п о з и ц и я в м о м ен т щ елчка на к н о п к е
Глава 15. Дополнительные приемы работы с пользовательскими формами |
499 |
Совет
Изображения, отображаемые на элементах управления, представляют со
Обой символы из набора шрифтов Wingding. Для ввода символов в ячейки
применялась команда Excel Вставка^Текст^Символ (Insert^Text^Symbol). Затем символы копировались в буфер обмена с последующей вставкой в свойство P ic tu re в окне Properties. Это простой и быстрый способ добав ления изображений в элементы управления окна userForm .
Диалоговое окно U serForm с изменяемыми размерами
В Excel используется ряд диалоговых окон с изменяемыми размерами. Например, можно изменить размеры диалогового окна Диспетчер имен (Name Manager) путем
щелчка и перетаскивания нижнего правого угла окна.
Если вы попытаетесь создать диалоговое окно с изменяемыми размерами, то очень быстро обнаружите, что нет прямого способа сделать это. Первое решение заключается в использовании вызовов Windows API. Этот метод работает, но сложен в реализации. В этом разделе представлен более простой метод, обеспечивающий создание диалогово го окна U serForm с изменяемыми размерами.
Примечание
Этот прием был разработан Энди Поупом, экспертом по Excel и профессио налом Microsoft (MVP), проживающим в Великобритании. Энди — один из наиболее креативных разработчиков Excel. Желающие пообщаться с ним (а также загрузить интересные примеры) могут посетить его веб-сайт h t t p : //a n d y p o p e . in f o .
На рис. 15.18 показано диалоговое окно U serF orm , описанное в этом разделе. Оно включает элемент управления L is tB o x , отображающий данные из рабочего листа. Об ратите внимание на полосы прокрутки элемента управления L is tB o x . Их появление оз
начает, что в окне находится больше информации, чем оно может вместить. А в правом нижнем углу диалогового окна отображается знакомый вам элемент управления, изме няющий размеры окна.
На рис. 15.19 показано то же самое диалоговое окно U ser Form, размеры которого изменены пользователем. Обратите внимание на то, что размеры элемента управления ListBox были также увеличены, а кнопка Закрыть (“крестик”) осталась в том же са
мом относительном положении. Если у вас небольшой монитор, можете сжать диалого вое окно U se г Form.
Компакт-диск
Рассматриваемый в этом разделе пример находится на прилагаемом к кни ге компакт-диске в файле re s iz a b le u s e rfo rm .x ls m .
В представленном примере используется элемент управления L a b e l, добавленный в диалоговое окно Use г Form во время выполнения. Элемент управления, изменяющий
размеры окна, который находится в нижнем правом углу окна, фактически представляет собой элемент управления L a b e l. Он отображает единственный символ: букву “о”
(символ “111”) шрифта Marlett, набор символов 2. Этот элемент управления (под назва
Глава 15. Дополнительные приемы работы с пользовательскими формами |
501 |
|||
. Z o rd e r |
- |
.H e ig h t |
|
|
.Тор |
= Me. In s id e H e ig h t |
|
||
.L e ft |
= Me. In s id e W id th |
- |
.W id th |
|
End W ith |
|
|
|
|
End Sub |
|
|
|
|
Примечание
Хотя элемент управления Label был добавлен на этапе выполнения, код об работчика событий для объекта находится в модуле. Включение кода для несуществующего объекта не вызывает проблем.
Описанная в этом разделе техника основана на следующих фактах.
•Пользователь может перемещать элемент управления в диалоговом окне U se r - Form (см. раздел “Диалоговое окно с перемещаемыми элементами управления”).
•Идентификация перемещений мыши, а также определение координат указателя мыши производится с помощью событий. В данном случае используются события MouseDown и MouseMove.
•Код VBA может изменять размер диалогового окна U se г Form во время выпол нения, но пользователю подобные возможности недоступны.
В результате творческого осмысления этих фактов можно сделать выводы о том, что можно преобразовать перемещение указателя мыши в области элемента управления Label в информацию, которая может использоваться для изменения размеров диалого вого окна U se г Form.
После щелчка мышью на объекте ob j Re s i z e r L a b el на выполнение вызывается процедура обработчика событий ob jR esizer_ M ou seD ow n .
Private |
Sub objR esizer_M ouseD own(ByVal |
B u tto n |
As In te g e r, |
_ |
||||
ByVal |
S h if t |
As |
In te g e r, ByVal X As |
S in g le , |
ByVal Y As |
S in g le ) |
||
I f |
B u tto n = |
1 |
Then |
|
|
|
||
|
L e ftR e size P o s |
= X |
|
|
|
|||
End |
TopResizePos |
= Y |
|
|
|
|||
I f |
|
|
|
|
|
|
||
End Sub
Эта процедура выполняется только в том случае, когда нажата левая кнопка мыши (при этом аргумент B u tto n принимает значение 1), а ее указатель установлен на метке obj R e siz e r . Координаты указателя мыши X и Y, зафиксированные во время щелчка мышью, хранятся в переменных уровня модуля: L ef tR e s iz e P o s и T o p R esizeP o s.
Последовательные перемещения указателя мыши приводят к вызову события
MouseMove, после чего в игру вступает обработчик событий |
o b jR e siz e r _ M o u se - |
||||||||||||
Move. Соответствующий код приводится ниже. |
|
|
|
|
|
||||||||
Private |
Sub objR esizer_M ouseM ove(ByVal |
B u tto n |
As |
In te g e r, |
_ |
||||||||
ByVal |
S h if t |
As |
In te g e r, |
ByVal |
X |
As |
S in g le , |
ByVal |
Y As |
S in g le ) |
|||
I f B u tto n = |
1 |
Then |
|
|
|
|
|
|
|
|
|
||
W ith o b jR e s iz e r |
L e ftR e s iz e P o s , .Top |
+ |
Y - |
_ |
|
||||||||
|
.Move |
. L e ft + X - |
|
||||||||||
|
TopResizePos |
|
X |
- |
L e ftR e size P o s |
|
|
|
|||||
|
M e.W idth |
= |
M e.W idth + |
|
|
|
|||||||
|
M e .H eight |
= M e .H eight |
+ |
Y |
- TopResizePos |
|
|
|
|||||
|
.L e ft |
= |
Me. In s id e W id th |
|
- |
.W id th |
|
|
|
|
|||
|
.Top |
= Me. In s id e H e ig h t |
|
- |
.H e ig h t |
|
|
|
|
||||
End W ith |
|
|
|
|
|
|
|
|
|
|
|
|
|
End Sub |
|
|
|
|
|
|
|
|
|
|
|
|
|
