Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Algoritmizatsia_i_programmirovanie_VBA_polnaya_...doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
12.34 Mб
Скачать

Change объекта WorkSheet

Кроме написания самого кода, единственным сложным моментом может быть открытие окна редактирования кода для требуемого объекта. Для объектов Worksheet, Workbook и Chart, занимающих отдельный рабочий лист, никаких сложностей здесь нет — как уже указывалось выше, необходимо просто дважды щелкнуть на имени соответствующего объекта в окне проектов.

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

Тогда в него следует добавить такую строку кода: PublicWithEventsАррAsApplication, где объектная переменная Арр класса Application объявляется открытой (Public) и способной обрабатывать события (WithEvents).

Теперь, когда создана требуемая объектная переменная, ее имя появится в раскрывающемся списке Object (в левом верхнем углу окна кода).

Если выбрать ее в этом списке, в списке Procedure (справа) можно будет выбрать то событие, которое должно обрабатываться, и написать для него соответствующую процедуру (рисунок 4.13).

Рисунок 4.13 − Вставка заготовки процедуры обработки требуемого события в модуль класса EventClassModule

Однако, для того чтобы написанная процедура обработки события могла работать в приложении, в одном из его программных модулей необходимо создать объектную переменную с типом EventClassModule и связать ее с системным объектом Application, представляющим приложение Excel. Например, в некоторый программный модуль приложения можно поместить следующий код.

Dim X As New EventClassModule ' Объявление объектной переменной X

Sub InitializeApp() ' Инициализация переменной

Set X.App = Application

End Sub

Теперь, после вызова процедуры InitializeApp в любом из модулей проекта, объектная переменная Арр будет содержать ссылку на объект Application, представляющий приложение Microsoft Excel, и подпрограмма обработки события, присутствующая в его модуле класса, будет использоваться для перехвата и обработки соответствующих событий по мере их возникновения.

Объем этой книги не позволяет детально рассмотреть аналогичный вопрос и в отношении встроенных диаграмм, однако при необходимости информацию по этой теме можно найти в справочной системе VBA (тема Using Events with Embedded Charts). Можно лишь добавить, что общая схема действий будет аналогичной, а используемые объекты, естественно, другие.

Обработка внесения изменений в рабочий лист

Если нужно, чтобы программа реагировала на действия, выполняемые пользователем на рабочем листе, требуется обрабатывать события Change, Calculate и SelectionChange для объектов Worksheet или соответствующие события SheetChange,SheetCalculate и SheetSelectionChange для объектов Workbook и Application. Для запуска пользовательских процедур, когда сами рабочие листы или диаграммы активизированы или не активизированы, используются события Activate и Deactivate.

События Change и SheetChange

Событие Change (а значит, и SheetChange) инициируется каждый раз, когда значение любой ячейки или нескольких ячеек рабочего листа изменяется после действий пользователя или обновления ссылки. Однако изменения в вычисляемых значениях не приводят к инициированию данного события. В процедуре обработки этих событий можно установить адрес ячейки, значение которой было изменено, а затем предпринять те или иные действия. Например, в следующем примере (листинг программы 4.6) проверяются измененные значения внутри диапазона, называемого Target, на предмет их попадания в определенные пределы (4 < п < 11). Такие значения выделяются с помощью шрифта с большим кеглем, полужирным начертанием и зеленым цветом (рисунок 4.14).

Пример №6

Листинг программы 4.6

Анализ значений ячеек заданного диапазона.

Private Sub Worksheet_Change(ByVal Target As Range)

Dim oCell As Range

For Each oCell In Target

If ocell > 4 And oCell < 11 Then

With oCell.Font

.Bold = True

.Size = 16

.Color = RGB(0, 225, 0)

End With

End If

Next oCell

End Sub

Обратите внимание на то, что здесь Target может быть не одной ячейкой, а диапазоном, поскольку операции заливки, удаления и вставки могут применяться одновременно кнескольким ячейкам. Для корректной обработки как отдельных ячеек, так и некоторых диапазонов, процедура события Change должна включать в себя структуру For Each... Next, только тогда она будет применима как к отдельной, так и к нескольким ячейкам.

