Лекция 5 Microsoft Excel Открытие и закрытие рабочей книги

advertisement
Лекция 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
Download