- •Объектная модель
- •Полная и неявная ссылка на объект
- •Ссылка на активную рабочую книгу, лист, ячейку, диаграмму и принтер
- •Загрузка инсталлированной надстройки
- •Управление уровнем безопасности
- •Семейство встроенных диалоговых окон
- •Объект FileDialog
- •Методы объекта Application
- •Установка выполнения специфицированной процедуры при нажатии заданной комбинации клавиш
- •Переопределение горячих клавиш приложения
- •Проверка правописания отдельного слова
- •Симулирование ячеек рабочего листа
- •Электронные часы в ячейке рабочего листа
- •Получение данных из закрытой рабочей книги
- •События объекта Application
- •IgnoreReadOnlyRecommended — необязательный параметр, указывающий надо ли отображать предупреждение о том, что книга была сохранена в режиме "только для чтения";
- •Установка и снятие защиты книги
- •Методы объекта Worksheet
- •Объект Protection
- •События объекта Worksheet
- •Добавление к графическому объекту обработчика события Click
- •Примечание
- •Свойства объекта Range
- •Управление стилем границы диапазона и объекта Border
- •Функции rgb и qbColor
- •Доступ к отдельным ячейкам диапазона
- •Выбор элементов на рабочем листе или в книге
- •Объект Characters
- •Объект Comment
- •Определение текущего диапазона
- •Объект Font
- •Объект Interior
- •Установка числового формата
- •Переопределение размеров диапазона
- •Методы объекта Range
- •Табуляция функции
- •Заполнение диапазона по одному значению
- •Специальная вставка
- •Вставка диапазона с транспонированием
- •Бегущая картинка
- •Поиск значения в диапазоне
- •Повторный поиск и поиск всех значений
- •Поиск по формату
- •Замена значений
- •Ввод в диапазон неповторяющихся значений
- •Озвучивание текста
- •Построение графа
- •Пользовательские функции
- •Математические функции
- •Надстройки
- •Где хранятся макросы?
Установка и снятие защиты книги
Защита на рабочую книгу от внесения в нее изменений устанавливается методом Protect, а снимается — методом Unprotect.
Protect(Password, Structure, Windows) Здесь:
Password — необязательный параметр, задающий пароль для защиты книги. Если параметр опущен, то книга защищена без пароля;
Structure — необязательный параметр, устанавливающий, защищена ли структура книги, т. е. взаимное расположение листов;
Windows — необязательный параметр, определяющий защищены ли окна книги.
Защита с рабочей книги снимается методом Unprotect.
Unprotect(Password)
Здесь Password — необязательный параметр, указывающий пароль защиты.
В приводимом ниже коде из модуля рабочего листа обрабатывается событие BeforeRightciick объекта Worksheet (листинг 5.25). При щелчке правой кнопкой мыши на ячейке А1 устанавливается защита структуры и окон рабочей книги. Щелчок же правой кнопкой мыши на ячейке В1 снимает эту защиту.
Листинг 5.25. Установка и снятие защиты. Модуль рабочего листа
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, _
Cancel As Boolean)
If Target.Address = "$A$1" Then
Cancel = True
ThisWorkbook.Protect Password:="wow", Structure:=True, _
Windows:=True
End If
If Target.Address = "$B$1" Then
Cancel = True
ThisWorkbook.Unprotect Password:="wow"
End If
End Sub
Сохранение рабочей книги с именем, соответствующим текущей дате
Метод SaveAs объекта Workbook производит сохранение рабочей книги. Если необходимо, чтобы книга сохранилась так, чтобы ее именем была текущая дата, то можно воспользоваться кодом из листинга 5.26.
Листинг 5.26. Сохранение рабочей книги с именем, соответствующим текущей дате
Sub SaveAsTodaysDate()
Dim FileName As String, Path As String
Path = "C:\"
FileName » Format(Now(), "mmddyy")
ActiveWorkbook.SaveAs Path & FileName
End Sub
События объекта Workbook
У объекта Workbook имеется большая коллекция событий, перечисленных в табл. 5.6. Они позволяют управлять процессом открытия книги, печатью, отслеживать любые изменения, произведенные в ней, и т. д.
Таблица 5.6. События объекта Workbook
Событие |
Генерируется |
Activate |
При активизации рабочей книги |
Addinlnstall |
Когда рабочая книга инсталлируется как надстройка |
AddinUninstall |
Когда рабочая книга удаляется как инсталлированная надстройка |
BeforeClose |
Перед закрытием рабочей книги |
BeforePrint |
Перед печатью |
BeforeSave |
Перед сохранением рабочей книги |
Таблица 5.6. События объекта Workbook(Продолжение)
Deactivate |
При потере фокуса рабочей книгой |
NewSheet |
При создании нового листа |
Open |
При открытии рабочей книги |
PivotTableCloseConnection |
При закрытии связи сводной таблицы с источником данных |
PivotTableOpenConnection |
При установке связи сводной таблицы с источником данных |
SheetActivate |
При активизации любого рабочего листа |
SheetBeforeDoubleClick |
При двойном щелчке, но перед выполнением действий, назначенных по умолчанию двойному щелчку |
SheetBeforeRightClick |
При щелчке правой кнопкой мыши, но перед выполнением действий, назначенных по умолчанию этому щелчку |
SheetCalculate |
После завершения всех вычислений во всех рабочих листах и перерисовки диаграмм |
SheetChange |
При изменении значения на любом листе в какой-либо ячейке |
SheetDeactivate |
При потере листом фокуса |
SheetFollowHyperlink |
При щелчке на гиперссылке |
SheetPivotTableUpdate |
После обновления сводной таблицы |
SheetSelectionChange |
При изменении выделения на любом листе |
WindowActivate |
При активизации окна |
WindowDeactivate |
При деактивизации окна |
WindowResize |
При изменении размеров окна |
Запрет закрытия рабочей книги
У процедуры обработки события BeforeClose объекта Workbook, генерируемого перед закрытием рабочей книги, имеется параметр Cancel. При значении True он блокирует закрытие книги. При значении False — закрытие разрешено. Например, следующий код (листинг 5.27) из модуля ЭтаКнига разрешает пользователю закрыть книгу только в случае, если в ячейку А1 введена строка "Go".
Листинг 5.27. Запрет закрытия рабочей книги. Модуль ЭтаКнига
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If Range("A1").Value = "Go" Then
Cancel = False
Else
Cancel = True
End If
End Sub
Автоматическое изменение размеров столбцов при проведении вычислений
Для автоматического изменение размеров столбцов при проведении вычислений необходимо обработать метод AutoFit объекта Range при перехвате события Calculate объекта Worksheet, которое и генерируется, когда на рабочем листе производятся вычисления (листинг 5.28).
Листинг 5.28. Автоматическое изменение размеров столбцов.
Модуль рабочего листа
Private Sub Worksheet_Calculate()
Columns("A:F").AutoFit
End Sub
Как отследить за тем, кто открывал рабочую книгу?
Для того чтобы отследить, кто открывал рабочую книгу, достаточно воспользоваться процедурой обработки события Open, при реализации которого осуществляется ввод информации о текущем пользователе во вспомогательный текстовый файл, например, как это делается в коде листинга 5.29. Данные о пользователе получаются с помощью свойства UserName объекта Application.
Private Sub Workbook_Open()
Open ThisWorkbook.Path & "\info.log" For Append As #1
Print #1, Application.UserName, Now
Close #1
End Sub
Семейство Worksheets
Семейство Worksheets инкапсулирует в себе все рабочие листы рабочей книги. Основные свойства этого семейства возвращают число элементов и конкретный элемент семейства. Методы же семейства Worksheets предоставляют более широкий ассортимент операций, начиная созданием нового листа и заканчивая его удалением. Свойства и методы семейства Worksheets перечислены в табл. 5.7 и 5.8.
Таблица 5.7. Свойства семейства Worksheets
Свойство |
Описание |
Count |
Возвращает число элементов семейства |
Item |
Возвращает элемент семейства |
Таблица 5.8. Методы семейства Worksheets
Метод |
Описание |
Add |
Создает новый лист. Add (Before, After, Count, Type) Здесь:
|
Copy |
Копирует лист. Copy (Before, After) Здесь:
|
Delete |
Удаляет лист |
Move |
Перемещает лист. Move (Before, After) Здесь:
|
Printout |
Печать листа или группы листов. Printout (From, To, Copies, Preview, ActivePrinter, PrintToFile, _ Collate, PrToFileName) Здесь:
|
Таблица 5.8. Методы семейства Worksheets(Продолжение)
Метод |
Описание |
|
|
PrintPreview |
Отображает окно предварительного просмотра |
Select |
Выбирает специфицированный лист |
FillAcrossSheets |
Копирует указанный диапазон в другие рабочие листы данной коллекции. FillAcrossSheets(Range, Type) Здесь:
|
Вставка нового листа с именем,
отличным от существующих
В качестве примера работы с методами Add и Move приведем текст процедуры, которая в книгу добавляет новый рабочий лист, причем первоначально
проверяет, существует ли уже лист со специфицированным именем (листинг 5.30). Если такой лист имеется или пользователь забыл специфицировать имя добавляемого листа, то об этом отображается сообщение и процедура завершает работу.
Sub AddNewSheet(newSheetName As String)
Dim ws As Worksheet
ForEach ws In Worksheets
If ws.name = newSheetName Or newSheetName = "" Then
MsgBox "Такой лист уже существует", vblnformation
Exit Sub
End If
Next
Sheets.Add Type:="Worksheet"
With ActiveSheet
.Move After=Worksheets(Worksheets.Count)
.Name = newSheetName
End With
End Sub
Объект Worksheet
В иерархии MS Excel объект Worksheet идет сразу после объекта Workbook и представляет собой рабочий лист. Объект Worksheet возвращается либо как элемент семейства Worksheets, либо как элемент семейства Sheets одноименным свойством объекта Workbook, либо как активный рабочий лист — свойством ActiveSheet.
Свойства объекта Worksheet
Объект Worksheet обладает огромной коллекцией свойств, предоставляющих разработчику обширные средства от получения доступа к конкретной ячейке до сложной обработки данных типа "фильтрация". В табл. 5.9 перечислены свойства этого объекта.
Таблица 5.9. Свойства объекта Worksheet
Свойство |
Описание |
AutoFilter |
Возвращает объект AutoFilter, инкапсулирующий в себе данные об используемом автофильтре для обработки данных, и значение Nothing, если фильтр не применяется |
AutoFilterMode |
Возвращает значение True, если в ячейках отображаются раскрывающиеся списки автофильтра |
Cells |
Возвращает либо одну ячейку, либо семейство ячеек |
CircularReference |
Возвращает ссылку на диапазон, содержащий циклическую ссылку |
Columns |
Возвращает либо один столбец, либо семейство столбцов |
Comments |
Возвращает семейство Comments всех примечаний |
ConsolidationFunction |
Возвращает код функции консолидации данных, используемой при построении итоговой таблицы |
ConsolidationOptions |
Возвращает трехмерный массив, содержащий в себе данные о конструируемой итоговой таблице |
ConsolidationSources |
Возвращает трехмерный массив, содержащий в себе информацию о расположении консолидируемых данных |
DisplayPageBreaks |
Управляет отображением линий разрыва страницы |
EnableAutoFilter |
Если значение этого свойства равно True, то раскрывающиеся списки автофильтра достижимы для пользователя даже в случае установки защиты на рабочем листе. При этом должен быть только включен режим защиты пользовательского интерфейса |
EnableCalculation |
Если значение этого свойства равно False, то не происходит пересчета формул на рабочем листе, если же его значение равно True, то пересчет производится автоматически |
EnableOutlining |
Если значение этого свойства равно True, то управление структурой достижимо для пользователя даже в случае установки защиты на рабочем листе. При этом должен быть только включен режим защиты пользовательского интерфейса |
EnablePivotTable |
Если значение этого свойства равно True, то управление сводной таблицей достижимо для пользователя даже в случае установки защиты на рабочем листе. При этом должен быть только включен режим защиты пользовательского интерфейса |
EnableSelection |
Определяет, какие ячейки могут быть выбраны на рабочем листе, если на нем установлена защита. Допустимыми значениями являются следующие постоянные XlEnableSelection: xlNoSelection (выбор запрещен), xlNoRestrictions (выбирать можно все ячейки), xlUnlockedCells (выбирать можно только те ячейки, у которых значение свойства Locked установлено равным False) |
FilterMode |
Это свойство отбражает значение True, если на рабочем листе имеются списки, к которым были применены фильтры, в результате чего некоторые их элементы оказались скрытыми |
HPageBreaks |
Возвращает семейство HpageBreaks, состоящее из объектов HPageBreak, инкапсулирующих в себе информацию о горизонтальных разрывах страницы |
Hyperlinks |
Возвращает семейство Hyperlinks, состоящее из объектов Hyperlink, инкапсулирующих в себе информацию о гиперссылках |
Index |
Возвращает значения индекса рабочего листа в семействе Sheets |
MailEnvelope |
Заголовок отсылаемого по электронной почте сообщения, созданного на основе рабочего листа |
Name |
Имя рабочего листа |
Таблица 5.9. Свойства объекта Worksheet
Свойство |
Описание |
Names |
Возвращает семейство Names всех имен данного рабочего листа |
Outline |
Возвращает объект Outline, инкапсулирующий в себе информацию о структуре, созданной на рабочем листе |
PageSetup |
Возвращает объект PageSetup, инкапсулирующий в себе информацию о параметрах страницы |
ProtectContents |
Свойство только для чтения, проверяющее установлена ли защита на содержимое рабочего листа |
Name |
Имя рабочего листа |
Names |
Возвращает семейство Names всех имен данного рабочего листа |
Outline |
Возвращает объект Outline, инкапсулирующий в себе информацию о структуре, созданной на рабочем листе |
PageSetup |
Возвращает объект PageSetup, инкапсулирующий в себе информацию о параметрах страницы |
ProtectContents |
Свойство только для чтения, проверяющее установлена ли защита на содержимое рабочего листа |
ProtectDrawingObjects |
Свойство только для чтения, проверяющее установлена ли защита на графические объекты |
ProtectScenarios |
Свойство только для чтения, проверяющее установлена ли защита на сценарии |
Protection |
Возвращает объект ^Protection, инкапсулирующий в себе информацию об установленной на листе защите |
ProtectionMode |
Свойство только для чтения, проверяющее установлена ли защита только пользовательского интерфейса |
QueryTables |
Возвращает семейство QueryTables состоящее из объектов QueryTable, инкапсулирующих в себе информацию о таблицах, построенных на основе запроса к внешним базам данных |
Range |
Возвращает объект Range, представляющий диапазон |
Rows |
Возвращает либо одну строку, либо семейство строк |
Scripts |
Возвращает семейство Scripts, состоящее из объектов Script, инкапсулирующих в себе информацию об используемых скриптах, когда лист сохраняется как Web-страница |
ScrollArea |
Задает диапазон, в котором разрешена прокрутка |
Shapes |
Возвращает семейство Shapes, состоящее из объектов Shape, инкапсулирующих в себе информацию о расположенных на листе фигурах |
SmartTags |
Возвращает семейство SmartTags, состоящее из объектов SmartTag, инкапсулирующих в себе информацию о смарт-тегах |
StandardHeight |
Возвращает стандартную высоту ячеек |
StandardWidth |
Возвращает стандартную ширину ячеек |
Tab |
Возвращает объект Tab, инкапсулирующий в себе информацию о теге листа |
Type |
Определяет тип листа. Допустимыми значениями могут быть следующие постоянные xlSheetType: xlChart, xlDialogSheet, xlExcel4IntlMacroSheet, xlExcel4MacroSheet И xlWorksheet |
UsedRange |
Возвращает объект Range, который содержит данные |
VPageBreaks |
Возвращает семейство VPageBreaks, состоящее из объектов VPageBreak, инкапсулирующих в себе информацию о вертикальных разрывах страницы |
Visible |
Управляет видимостью листа. Допустимые значения: True (рабочий лист видим на экране), False (не видим, т. е. скрыт, но его можно отобразить на экране командой Формат ► Лист ►Отобразить), xlVeryHidden (скрыт, и его можно отобразить на экране только программно) |
Проверка установки защиты на содержание
рабочего листа
Свойство ProtectContents возвращает значение True, если содержание рабочего листа защищено. Код листинга 5.31 проверяет наличие защиты содержания и в случае присутствия таковой предлагает ее снять.
Sub DemoProtectContents()
On Error Resume Next
If Worksheets(1).ProtectContents Then
MsgBox "Содержание рабочего листа защищено"
Worksheets(1).Unprotect
Else
MsgBox "Содержание рабочего листа не защищено"
End If
End Sub
Проверка существования рабочего листа
Все листы рабочей книги образуют семейство Sheets. Для того чтобы определить, существует ли специфицируемый лист, достаточно попытаться получить на него ссылку и, в случае отсутствия таковой, перехватить генерируемую ошибку. Код листинга 5.32 демонстрирует подобный подход. Функция SheetExists возвращает значение True, если данный лист существует, и False — в противном случае.
Листинг 5.32. Проверка существования рабочего листа
Function SheetExists(SheetName As String) As Boolean
Dim obj As Object
On Error GoTo errorHandler:
Set obj = Sheets(SheetName)
SheetExists = True
Exit Function
errorHandler:
SheetExists = False
End Function
