- •Объектная модель
- •Полная и неявная ссылка на объект
- •Ссылка на активную рабочую книгу, лист, ячейку, диаграмму и принтер
- •Загрузка инсталлированной надстройки
- •Управление уровнем безопасности
- •Семейство встроенных диалоговых окон
- •Объект FileDialog
- •Методы объекта Application
- •Установка выполнения специфицированной процедуры при нажатии заданной комбинации клавиш
- •Переопределение горячих клавиш приложения
- •Проверка правописания отдельного слова
- •Симулирование ячеек рабочего листа
- •Электронные часы в ячейке рабочего листа
- •Получение данных из закрытой рабочей книги
- •События объекта Application
- •IgnoreReadOnlyRecommended — необязательный параметр, указывающий надо ли отображать предупреждение о том, что книга была сохранена в режиме "только для чтения";
- •Установка и снятие защиты книги
- •Методы объекта Worksheet
- •Объект Protection
- •События объекта Worksheet
- •Добавление к графическому объекту обработчика события Click
- •Примечание
- •Свойства объекта Range
- •Управление стилем границы диапазона и объекта Border
- •Функции rgb и qbColor
- •Доступ к отдельным ячейкам диапазона
- •Выбор элементов на рабочем листе или в книге
- •Объект Characters
- •Объект Comment
- •Определение текущего диапазона
- •Объект Font
- •Объект Interior
- •Установка числового формата
- •Переопределение размеров диапазона
- •Методы объекта Range
- •Табуляция функции
- •Заполнение диапазона по одному значению
- •Специальная вставка
- •Вставка диапазона с транспонированием
- •Бегущая картинка
- •Поиск значения в диапазоне
- •Повторный поиск и поиск всех значений
- •Поиск по формату
- •Замена значений
- •Ввод в диапазон неповторяющихся значений
- •Озвучивание текста
- •Построение графа
- •Пользовательские функции
- •Математические функции
- •Надстройки
- •Где хранятся макросы?
События объекта Worksheet
Объект Worksheet поддерживает множество событий, позволяющих отслеживать различные действия пользователя от активизации листа до перехода по гиперссылке. В табл. 5.13 перечислены события, связанные с объектом Worksheet.
Таблица 5.13. События объекта Worksheet
Событие |
Генерируется |
Activate |
При активизации листа |
BeforeDoubleClick |
Перед двойным щелчком до того, как будет выполнено действие, ассоциированное по умолчанию с соответствующим объектом |
BeforeRightClick |
Перед щелчком правой кнопкой мыши до того, как будет выполнено действие, ассоциированное по умолчанию с соответствующим объектом |
Calculate |
При пересчете данных |
Change |
При изменениях данных |
Deactivate |
При деактивизации листа |
FollowHyperlink |
При переходе по гиперссылке |
PivotTableUpdate |
При обновлении сводной таблицы |
SelectionChange |
При смене выделения |
Блокировка действий, связанных с событием
по умолчанию
С теми или иными действиями пользователя связаны по умолчанию некоторые системные действия. Например, при нажатии правой кнопки мыши на рабочем листе отображается стандартное контекстное меню. Естественно, возникает вопрос, как блокировать эти действия, если они не совпадают с бизнес-логикой вашего проекта. Да очень просто. В процедурах обработки событий, часто присутствует параметр Cancel, который если принимает значение True, как раз и блокирует эти действия, по умолчанию предлагаемые системой пользователю. Например, в коде листинга 5.35 блокируется отображение контекстного меню, появляющегося при нажатии правой кнопки мыши. Вместо него в месте на рабочем листе, где был произведен щелчок, добавляется надпись с порядковым номером этого щелчка.
Листинг 5.35. Блокировка действий, связанных с событием по умолчанию.
Модуль рабочего листа
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, _
Cancel As Boolean)
Cancel = True
Static i As Integer
Dim x As Integer
Dim у As Integer
x = Target.Left
у = Target.Top
ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, _
x, y, 30, 20).TextFrame.Characters.Text = i
i = i + 1
End Sub
Добавление к графическому объекту обработчика события Click
К любому графическому или вложенному объекту можно добавить обработчик события Click с помощью установки в качестве значения свойства OnAction ссылки на этот обработчик. При этом обработчик может иметь параметры. Как это делается, показано в следующем примере, в котором предполагается, что на рабочем листе имеется, по крайней мере, один графический объект (листинг 5.36). Нажатие на него приведет к отображению диалогового окна со стандартным приветствием "Hello, World!", передаваемым в качестве значения параметра обработчика события Click (рис. 5.2). Кстати при создании этого графического объекта пришлось немного повозиться. Сначала была создана автофигура в виде звезды с градиентной заливкой, у которой была смоделирована тень. В автофигуре как в контейнере разместилась надпись с прозрачным фоном, отсутствием границы и отформатированным текстом. Затем надпись и автофигура были сгруппированы. В результате получилась вполне привлекательная картинка.
Рис. 5.2. Рисунок в виде кнопки
Sub SetButton()
Dim msg As String
msg = "Hello, World!"
Sheets(1).Shapes(1).OnAction = ..& "Shape_Click """ & msg & """"
End Sub
Sub Shape_Click(msg As String)
MsgBox msg
End Sub
Автоматическое переоформление таблицы
при изменении в ней значений
С
обытие
Change
объекта Worksheet
генерируется при изменении значений в
диапазоне рабочего листа. Это событие
позволяет автоматизировать переоформление
таблицы при изменении в ней значений.
Рассмотрим следующую бизнес-ситуацию.
В диапазоне В2:В11 расположены данные по
расходам за отчетный период фирмы
"Родные просторы". Необходимо
выделить полужирным шрифтом красного
цвета те данные, которые соответствуют
максимальному объему расходов, синим
цветом — минимальному. Все остальные
данные выводятся черным цветом. Кроме
того, ячейки, объем расходов в которых
превышает средний объем, надо залить
желтым цветом. Причем требуется обеспечить
автоматическое переформатирование
таблицы при изменении значений в ее
ячейках (рис. 5.3).
Рис. 5.3. Автоматическое переформатирование таблицы при изменении в ней значений
Для решения этой задачи как раз и пригодится событие Change объекта Worksheet, а как это делается, показано в следующем коде из модуля рабочего листа (листинг 5.37).
Листинг 5.37. Автоматическое переформатирование таблицы при изменении в ней значений.
Модуль рабочего листа
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range
Dim с As Range
Dim max As Double
Dim min As Double
Dim avr As Double
Set rng = Range("B2:B11")
If Not (Application.Intersect(Target, rng) Is Nothing) Then
If Application.WorksheetFunction.CountA(rng) > 0 Then
max = Application.WorksheetFunction.max(rng)
min = Application.WorksheetFunction.min(rng)
avr = Application.WorksheetFunction.Average(rng)
For Each с In rng
If c.Value = max Then
c.Font.Bold = True
c.Font.Color = RGB(255, 0, 0)
Elself c.Value = min Then
c.Font.Bold = False
c.Font.Color = RGB(0, 0, 255)
Else
c.Font.Bold = False
c.Font.Color = RGB(0, 0, 0)
End If
If с.Value > avr Then
c.Interior.Color = RGB(255, 255, 0)
Else
c.Interior.Colorlndex = xlNone
End If
Next
Else
rng.Interior.Colorlndex = xlNone
End If
End If
End Sub
Условное форматирование без применения кода
Условное форматирование позволяет эффективно отображать форматируемые ячейки выборочно, основываясь на их содержании. Для того чтобы применить условное форматирование к ячейке или диапазону:
Выделите ячейку или диапазон, например, В2:В5
Выберите команду Формат ► Условное форматирование.
Отобразится окно Условное форматирование. Для простого условного форматирования, как в данном случае, из раскрывающего списка выберите значение. Если же необходимо форматирование на основе формулы, то надо выбрать формула.
Определите условие.
Нажмите кнопку Формат и определите форматирование (шрифта, границы и заливки), которое надо применить.
Для добавления дополнительных условий нажмите кнопку А также.
Нажмите кнопку ОК.
Примечание
При условном форматировании нельзя ссылаться на ячейки, расположенные на других листах. Для того чтобы избежать этого ограничения, на исходном листе создайте формулу, ссылающуюся на ячейку другого листа. Например, если необходимо в формуле сослаться на ячейку А1 листа Лист2, то на исходном листе в какую-либо ячейку введите формулу =Лист2 !А1, а при условном форматировании ссылку давайте уже на эту ячейку. Допустимо также присвоение имени диапазону, после чего на него разрешена ссылка при условном форматировании на любом рабочем листе.
Для удаления условного форматирования совместно со всеми другими форматами выделите искомый диапазон и выберете команду Правка ► Очистить ► Формат.
Для удаления только условного форматирования выделите искомый диапазон, выберете команду Формат ► Условное форматирование и в окне Условное форматирование нажмите кнопку Удалить. Отобразится окно Удаление условного форматирования, предлагающее указать, какие из трех условий следует удалить, даже если такое количество условий и не было определено.
Отображение результата,
только при условии ввода всех данных
С помощью условного форматирования легко обеспечить, чтобы содержимое ячеек с результатами отображалось только при вводе всех данных. Например, необходимо найти сумму двух чисел, вводимых в ячейки В1 и В2. Результаты с пояснительными надписями отображаются в ячейках С2 и С1 только в случае, если оба слагаемых введены. Для этого достаточно диапазону С1:С2 назначить условное форматирование при помощи следующей формулы, причем установить цвет шрифта совпадающим с фоновым цветом.
=СЧЕТЗ($В$1:$В$2)<>2
Проверка вводимых значений
Для того чтобы задать тип данных, допустимых для диапазона, надо:
Выделить диапазон.
Выбрать команду Дата ► Проверка.
На вкладке Параметры окна Проверка вводимых значений в списке Тип данных указать тип допустимых данных. В списке Тип данных имеются следующие элементы:
Любое значение — удаляет существующее правило проверки значений;
Целое число — пользователь может вводить целые числа. Диапазон допустимых значений задается при помощи раскрывающихся списков Значение, Минимум и Максимум. Например, можно ограничить ввод целыми числами от 1 до 100;
Действительное — пользователь может вводить действительные числа. Диапазон допустимых значений задается при помощи раскрывающихся списков Значение, Минимум и Максимум. Например, можно ограничить ввод действительными числами из интервала [0; 1];
Список — пользователь может выбрать значение из данного списка. Список задается в поле Источник, в котором указывается ссылка на диапазон с исходными данными;
Дата — пользователь может вводить дату. Диапазон допустимых дат задается при помощи раскрывающихся списков Значение, Минимум и Максимум;
Время — пользователь может вводить время. Диапазон допустимых времен задается при помощи раскрывающихся списков Значение, Минимум и Максимум;
Длина текста — пользователь может вводить строки со специфицированными ограничениями по длине;
Другой — возвращает логическое значение, определяющее соответствуют ли введенные значения ограничениям, которые задаются формулой. Ссылка на ячейку с формулой задается в поле Формула.
На вкладке Сообщение для ввода установить заголовок и текст всплывающей подсказки, отображаемой при расположении указателя мыши над ячейкой данного диапазона.
На вкладке Сообщение об ошибке задать значок, кнопки, заголовок и сообщение окна, отображаемого при попытке ввода некорректных данных.
Наиболее интересным применением проверки типа данных является использование формулы для задания ограничений. Данный режим проверки устанавливается выбором элемента Другой из списка Тип данных. В этом случае в поле Формула надо ввести формулу проверки данных в относительном формате с привязкой к левой верхней ячейке данного диапазона.
Например, данные содержатся в диапазоне В2:В10.
Если в ячейки этого диапазона надо вводить только строки текста, начинающиеся с буквы А, то воспользуйтесь формулой =ЛЕВСИМВ(В2)="А"
Если в ячейки этого диапазона надо вводить только строки текста, состоящие из трех символов и начинающиеся с буквы А, то воспользуйтесь формулой
=ЛЕВСИМВ(В2, "А??")=1
Если надо вводить только строки, состоящие из трех символов, то используйте формулу =ДЛСТР(В2)=3
Если можно вводить только неповторяющиеся данные, то воспользуйтесь формулой
=СЧЕТЕСЛИ($В$2:$В$10;В2)=1
Автоматический ввод данных
в верхнем регистре данного диапазона
При помощи обработки события Change объекта Worksheet можно не только переформатировать данные, но и блокировать действия пользователя. Например, код листинга 5.38 из модуля рабочего листа обеспечит вывод данных в первом столбце рабочего листа только в верхнем регистре.
Листинг 5.38. Автоматический ввод данных в верхнем регистре данного диапазона.
Модуль рабочего листа
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Not Application.Intersect(Target, Range("A:A")) Is Nothing Then
Target.Value = UCase(Target.Value)
End If
Application.EnableEvents = True
End Sub
Вывод суммы значений из выделенного диапазона
в строку состояния
Обрабатывая событие SelectionChange объекта Worksheet можно сделать так, чтобы в строку состояния выводилась, например, сумма значений из выделенного диапазона. Для этого надо воспользоваться свойством StatusBar объекта Application, как показано в следующем коде (листинг 5.39) из модуля рабочего листа, в котором задается текст, отображаемый в строке состояния. Если значение этого свойства устанавливается равным False, то в строке состояния отображается текст, заданный по умолчанию.
Листинг 5.39. Вывод суммы значений из выделенного диапазона в строку состояния.
Модуль рабочего листа
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim s As Double
s = Application.WorksheetFunction.Sum(Target)
If s <> 0 Then
Application.StatusBar = FormatNumber(s, 3)
Else
Application.StatusBar = False
End If
End Sub
Объекты Range и Selection
В иерархии MS Excel объект Range (диапазон) идет сразу после объекта Worksheet. Объект Range является одним из ключевых объектов VBA. Объект Selection возникает в VBA двояко — либо как результат работы метода
Select, либо при вызове свойства Selection. Тип получаемого объекта зависит от типа выделенного объекта. Чаше всего объект Selection принадлежит классу Range, и при работе с ним можно использовать свойства и методы объекта Range. Объект.Range возвращается либо как элемент семейств
Range или Cells, либо свойствами Range, Cells И Offset, либо методами ActiveCell, Intersect и Union.
Адресация ячеек
При работе с объектом Range необходимо помнить, как в MS Excel ссылаются на ячейку рабочего листа. Имеются два способа ссылки на ячейки рабочего листа:
относительная адресация (табл. 5.14), т. е. когда начало координат, задающее нумерацию строк и столбцов, связывается с объектом, вызвавшим Range;
абсолютная адресация (табл. 5.15).
Таблица 5.14. Относительная адресация
-
Формат
Описание
А1
Имя ячейки состоит из имени столбца (их 256 — А, В, ..., Z, АВ..... HZ, IA,..., IV) и номера (1, ..., 16 384). Например, А1 или С2
R1C1
Адресация задается индексом строки и индексом столбца. Например, R1C1 иили R2C3
Таблица 5.15. Абсолютная адресация
-
Формат
Описание
А1
Признаком абсолютной адресации является знак $, предшествующий имени строки (абсолютная адресация на строку) или столбца (абсолютная адресация на столбец). Например, $А10, А$10 и $А$10 задают абсолютную адресацию на столбец А, строку 10 и ячейку А10 соответственно
R1C1
Указывается смещение по отношению к активной ячейке. Смещение приводится в квадратных скобках, причем знак указывает на направление смещения. Например, если активной ячейкой является R2C3, то R[1] С[-1] дает ссылку на ячейку R3C2
Адресация ячейки рабочего листа является лишь частью полного адреса ячейки, который в общем случае включает имя рабочего листа и адрес книги. При задании полного адреса за именем листа следует знак !, а адрес книги заключается в скобки.
Например:
A1
Лист2!А1
[МояКнига.XLS]Лист2!Al
В первой строке данного примера дана относительная ссылка на ячейку А1 активного рабочего листа, во второй — на ячейку А1 рабочего листа Лист2 активной книги, а в третьей на ячейку А1 рабочего листа Лист2 книги МояКнига.xls текущего рабочего каталога.
Задание групп строк и столбцов
Если в диапазоне указываются только имена столбцов или строк, то объект Range задает диапазон, состоящий из указанных столбцов или строк. Например, Range ("А:C") задает диапазон, состоящий из столбцов А, В и С, а Range("2:2") — из второй строки. Другим способом работы со строками и столбцами являются свойства рабочего листа Rows и Columns, возвращающие семейства строк и столбцов. Например, столбцом А является Columns(1), a второй строкой — Rows(2) .
Связь объекта Range
и свойства Cells объекта Worksheet
Ячейка — это частный случай диапазона, который состоит из единственной ячейки. Поэтому естественно, что объект Range позволяет работать как с диапазоном ячеек, так и с одной ячейкой.
Альтернативным способом работы с ячейкой является свойство Сells объекта worksheet. Например, ячейку А2 как объект можно описать двумя равносильными способами:
Range ("А2") и
Cells (1, 2).
В свою очередь ячейка, возвращаемая свойством Сells, используемым как параметр объекта Range, позволяет записывать диапазон в альтернативном виде, который иногда удобен для работы. В качестве примера этой формы записи диапазона приведем следующие две инструкции, возвращающие один и тот же диапазон:
Range("А2:СЗ")
Range(Cells(l,2), Cells(3,3))