Рисунок 4.14 − Результат обработки подпрограммой Worksheet_Change диапазона ячеек D3:G14

В действительности события Change и SheetChange могут генерироваться даже тогда, когда собственно значение ячеек не изменялось. Данные события генерируются, когдапользователь инициализирует процесс редактирования ячейки (после щелчка в панели формул или нажатия клавиши <F2>), даже если сразу после этого он прекратил редактирование, не внеся никаких изменений, т.е. просто нажав клавишу <Enter>, щелкнув на кнопке Ввод или в любом другом месте на рабочем листе. События не генерируются, если пользователь прекращает редактирование нажатием клавиши <Esc> или щелчком на кнопке Отмена.

События Calculate и SheetCalculate

Событий Calculate, генерируемое как объектом Worksheet, таки объектом Chart, генерируется при каждом обновлении программой Excel рабочего листа или диаграммы. Событие SheetCalculate для объектов Workbook и Application генерируется в ответ на событие Calculate. Если режим автоматического пересчета включен, данное событие генерируется, как только изменяется значение любой ячейки, т.е. одновременно с событием Change. Если автоматический пересчет отключен, событие Calculate генерируется лишь тогда, когда пользователь инициализирует пересчет содержимого рабочего листа нажатием клавиши <F9>.

Процедуры обработки для событий Calculate и SheetCalculate могут использоваться для изменения рабочего листа в соответствии с результатами вычислений. Например, если известно, что пересчет может изменить элементы упорядоченного списка, целесообразно использовать процедуру события Worksheet_Calculate для переупорядочения списка после выполнения вычислений. Поскольку данные процедуры не сообщают, какая из ячеек была изменена в процессе вычислений, необходимо указывать в программном коде адреса ячеек, которые требуется изменить.

События SelectionChange и SheetSelectionChange

При каждом перемещении активной ячейки, а также при расширении или сжатии выделенной области, Excel генерирует событие SelectionChange для объекта Work-sheet. Параллельно генерируется событие SheetSelectionChange для объектов Workbook и Application. Процедуры обработки для данных событий можно использовать для организации обратной связи с текущим выделением. В приведенном ниже примере событие SheetSelectionChange рабочей книги используется для отображения в левой верхней ячейке текущего листа адреса активной ячейки, а также для помещения имени рабочего листа и адреса выделения в строку состояния (рисунок 4.15). Обратите внимание на то, как аргумент Sh позволяет идентифицировать и вести работу с текущим листом.

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, _

ByVal Target As Range)

Sh.Range("a1") = ActiveCell.Address

Application.StatusBar = Sh.Name & ":" & Target.Address

End Sub 

Рисунок 4.15 − Результат выполнения процедуры обработки события AheetSelectionChange объекты Workbook

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

Далее в списке Object этого окна (слева вверху) выберите объект Workbook, а в списке Procedure (справа вверху) — событие SheetSelectionChange. В модуль будет вставлена заготовка процедуры обработки этого события.

Все, что осталось — это поместить в заготовку две строки исполняемого кода: Sh.Range("Al") = ActiveCell.Address и Application. StatusBar = Sh.Name & " : " & Target .Address.

Перейдите в окно рабочей книги Excel и убедитесь, что процедура работает, выделяя произвольные диапазоны на ее разных листах.

Несколько усложнив код, можно добиться, например, того, чтобы в случае попадания на определенном рабочем листе заданной ячейки или диапазона в новое выделение отображалось пользовательское диалоговое окно (рисунок 4.16).

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)

If Target.Address = "$B$2" Then

MsgBox "Вы нашли нужную ячейку - $В$2!"

End If

End Sub

Рисунок 4.16 − Вывод окна сообщения из процедуры обработки события SelectionChange объекта Workssheet

Работа с различными диаграммами. Программирование динамических диаграмм

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

В Excel поддерживается создание диаграмм двух типов — диаграмм на отдельных листах и диаграмм, встроенных в существующие рабочие листы. В первом случае каждая диаграмма отображается на отдельном листе, называемом листом диаграммы (chart sheet). Лист диаграммы содержит только одну диаграмму и не содержит колонок и строк данных. Во втором случае отображаемая диаграмма встраивается в стандартный рабочий лист. Но в обоих случаях диаграммы управляются одинаково.

