Текст книги "Excel. Трюки и эффекты"
Автор книги: Алексей Гладкий
Жанр: Программы, Компьютеры
сообщить о неприемлемом содержимом
Текущая страница: 6 (всего у книги 22 страниц)
На рис. 1.5 представлена значительно упрощенная структура объектов, доступ к которым имеет программист на VBA.
Как видно из приведенного рисунка, корневым (главным) объектом, доступным в VBA, является Application. Используя ссылку на этот объект, можно манипулировать как самим запущенным приложением Excel, так и такими объектами, как рабочие книги, листы, диаграммы, окна, меню, панели инструментов, – Application предоставляет доступ ко всем объектам Excel.
Объект Application содержит большое количество вложенных объектов. Они могут быть и объектами, с которыми можно взаимодействовать непосредственно (как Assistant – объект для работы с помощником), и представлять собой коллекции, содержащие другие объекты.
Рис. 1.5. Структура объектов Microsoft Excel
Ниже приведено описание некоторых особенно часто используемых коллекций:
• Cells – коллекция, содержащая все ячейки рабочего листа;
• CommandBars – коллекция, содержащая все меню и панели инструментов;
• Comments – коллекция, содержащая все примечания рабочего листа;
• ChartObjects – коллекция, содержащая все объекты-контейнеры внедренных в рабочий лист диаграмм (по одному объекту на каждую внедренную диаграмму);
• Charts – коллекция, содержащая все листы диаграмм рабочей книги;
• Dialogs – коллекция стандартных диалоговых окон Excel;
• Sheets – коллекция, содержащая все листы книги;
• Windows – коллекция всех отображаемых в Excel окон;
• Workbooks – коллекция, содержащая все открытые в Excel рабочие книги;
• Worksheets – коллекция, содержащая все рабочие листы книги.
Объект Selection (а вернее, свойство объекта Application) предоставляет доступ к данным, выделенным на активном листе рабочей книги. В Selection могут содержаться ссылки на объекты различного типа. Тип зависит от того, что именно выделено на листе (например, если выделены ячейки, то тип объекта Selection – Range).
Особого рассмотрения заслуживает объект Range. Он может содержать одну ячейку, диапазон ячеек или несколько диапазонов ячеек. Этот объект используется при необходимости получения или изменения значений в ячейках таблицы.
Подробная информация о наиболее часто используемых в книге объектах Excel приведена в приложении.
Доступ к объектам Excel из программыДля доступа к объектам Excel в программах на VBA можно использовать глобальную ссылку на объект Application, которая имеет такой же идентификатор – Application. Например, получение ссылки на выделенные данные может выглядеть следующим образом:
Set objSel = Application.Selection
Необходимо отметить, что использование ссылки с именем Application во многих случаях подразумевается по умолчанию, поэтому предыдущий пример можно записать так:
Set objSel = Selection
Аналогичным образом осуществляется доступ к остальным объектам. При этом с коллекциями Excel, такими как Workbooks, Worksheets и пр., работают как с обычными коллекциями VBA, содержащими ссылки на объекты:
Worksheets(1).Name = «Sheet 1»
Объектом Application предоставляются также ссылки на активную рабочую книгу, активный рабочий лист этой книги, активную ячейку листа, активную диаграмму и т. д. (подобные ссылки объекта Application, а также других объектов рассмотрены в приложении). Эти ссылки нужны для обеспечения возможности быстрого использования информации активного объекта, например:
ActiveCell.Value = 15
или
ActiveSheet.Name = «This sheet is now activated»
Глава 2
Рабочая область Microsoft Excel
В данной главе мы рассмотрим порядок работы с основными элементами рабочей области Microsoft Excel – рабочей книгой, рабочим листом и ячейкой (диапазоном). Кроме того, здесь же поговорим о работе с формулами и пользовательскими функциями.
Рабочая книга
Как отмечалось ранее, рабочая книга представляет собой файл Microsoft Excel (обычно с расширением XLSX), в котором хранится и обрабатывается необходимая информация. Используя некоторые несложные приемы, можно расширить возможности рабочей книги. Об этом будет рассказано в текущем разделе.
Автозапуск любимого файла при загрузке ExcelВозможности программы предусматривают автоматический запуск требуемого файла одновременно с открытием Excel. Иначе говоря, при открытии Excel на экране отобразится не пустая рабочая книга (как обычно), а содержимое конкретного файла. Для достижения такого эффекта необходимо поместить требуемый файл в каталог автоматической загрузки – XLStart. Этот каталог расположен в папке с файлами Microsoft Office (например, по адресу С: Program FilesMicrosoft OfficeOffice12XLSTART). При необходимости можно поместить в указанный каталог несколько файлов – в результате при запуске Excel они автоматически будут открыты в разных окнах. Однако для настройки автоматического запуска нескольких файлов удобнее выполнить следующие действия.
1. Открыть все файлы, которые должны автоматически открываться вместе с запуском Excel.
2. На вкладке Вид в группе Окно выбрать команду Сохранить рабочую область и в открывшемся окне по обычным правилам Windows указать путь к каталогу автоматической загрузки (в нашем примере – С: Program FilesMicrosoft OfficeOffice12XLStart), после чего нажать кнопку ОК.
В результате в каталог автозагрузки будет помещен файл с расширением XLW (это расширение файла рабочей области). Теперь при запуске Excel будут автоматически запускаться файлы, включенные в эту рабочую область.
Восстановление важной информации из испорченного файлаИспользование трюка, описание которого приводится в данном подразделе, позволяет извлечь данные из испорченного файла с помощью встроенного в Excel механизма специальной вставки. Для этого необходимо выполнить следующие действия.
1. Создать две новые пустые книги.
2. В первой книге выделить диапазон ячеек и скопировать его в буфер.
3. Перейти ко второй книге.
4. Во второй книге выделить ячейку А1. На вкладке Главная выбрать из раскрывающегося списка кнопки Вставить (группа Буфер обмена) пункт Вставить связь.
5. На вкладке Данные, в группе Подключения нажать кнопку Изменить связи.
6. В открывшемся окне по обычным правилам Windows указать путь к испорченному файлу.
В большинстве случаев данный способ позволяет извлечь данные из испорченного файла.
Быстрое размножение рабочей книгиИспользуя средства VBA, можно сохранить текущую рабочую книгу сразу в нескольких разных папках. Для этого следует написать и выполнить макрос, код которого приведен в листинге 2.1.
Примечание
Все приведенные в книге листинги можно загрузить с сайта издательства «Питер» по адресу http://www.piter.com/download/978591180547/.
Листинг 2.1. Размножение рабочей книги
Sub DuplicateBook()
Dim avarFileNames As Variant
' Формирование массива из путей для копий книги
avarFileNames = Array(«C:» & _
ActiveWorkbook.Name, «D:» & ActiveWorkbook.Name)
' Сохранение книги
ActiveWorkbook.SaveAs avarFileNames
End Sub
В приведенной программе используется возможность передавать методу SaveAs объекта Workbook массив строк. В результате выполнения данного макроса текущая рабочая книга будет сохранена одновременно на двух дисках – С: и D:.
Следует отметить, что после выполнения приведенного макроса текущей папкой для книги станет последний элемент массива avarFileNames. То есть при последующем выполнении команды Файл → Сохранить в данном случае книга будет сохранена на диске D:.
Сохранение рабочей книги с именем, представляющим собой текущую датуКопию текущей рабочей книги можно сохранить по указанному пути с именем, представляющим собой текущую дату, то есть в формате ддммгг.xlsx. Для этого нужно написать и запустить следующий макрос (листинг 2.2).
Листинг 2.2. Сохранение книги с именем, представляющим собой текущую дату
Sub DuplicateBook()
Dim avarFileNames As Variant
' Формирование массива из путей для копий книги
avarFileNames = Array(«C:» & _
ActiveWorkbook.Name, «D:» & ActiveWorkbook.Name)
' Сохранение книги
ActiveWorkbook.SaveAs avarFileNames
End Sub
В результате применения данного макроса текущая книга будет сохранена в прежнем каталоге, но под именем, соответствующим дате на момент сохранения (например, 140705.xls).
Создание книги с одним листомВ процессе работы иногда возникает необходимость создания рабочей книги, состоящей только из одного листа. Можно, конечно, создать обычную новую книгу и вручную удалить ненужные листы (напомню, что для удаления необходимо щелкнуть правой кнопкой мыши на ярлыке с именем листа и выбрать в контекстном меню пункт Удалить). Однако для решения данной задачи все же целесообразнее воспользоваться языком VBA и написать макрос, код которого приведен в листинге 2.3.
Листинг 2.3. Книга с одним листом
Sub NewOneSheetBook()
Workbooks.Add xlWBATWorksheet
End Sub
В результате выполнения данного макроса будет создана новая рабочая книга, в состав которой войдет только один рабочий лист. Эта книга будет открыта в отдельном окне.
Установка и снятие защиты рабочей книгиКак известно, защитить рабочую книгу от внесения в нее изменений и снять эту защиту можно с помощью соответствующих команд на вкладке Рецензирование в группе Изменения. Однако для этого можно также воспользоваться макросом, в котором содержатся следующие параметры: Password – для задания пароля, Structure – для защиты структуры книги (взаимного расположения рабочих листов) и Windows – для защиты окон книги (например, при использовании данного параметра будет невозможно свернуть или закрыть окно защищенной книги). Следует отметить, что все параметры являются необязательными.
Пример такого макроса приведен в листинге 2.4 (данный код должен быть помещен в модуль рабочего листа).
Листинг 2.4. Защита рабочей книги
Sub Worksheet_BeforeRightClick(ByVal Target As Range, _
Cancel As Boolean)
If Target.Address = «$D$2» Then
' Установка защиты рабочей книги (с паролем «123», _
включенной защитой структуры книги и защитой расположения _ окон)
ThisWorkbook.Protect «123», True, True
' Указание не обрабатывать нажатие кнопки мыши _ в этой
ячейке
Cancel = True
ElseIf Target.Address = «$E$5» Then
' Снятие защиты с книги (необходимо указать ранее установленный _ пароль)
ThisWorkbook.Unprotect «123»
Cancel = True
End If
End Sub
В данном примере включение защиты будет выполняться щелчком правой кнопки мыши на ячейке D2, а снятие защиты – щелчком правой кнопки на ячейке Е5.
При необходимости можно запретить вывод текущей рабочей книги на печать (при этом все остальные действия с рабочей книгой остаются доступными). Для этого достаточно записать небольшой макрос, код которого выглядит следующим образом (листинг 2.5; данный код следует поместить в модуль ЭтаКнига).
Листинг 2.5. Запрет печати книги
Sub Workbook_BeforePrint(Cancel As Boolean)
' Установка флага в True заставляет Exсel игнорировать команду _
отправки книги на печать
Cancel = True
End Sub
После выполнения данного макроса перестанут выполняться команды пункта Печать, расположенного в главном меню программы, которое вызывается нажатием Кнопки «Office».
Закрытие рабочей книги только при выполнении условияС помощью несложного трюка можно запретить закрытие текущей рабочей книги. Для этого можно воспользоваться кодом, приведенным в листинге 2.6 (этот код должен быть помещен в модуль ЭтаКнига).
Листинг 2.6. Условное закрытие книги
Sub Workbook_BeforeClose(Cancel As Boolean)
If Range(«A1»).Value <> «Можно закрывать» Then
' Условие закрытия не выполнено. Укажем Exсel игнорировать _
команду
Cancel = True
End If
End Sub
При использовании данного кода закрытие текущей рабочей книги будет возможно лишь после того, как в ячейку А1 будет введен текст Можно закрывать.
Быстрое удаление из рабочей книги ненужных именВ процессе использования программы в рабочих книгах может накапливаться большое количество имен ячеек, диапазонов и т. п., часть из которых с течением времени становится ненужной. Вручную избавляться от ненужных имен слишком долго и нерационально, поэтому данный процесс целесообразно автоматизировать. Для решения этой задачи можно использовать следующий макрос (листинг 2.7).
Листинг 2.7. Удаление ненужных имен
Sub EraseNames()
Dim nmName As Name
Dim strMessage As String
' Проверка наличия в книге определенных имен
If ThisWorkbook.Names.Count = 0 Then
' В книге нет определенных имен
MsgBox «Имена не определены»
Exit Sub
End If
' Просмотр всей коллекции определенных имен и удаление тех, _
которые пользователю не нужны
For Each nmName In ThisWorkbook.Names
With nmName
' Спрашиваем пользователя о необходимости удалить _
найденное имя
strMessage = "Удалить имя " & .Name & " ? " & vbCr & _
"относящееся к " & .RefersTo
If MsgBox(strMessage, vbYesNo + vbQuestion) = vbYes Then
' Имя можно удалить
.Delete
End If
End With
Next
End Sub
После выполнения макроса на экране появится окно, в котором отобразится первое из имен с предложением его удалить. При утвердительном ответе на данный запрос имя будет сразу же удалено, а в окне отобразится следующее имя и аналогичный запрос (переход к следующему имени осуществляется независимо от ответа на запрос относительно предыдущего имени) и т. д. Подобным образом можно быстро просмотреть все хранящиеся в рабочей книге имена и удалить ненужные.
При выполнении данной операции следует соблюдать осторожность, поскольку при утвердительном ответе на запрос об удалении имени это имя удаляется из рабочей книги окончательно, без возможности восстановления.
Сортировка листов в текущей рабочей книгеПри работе с файлами, содержащими большое количество рабочих листов, иногда возникает необходимость систематизировать их расположение путем сортировки в порядке возрастания (по номерам или по алфавиту). Решить эту задачу поможет макрос, код которого приведен в листинге 2.8.
Листинг 2.8. Сортировка листов
Sub SortSheets()
Dim astrSheetNames() As String ' Массив для хранения имен
листов
Dim intSheetCount As Integer
Dim i As Integer
Dim objActiveSheet As Object
' Если нет активной рабочей книги – закрыть процедуру
If ActiveWorkbook Is Nothing Then Exit Sub
' Проверка защищенности структуры рабочей книги
If ActiveWorkbook.ProtectStructure Then
' Сортировка листов защищенной рабочей книги невозможна
MsgBox "Структура книги " & ActiveWorkbook.Name & _
« защищена. Сортировка листов невозможна.», _
vbCritical
Exit Sub
End If
' Сохраняем ссылку на активный лист книги
Set objActiveSheet = ActiveSheet
' Отключение сочетания клавиш Ctrl+Pause Break
Application.EnableCancelKey = xlDisabled
' Отключение обновления экрана
Application.ScreenUpdating = False
intSheetCount = ActiveWorkbook.Sheets.Count
' Заполнение массива astrSheetNames именами листов книги
ReDim astrSheetNames(1 To intSheetCount)
For i = 1 To intSheetCount
astrSheetNames(i) = ActiveWorkbook.Sheets(i).Name
Next i
' Сортировка массива имен в порядке возрастания
Call Sort(astrSheetNames)
' Перемещение листов книги
For i = 1 To intSheetCount
ActiveWorkbook.Sheets(astrSheetNames(i)).Move _
ActiveWorkbook.Sheets(i)
Next i
' Переход на исходный рабочий лист
objActiveSheet.Activate
' Включение обновления экрана
Application.ScreenUpdating = True
' Включение сочетания клавиш Ctrl+Pause Break
Application.EnableCancelKey = xlInterrupt
End Sub
Sub Sort(astrNames() As String)
' Сортировка массива строк по алфавиту (в порядке возрастания)
Dim i As Integer, j As Integer
Dim strBuffer As String
Dim fBuffer As Boolean
For i = LBound(astrNames) To UBound(astrNames) – 1
For j = i + 1 To UBound(astrNames)
If astrNames(i) > astrNames(j) Then
' Меняем i-й и j-й элементы массива местами
strBuffer = astrNames(i)
astrNames(i) = astrNames(j)
astrNames(j) = strBuffer
End If
Next j
Next i
End Sub
В данной программе присутствуют некоторые особенности, которые необходимо отметить. Первая особенность – отключение обновления экрана на время перемещения страниц книги. Это сделано, чтобы исключить мерцание изображения во время перемещения листов. Вторая особенность – блокировка сочетания клавиш CtrL+Pause Break. Дело в том, что если остановить выполнение программы после того, как она отключила обновление изображения, то изображение в рабочей области книги не будет обновляться, то есть продолжать работать с книгой будет весьма проблематично.
Для сортировки листов формируется массив строк, элементами которого являются имена листов книги. Для сортировки массива с именами листов книги (процедура Sort) используется простая сортировка выбором. После того как массив отсортирован, листы книги расставляются в нужном порядке (последний цикл программы).
После запуска данного макроса (для удобства можно назначить ему кнопку) рабочие листы текущей книги будут отсортированы либо по номерам, либо по алфавиту. Следует учитывать, что при включенной защите рабочей книги (Рецензирование → Изменения → Защитить книгу) выполнение данной операции невозможно.
Ниже приведен код макроса (листинг 2.9), при выполнении которого список отсортированных листов выводится на отдельный рабочий лист Сортировка.
Листинг 2.9. Список отсортированных листов
Sub SortSheets2()
Dim astrSheetNames() As String ' Массив для хранения имен
листов
Dim intSheetCount As Integer
Dim i As Integer
Dim objActiveSheet As Object
' Если нет активной рабочей книги – закрыть процедуру
If ActiveWorkbook Is Nothing Then Exit Sub
' Проверка защищенности структуры рабочей книги
If ActiveWorkbook.ProtectStructure Then
' Сортировка листов защищенной рабочей книги невозможна
MsgBox "Структура книги " & ActiveWorkbook.Name & _
« защищена. Сортировка листов невозможна.», _
vbCritical
Exit Sub
End If
' Сохраняем ссылку на активный лист книги
Set objActiveSheet = ActiveSheet
' Отключение сочетания клавиш Ctrl+Pause Break
Application.EnableCancelKey = xlDisabled
' Функция обновления экрана отключается
Application.ScreenUpdating = False
With ActiveWorkbook
' Cоздаем новый лист «Сортировка» (если он еще не создан)
On Error Resume Next
If .Sheets(«Сортировка») Is Nothing Then
.Sheets.Add.Name = «Сортировка»
End If
On Error GoTo 0
' Размещение данных на листе «Сортировка» (в столбец A)
intSheetCount = .Sheets.Count
For i = 1 To intSheetCount
.Sheets(«Сортировка»).Cells(i, 1) = .Sheets(i).Name
Next i
' Сортировка данных в ячейках листа «Сортировка» по содержимому _
столбца A
.Sheets(«Сортировка»).Range(«A1»).Sort _
Key1:=.Sheets(«Сортировка»).Range(«A1»), _
Order1:=xlAscending
' Заполнение массива имен отсортированными строками
ReDim astrSheetNames(1 To intSheetCount)
For i = 1 To intSheetCount
astrSheetNames(i) = .Sheets(«Сортировка»).Cells(i, 1)
Next i
' Перемещение листов
For i = 1 To intSheetCount
.Sheets(astrSheetNames(i)).Move .Sheets(i)
Next i
End With
' Переход на исходный рабочий лист
objActiveSheet.Activate
' Включаем обновление экрана
Application.ScreenUpdating = True
' Включение сочетания клавиш Ctrl+Pause Break
Application.EnableCancelKey = xlInterrupt
End Sub
Отличительной особенностью приведенной программы, помимо отображения списка листов книги на отдельном листе, является использование возможностей Excel для сортировки данных.
В данном случае также необходимо помнить, что при включенной защите рабочей книги операция невыполнима.
Рабочий лист
Рабочий лист является основным составным элементом рабочей книги. По умолчанию в состав новой книги включены три листа. Чтобы изменить количество листов в новой книге по умолчанию, необходимо войти в режим настройки Excel (для этого справа на панели быстрого доступа необходимо нажать кнопку с треугольником и в раскрывающемся списке выбрать пункт Другие команды), в разделе Основные, в поле Число листов, указать требуемое значение. Следует отметить, что максимально возможное количество листов в книге – 255.
Листы-синонимыВ программе Microsoft Excel запрещено создание разных рабочих листов с одинаковыми именами. Однако с помощью небольшой хитрости можно обойти этот запрет. Для этого нужно использовать разный регистр символов и выбирать те символы, которые в русском и английском языках одинаковые (например, буквы С, А, Р и т. д.). В частности, можно создать два листа с именем Таблица, но в имени одного из них будет использована английская буква А.
Автоматическая вставка URL-адресаНаиболее распространенный способ вставки в документ URL-адреса – это копирование его в буфер обмена и последующая вставка в требуемое место. Чтобы произвести данную операцию, можно воспользоваться и другим способом. Для этого необходимо выполнить следующие действия.
1. Открыть требуемую страницу в Internet Explorer.
2. Перейти в Excel, выделить ячейку, в которую необходимо вставить адрес, и нажать сочетание клавиш Ctrl+K. В результате откроется окно Вставка гиперссылки.
3. Нажать Alt+Tab для перехода в Internet Explorer.
4. Нажать Alt+Tab для возврата обратно в Excel.
5. В окне Вставка гиперссылки нажать кнопку ОК.
В результате выполнения указанных действий адрес веб-страницы отобразится в выделенной ячейке рабочего листа.
Правообладателям!
Это произведение, предположительно, находится в статусе 'public domain'. Если это не так и размещение материала нарушает чьи-либо права, то сообщите нам об этом.