Лекция 5 Microsoft Excel Открытие и закрытие рабочей книги Sub OpenChangeClose() Dо fName = Application.GetOpenFilename Loop Until fName <> False Set myBook = WorkBooks.Open(Filename:=fName) myBook.Close savechanges:=False Set newBook = Workbooks.Add Do fName = Application.GetSaveAsFilename Loop Until fName <> False newBook.SaveAs Filename :=fName End Sub Работа с объектом Range Объект Range представляет отдельную ячейку, диапазон ячеек, целую строку или колонку, несколько выделенных областей или трехмерный диапазон. Объект Range несколько необычен, поскольку может представлять как одну, так и множество ячеек. Для объекта Range не предусмотрен специальный объект-набор, и в зависимости от конкретной ситуации его можно считать либо отдельным объектом, либо набором. Объект Range возвращают многие свойства и методы, что отражает приведенный ниже список: ActiveCell BottomRightCell Cells ChangmgCells CircularReference Columns CurrentArray CurrentRegion Dependents DirectDependents DirectPrecedents EntireColumn EntireRow Next Offset PageRange Precedents Range RowFields RowRange Rows Selection TableRange1 TableRange2 TopLeftCell UsedRange VisibleRange Worksheets("Sheet1").Range( "А1") .Value = 3 Range("B1") .Formula = "=5-10*RAND()" Range("C1:E3").Value = 6 Range("A1", "E3").ClearContents Range("myRange"). Font. Bold = True Range( "Sheetl!yourRange"). Value = 3 Set objRange = Range( "myRange") Другие свойства и методы объекта Range позволяют строить весьма сложные выражения, возвращающие поддиапазоны (subranges) или наддиапазоны (super-ranges) этого объекта. Среди свойств и методов, обычно применяемых с этой целью, можно отметить Areas, Cells, Columns, EntireColumn, EntireRow, Range и Rows. По-другому Worksheets( "Sheet1").Cells(1, 1). Value = 3 Cells(1, 2) .Formula - "=5-10*RAND() Set objRange = Worksheets( "Sheetl") .Cells(1, 1) Offset For Each с In Worksheets("Sheet1").Range("A1 :A10").Cells c.0ffset(0, 1).Formula = "hell-o" Next c 1 CurrentRegion и UsedRange Эти два свойства очень полезны, когда программа работает с диапазонами, размерами которых Вы не можете управлять. Текущий регион (current region) -это диапазон ячеек, ограниченный пустыми строками и колонками или сочетанием пустых строк, пустых колонок и границ рабочего листа. Использованный диапазон (used range) ограничен левой верхней и правой нижней заполненными ячейками, наиболее удаленными друг от друга. В этом диапазоне содержатся все заполненные ячейки листа, а также расположенные между ними пустые ячейки. На листе может быть только один такой диапазон, и UsedRange является свойством объекта Worksheet, а не Range. Организация циклов для перебора ячеек диапазона For Each...Next и Do...Loop. Sub GoodRemoveDuplicates() Worksheets("Sheet1").Range("A1").Sort _ key1 :=Worksheets( "Sheet1 ").Range( "А1 ") Set currentCell = Worksheets( "Sheet1 ").Range( "А1 ") Do While Not lsEmpty(currentCell) Set nextCell = currentCell.0ffset(1, 0) If nextCell.Value = currentCell.Value Then currentCell.EntireRow.Delete End If Set currentCell = nextCell Loop End Sub У объекта Range есть свойство Address – адрес ячеек диапазона в виде строки. Включение и отключение обработки событий Для включения или отключения обработки событий предназначено свойство EnableEvents. Например, при сохранении книги методом Save возникает событие BeforeSave. Вы можете предотвратить это событие, установив свойство EnableEvents как False перед вызовом метода Save: Application.EnableEvents = False ActiveWorkbook.Save Application.EnableEvents = True Использование событий, связанных с рабочими листами События, связанные с рабочими листами, включены по умолчанию. Чтобы просмотреть процедуры обработки событий для конкретного листа, подходит любой из следующих методов: Щелкните правой кнопкой мыши ярлычок листа, выберите в контекстном меню команду View Code (Исходный текст) и укажите в списке Procedure (Процедура) имя нужного события. Выберите из меню Tools (Сервис) команду Macro (Макрос), затем — Visual Basic Editor (Редактор Visual Basic). Теперь выберите в окне проекта интересующий Вас лист и либо щелкните кнопку View Code (Программа), либо вызовите из меню View (Вид) команду Code (Программа). В списке Object (Объект) укажите строку Worksheet или Chart, а в списке Procedure (Процедура) — имя события. События на уровне рабочего листа События на уровне листа возникают при активизации листа или изменении его ячеек, как показано в таблице: Событие Описание 2 Activate BeforeDoubleClick Возникает при активизации листа. Используйте это событие вместо свойства OnSheetActivate. Возникает при двойном щелчке ячейки листа. Используйте это событие вместо свойства OnDoubleClick. BeforeRightClick Возникает при щелчке ячейки листа правой кнопкой мыши. Calculate Возникает при пересчете листа. Используйте это событие вместо свойства OnCalculate. Возникает при изменении формулы в ячейке. Используйте это событие вместо свойства OnEntry. Change Deactivate SelectionChange Происходит в том случае, когда данный лист активен, а пользователь активизирует другой лист. Не генерируется, если пользователь активизирует другое окно, отображающее тот же лист. Используйте это событие вместо свойства OnSheetDeactivate. Возникает при выделении ячейки листа. Подробнее об этих событиях см. соответствующие разделы справочной системы. В следующем примере при каждом пересчете листа происходит коррекция размеров колонок от А до F: Private Sub Worksheet_Calculate() Columns("A:F").AutoFit End Sub Некоторые события позволяют изменять стандартное поведение приложения. Например, можно перехватывать щелчки правой кнопкой мыши и добавлять в контекстное меню для ячеек В1:В10 новую команду: Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) For Each icbc In Application.CommandBars("cell").Controls If icbc.Tag = "brccm" Then icbc.Delete Next icbc If Not Application.lntersect(Target, Range("b1:b10")) Is Nothing Then With Application.CommandBars("cell").Controls .Add(Type:=msoControlButton, before:=6, temporary:=True) .Caption = "New Context Menu Item" .OnAction = "MyMacro" .Tag = "brccm" End With End If End Sub События на уровне диаграммы События на уровне диаграммы, как и на уровне рабочего листа, происходят при ее активизации или изменении и описаны в таблице: Событие Activate Описание Возникает при активизации листа диаграммы (не работает для внедренных диаграмм). Используйте это событие вместо свойства OnSheetActivate. BeforeDoubleClick Возникает при двойном щелчке диаграммы. Используйте это событие вместо свойства OnDoubleClick. BeforeRightClick Возникает при щелчке диаграммы правой кнопкой мыши. Calculate Происходит, когда пользователь инициирует построение диаграммы по новым или измененным данным. Deactivate DragOver Происходит в том случае, когда данный лист диаграммы активен, а пользователь активизирует другой лист. Не генерируется при активизации другого окна, отображающего тот же лист. Используйте это событие вместо свойства OnSheetDeactivate. Возникает при перемещении мышью данных поверх диаграммы. DragPlot Возникает при перемещении мышью диапазона ячеек поверх диаграммы. MouseDown Возникает при щелчке кнопки мыши, когда ее указатель находится над диаграммой. 3 MouseMove Возникает при перемещении указателя мыши над диаграммой. MouseUp Возникает при отпускании кнопки мыши, когда ее указатель находится над диаграммой. Resize Возникает при изменении размера диаграммы. Select Возникает при выделении какого-либо элемента диаграммы. SeriesChange Возникает при изменении данных в какой-либо точке диаграммы. Подробнее об этих событиях см. соответствующие разделы справочной системы. События, связанные с листами диаграмм, доступны в редакторе Visual Basic по умолчанию. Чтобы написать процедуру обработки события для внедренной диаграммы, создайте новый объект в модуле класса с помощью ключевого слова WithEvents (см. раздел “Модули классов и события” далее в этой главе). Эта процедура изменяет на диаграмме цвет точки при изменении пользователем ее значения: Private Sub Chart_SeriesChange(ByVal Seriesindex As Long._ ByVal Pointindex As Long) Set p = ActiveChart.SeriesCollection(Serieslndex).Points(Pointlndex) p.Border .ColorIndex = 3 End Sub События на уровне рабочей книги События на уровне книги происходят при изменении книги или любого из ее листов. Событие Activate Описание Возникает при активизации книги. AddIninstall Происходит, когда пользователь устанавливает данную книгу как надстройку. Используйте это событие вместо макроса Auto_Add. AddInUninstall Возникает при отмене использования данной книги как надстройки. Применяйте это событие вместо макроса Auto_Remove. Beforeclose Возникает перед закрытием книги. Используйте это событие вместо макроса Auto_Close. BeforePrint Возникает перед выводом книги на печать. BeforeSave Возникает перед сохранением книги. Используйте это событие вместо свойства OnSave. Deactivate Происходит, когда данная книга активна, а пользователь активизирует другую книгу. NewSheet Возникает при создании нового листа. Open Возникает при открытии книги. Используйте это событие вместо макроса Auto_0pen. SheetActivate Возникает при активизации одного из листов книги. Используйте это событие вместо свойства OnSheetActivate. SheetBeforeDoubleClick Возникает при двойном щелчке ячейки листа (не предназначено для листов диаграмм). Используйте это событие вместо свойства OnDoubleClick. SheetBeforeRightClick Происходит, когда пользователь щелкает правой кнопкой мыши ячейку одного из листов книги (не предназначено для листов диаграмм). SheetCalculate Возникает при пересчете одного из листов книги (не предназначено для листов диаграмм). Используйте это событие вместо свойства OnCalculate. SheetChange Возникает при изменении формулы в ячейке (не предназначено для листов диаграмм). Используйте это событие вместо свойства OnEntry. SheetDeactivate Возникает при активизации другого листа книги. Используйте это событие вместо свойства OnSheetDeactivate. SheetSelectionChange Возникает при изменении текущей выделенной области на одном из листов книги (не предназначено для листов диаграмм). WindowActivate Происходит, когда в результате действий пользователя любое окно, в котором отображается данная книга, оказывается в фокусе. Используйте это событие вместо свойства OnWindow. WindowDeactivate Происходит, когда в результате действий пользователя любое окно, в 4 котором отображается данная книга, теряет фокус. Используйте это событие вместо свойства OnWindow. WindowResize Возникает при открытии, изменении размеров, разворачивании или сворачиваний любого окна, в котором отображается данная книга. Эта процедура разворачивает окно приложения Microsoft Excel при открытии книги: Sub Workbook_0pen() Application.WindowState = xlMaximized End Sub События на уровне приложения События на уровне приложения происходят при создании и открытии книги, а также при изменении любого листа в любой открытой книге. Событие NewWorkbook Описание Возникает при создании новой книги. SheetActivate Возникает при активизации листа в открытой книге. Используйте это событие вместо свойства OnSheetActivate. SheetBeforeDoubleClick Возникает при двойном щелчке ячейки листа в открытой книге (не предназначено для листов диаграмм). Используйте это событие вместо свойства OnDoubleClick. SheetBeforeRightClick Возникает при щелчке правой кнопкой мыши ячейки листа в открытой книге (не предназначено для листов диаграмм). SheetCalculate Возникает при пересчете листа в открытой книге (не предназначено для листов диаграмм). Используйте это событие вместо свойства OnCalculate. SheetChange Возникает при изменении формулы в ячейке в открытой книге (не предназначено для листов диаграмм). Используйте это событие вместо свойства OnEntry. SheetDeactivate Возникает при деактивизации листа в открытой книге. Используйте это событие вместо свойства OnSheetDeactivate. SheetSelectionChange Возникает при изменении текущей выделенной области на листе открытой книги (не предназначено для листов диаграмм). WindowActivate Происходит, когда пользователь устанавливает фокус на одно из открытых окон. Используйте это событие вместо свойства OnWindow. WindowDeactivate Происходит, когда в результате действий пользователя одно из открытых окон теряет фокус. Используйте это событие вместо свойства OnWindow. WindowResize Возникает при изменении размеров одного из открытых окон. WorkbookActivate Происходит, когда пользователь устанавливает фокус на одну из открытых книг. WorkbookAddInInstall Возникает при установке книги как надстройки. WorkbookAddInUninstall Возникает при отмене использования данной книги как надстройки. WorkbookBeforeClose Возникает перед закрытием книги. WorkbookBeforePrint Возникает перед выводом книги на печать. WorkbookBeforeSave Возникает перед сохранением книги. WorkbookDeactivate Происходит, когда в результате действий пользователя одна из открытых книг теряет фокус. WorkbookNewSheet Возникает при добавлении нового листа к открытой книге. WorkbookOpen Возникает при открытии книги. Модули классов и события В отличие от листов диаграмм, события, связанные с внедренными диаграммами и объектом Application, по умолчанию отключены. Прежде чем Вы сможете работать с событиями применительно к внедренной диаграмме или объекту Application, Вы должны создать новый модуль класса и объявить в нем объект типа Chart или Application с событиями. Для создания нового модуля класса в редакторе Visual Basic предназначена команда Class Module (Модуль класса) из меню Insert (Вставка). Чтобы включить события для объекта Application, добавьте в модуль класса объявление: Public WithEvents Арр As Application 5 После того как новый объект с событиями объявлен, он появляется в списке Object (Объект) модуля класса, и Вы можете писать для него процедуры обработки событий. [При выборе этого объекта в списке Object (Объект) события, допустимые для него, перечисляются в списке Procedure (Процедура).] Но, прежде чем работать со своими процедурами, Вы должны подключить объект, объявленный в модуле класса, к объекту Application. Для этого объявите в любом модуле: Public Х As New EventGlass где EventClass — имя модуля класса, созданного Вами для обработки событий. Создав объектную переменную Х (экземпляр класса EventClass), Вы можете приравнять объект Арр класса EventClass объекту Application Microsoft Excel: Sub InitializeApp() Set X.Арр = Application End Sub После выполнения процедуры InitializeApp объект Арр в модуле класса EventClass указывает на объект Application Microsoft Excel, и определенные в модуле процедуры обработки событий будут выполняться при каждом возникновении соответствующих событий. Хотя все это вроде бы требует большого объема работы, преимущество такой схемы в том, что можно использовать одну и ту же процедуру обработки событий для многих объектов. Пусть, например, в модуле класса объявлен объект Chart с событиями: Public WithEvents cht As Chart Теперь — чтобы процедуры обработки событий выполнялись всякий раз, когда происходит событие, связанное либо с первой, либо со второй диаграммой, — можно написать такой код: Dim С1 As New EventClass Dim C2 As New EventClass Sub IntitializeCharts() Set Cl.cht = Worksheets(1).ChartObjects(1).Chart Set C2.cht = Worksheets(1).Chart0bjects(2).Chart End Sub В модуле класса допускается объявлять объекты Worksheet или Workbook с событиями и использовать процедуры обработки событий нового класса с несколькими листами — в дополнение к стандартным процедурам обработки событий. Это позволяет написать процедуру обработки события Activate, выполняемую только при активизации, скажем, первого или пятого листа. Или использовать объект Chart, объявленный в модуле класса, чтобы создать процедуру обработки событий как для внедренных диаграмм, так и для листов диаграмм. 6