Листы диаграмм представляются коллекцией Charts, которая содержит объект Chart для каждого листа диаграммы заданной рабочей книги (объект Workbook) или активной рабочей книги (объект Application). Ниже приведен оператор, с помощью которого на печать выводятся все листы диаграмм рабочей книги Sales, xsl.

Workbooks("Sales.xsl").Charts.PrintOut

Добавить новый лист диаграммы в коллекцию можно с помощью метода Charts. Add коллекции Charts.

Как и в других коллекциях, каждому листу диаграммы в коллекции Charts можно присвоить имя, с помощью которого можно будет обращаться к этому объекту; пример показан в листинге программы 4.7 (рисунок 4.17).

Пример №7

Листинг программы 4.7

Создание нового листа диаграммы в рабочей книге.

Рисунок 4.17В рабочую книгу добавлен новый лист диаграммы «Продажи»

Каждая диаграмма, помещенная на рабочий лист, также представлена объектом Chart, однако он присутствует в нем не отдельно, а в объекте ChartObject, являющимся контейнером для объектов Chart. В отличие от диаграммы на собственном листе, встроенная диаграмма может отображаться с разными размерами и в разных позициях. Свойства объекта ChartObject как раз и задают внешний вид й размеры встроенной диаграммы. Каждый объект Worksheet имеет коллекцию ChartObjects, в которой содержится по одному объекту ChartObject для каждой помещенной на этот лист диаграммы. Для того чтобы добавить на рабочий лист новую встроенную диаграмму, нужно использовать метод Add коллекции ChartObjects.

ChartObjects.Add (Left, Top, Width, Height)

Здесь аргументы Left и Top задают позицию левого верхнего угла диаграммы относительно верхнего левого угла рабочего листа. Аргументы Width и Height задают размер диаграммы (ширина и высота соответственно). Все четыре аргумента являются обязательными и измеряются в точках (points) (1 точка = 1/72 дюйма).

Создание диаграммы с помощью VBA

Для создания диаграммы с помощью инструментов пользовательского интерфейса Excel (это самый простой способ создания диаграммы в Excel) необходимо выделить исходные данные на рабочем листе (рисунок 4.18) а затем нажать клавишу <F11>. После этих действий будет создана новая диаграмма, расположенная на отдельном листе.

Рисунок 4.18 − Исходные данные для получения диаграммы

Давайте рассмотрим программный код, сгенерированный посредством записи макросов при построении диаграммы на основе исходных данных (в соответствии с рисунком 4.18).

Charts.Add

ActiveChart.SetSourceData Source:=Sheets("Лист1").Range("B3:F12")

ActiveChart.LocationWhere:=xlLocationAsNewSheet

Здесь, в первой строке, коллекция Charts является коллекцией всех листов диаграмм в рабочей книге, и, как каждая коллекция, она имеет метод добавления нового элемента — Add. Таким образом после выполнения первой строки кода Charts .Add в коллекцию Charts будет добавлен новый, пока еще пустой лист диаграммы, который Excel автоматически делает активным. Для обращения к текущей активной диаграмме можно использовать как объект Chart (например, Charts ("Диаграмма1")), таки объект VBA ActiveChart (рисунок 4.19). 

Рисунок 4.19 − Новая диаграмма, расположенная на отдельном листе

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

Так, для того чтобы задать диапазон исходных данных диаграммы, необходимо щелкнуть на ней правой кнопкой мыши и выбрать команду контекстного меню «Выбрать данные» (Source Data). На экране появится диалоговое окно «Выбор источника данных» (рисунок 4.20). Здесь в поле Диапазон данных для диаграммы можно указать диапазон исходных данных диаграммы.

Полный синтаксис метода SetSourceData следующий.

SetSourceData (Source, PlotBy)

Здесь Source — это ссылка на диапазон ячеек, a PlotBy — константа, принимающая значение xlColumns (ряды данных в столбцах) или xlRows (ряды данных в строках). Следует отметить, что в нашем коде аргумент PlotBy отсутствует, так как при записи макроса программа сочла возможным опустить его, поскольку структура исходных данных предполагает, что ряды данных расположены в столбцах.

