Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
объектная модель Excel.doc
Скачиваний:
3
Добавлен:
01.03.2025
Размер:
1 Мб
Скачать
☆

События объекта 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

Условное форматирование без применения кода

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

  1. Выделите ячейку или диапазон, например, В2:В5

  2. Выберите команду Формат ► Условное форматирование.

  3. Отобразится окно Условное форматирование. Для простого условного форматирования, как в данном случае, из раскрывающего списка выберите значение. Если же необходимо форматирование на основе формулы, то надо выбрать формула.

  4. Определите условие.

  5. Нажмите кнопку Формат и определите форматирование (шрифта, границы и заливки), которое надо применить.

  6. Для добавления дополнительных условий нажмите кнопку А также.

  7. Нажмите кнопку ОК.

Примечание

При условном форматировании нельзя ссылаться на ячейки, расположенные на других листах. Для того чтобы избежать этого ограничения, на исходном листе создайте формулу, ссылающуюся на ячейку другого листа. Например, если необходимо в формуле сослаться на ячейку А1 листа Лист2, то на исходном листе в какую-либо ячейку введите формулу =Лист2 !А1, а при условном форматировании ссылку давайте уже на эту ячейку. Допустимо также присвоение имени диапазону, после чего на него разрешена ссылка при условном форматировании на любом рабочем листе.

Для удаления условного форматирования совместно со всеми другими форматами выделите искомый диапазон и выберете команду Правка ► Очистить ► Формат.

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

Отображение результата,

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

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

=СЧЕТЗ($В$1:$В$2)<>2

Проверка вводимых значений

Для того чтобы задать тип данных, допустимых для диапазона, надо:

  1. Выделить диапазон.

  2. Выбрать команду Дата ► Проверка.

  3. На вкладке Параметры окна Проверка вводимых значений в списке Тип данных указать тип допустимых данных. В списке Тип данных имеются следующие элементы:

    • Любое значение — удаляет существующее правило проверки значений;

    • Целое число — пользователь может вводить целые числа. Диапазон допустимых значений задается при помощи раскрывающихся списков Значение, Минимум и Максимум. Например, можно ограничить ввод целыми числами от 1 до 100;

    • Действительное — пользователь может вводить действительные числа. Диапазон допустимых значений задается при помощи раскрывающихся списков Значение, Минимум и Максимум. Например, можно ограничить ввод действительными числами из интервала [0; 1];

    • Список — пользователь может выбрать значение из данного списка. Список задается в поле Источник, в котором указывается ссылка на диапазон с исходными данными;

    • Дата — пользователь может вводить дату. Диапазон допустимых дат задается при помощи раскрывающихся списков Значение, Минимум и Максимум;

    • Время — пользователь может вводить время. Диапазон допустимых времен задается при помощи раскрывающихся списков Значение, Минимум и Максимум;

    • Длина текста — пользователь может вводить строки со специфицированными ограничениями по длине;

    • Другой — возвращает логическое значение, определяющее соответствуют ли введенные значения ограничениям, которые задаются формулой. Ссылка на ячейку с формулой задается в поле Формула.

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

  5. На вкладке Сообщение об ошибке задать значок, кнопки, заголовок и сообщение окна, отображаемого при попытке ввода некорректных данных.

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

Например, данные содержатся в диапазоне В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))