Рисунок 4.20 − Диалоговое окно для определения диапазона исходных данных диаграммы

В третьей строке рассматриваемого кода используется метод Location. Синтаксис этого метода следующий.

Location (Where, Name)

Здесь константа Where может принимать значения xlLocationAsNewSheet (на новом листе диаграммы), xlLocationAsNewObject (на рабочем листе) и xlLocationAutomatic (автоматический выбор), a Name — это строка, которая определяет следующее:

■ имя нового листа, на котором будет размещена диаграмма (параметр where имеет значение xlLocationAsNewSheet);

■ имя рабочего листа, на котором будет размещена встроенная диаграмма (параметр Where имеет значение xlLocationAsNew).

Полезно будет отметить следующее: так как использование метода Charts.Add подразумевает, что новая диаграмма будет размещаться на новом листе, последняя строка сгенерированного макрорекодером кода является лишней, из ваших подпрограмм ее можно удалить. Поскольку объекты диаграмм Excel способны распознавать большое количество событий, многие из которых связаны с манипуляцией мышью, их в принципе можно рассматривать как специализированные элементы управления ActiveX, помещенные в рабочую книгу. Сам объект диаграммы генерирует события Activate, Deactivate и Calculate. Перечислим еще несколько событий, для которых возможно написание подпрограмм обработки.

DragOver и DragPlot. Генерируются, когда объекты перемещаются над внедренной диаграммой или опускаются на нее соответственно.

MouseDown, MouseUp и MouseMove. Генерируются в ответ на действия мыши: нажатие левой кнопки, отпускание левой кнопки и перемещение указателя соответственно.

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

SeriesChange. Генерируется, когда пользователь изменяет значение элемента данных на самой диаграмме (а не исходные значения, содержащиеся в рабочем листе).

Практическая часть

Если элементы матрицы В рассчитаны по формуле , то говорят, что матрица В получена транспонированием матрицы А относительно неглавной диагонали (рисунок 4.21).

Sub Transp()

Dim m, n As Integer

Dim i, j As Integer

m = Selection.Rows.Count

n = Selection.Columns.Count

For j = 1 To m

For i = 1 To n

Selection.Cells(j + m + 1, i) = Selection.Cells(m + 1 - i, n + 1 - j)

Next i

Next j

End Sub

Создадим макрос, выполняющий следующие операции.

  1. При первом запуске макроса значение ячейки АЗ листа «Лист1»записывается в ячейку В2 листа «Лист2».

  2. При втором запуске макроса значение ячейки АЗ листа «Лист1» записывается в ячейку В4 листа «Лист2».

  3. При третьем запуске макроса значение ячейки АЗ листа «Лист1» записывается в ячейку В6 листа «Лист2» и т. д.

В ячейку Лист1!АЗ значения вводятся вручную перед очеред­ным запуском макроса.

Рисунок 4.21 − Матрицы

Используем ячейку Лист1!А4 в качестве вспомогательной ячей­ки. В нее следует записывать нуль перед серией запусков макроса (рисунок 4.22).

Рисунок 4.22 – Веделенная чейка B5

В активную книгу Excel вставим модуль, и далее в окно кода введем следующее:

Sub Macr1()

Dim i As Integer

Dim M As Range

Set M = Range("Лист2!b1: Лист 2!b200")

i = Range("Лист 1!A4").Value + 2

M(i) = Range("Лист 1!A3").Value

Range("Лист 1!A4").Value = i

End Sub

При первом запуске макроса Macr1 будет происходить следую­щее:

1) Переменной i будет присвоено значение 2;

2) Переменной M(2) (т. е. ячейке В2 листа Лист2) будет при­своено значение ячейки АЗ листа Лист1, например, 100;

3) В ячейку А4 листа Лист! будет записано значение i, т. е. 2.

При втором запуске макроса:

переменной i будет присвоено значение 4; (рисунок 4.23)

И так далее…

Рисунок 4.23 – Результат работы

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]