Опубликован: 25.03.2009 | Уровень: для всех | Доступ: свободно
Лекция 13:

Объектная модель MS Excel, объект Application

< Лекция 12 || Лекция 13: 12 || Лекция 14 >

13.4. Свойства Application

13.4.1. ActiveCell, ActiveChart, ActivePrinter, ActiveSheet, ActiveWindow, ActiveWorkbook - активные объекты

13-05-Excel Active.xlsm - пример к п. 13.4.1.

Cвойства, имена которых начинаются с Active, позволяют обращаться к различным активным объектам.

ActiveCell возвращает объект типа Range, который представляет собой активную (выделенную) ячейку рабочего листа, отображаемого в данный момент на экране. Если при вызове этого свойства на экране нет открытого листа - произойдет ошибка.

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

MsgBox ("В ячейке с именем " + Application.ActiveCell.Address + " хранится значение " + &  Application.ActiveCell.Value)
ActiveCell.Value = InputBox("Введите новое значение для ячейки " + ActiveCell.Address)
Листинг 13.6. Работа с активной ячейкой

Очевидно, что свойство Value объекта ActiveCell содержит данные, которые записаны в ячейку, а свойство Address - адрес ячейки.

Остальные свойства этой группы предназначены для обращения к следующим объектам:

  • ActiveChart - к активной диаграмме.
  • ActivePrinter - к активному принтеру.
  • ActiveSheet - к активному листу. Это свойство очень часто используется на практике. Например, листинг 7.7. позволяет вывести имя активного листа.
    MsgBox Application.ActiveSheet.Name
    ActiveWindow - к активному окну.
    ActiveWorkbook - к активной рабочей книге.
    Листинг 7.7. Выводим имя активного листа

13.4.2. Cells, Columns, Rows, Sheets, Workbooks, Worksheets, Names - наборы объектов и коллекции

Эти свойства возвращают соответствующие наборы объектов и коллекции. Подробности о них мы рассмотрим ниже, здесь лишь определим их основное предназначение.

  • Cells, Columns, Rows - возвращают наборы объектов Range, содержащие, соотвественно, ячейки, столбцы, строки. При вызове этих свойств можно указывать, какие именно объекты нужно возвратить, а можно, вызвав без параметров, получить все объекты нужного вида.
  • Sheets, Worksheets - возвращают коллекции, которые содержат листы активной книги. В коллекции Sheets будут содержаться листы, которые содержат диаграммы и обычные листы, а в коллекции Worksheets - лишь обычные листы.
  • Workbooks - возвращает коллекцию открытых книг.
  • Names - возвращает коллекцию именованных диапазонов - с ними можно работать так же, как с закладками в MS Word.

13.4.3. Range - ячейка или группа ячеек

Возвращает объект Range, который ссылается на ячейку или группу ячеек. Это - один из важнейших объектов для работы с ячейками - ниже мы остановимся на нем подробнее.

13.4.4. ScreenUpdating - обновление экрана

13-06-Application ScreenUpdating.xlsm - пример к п. 13.4.4.

Позволяет включать (присвоением свойству True ) и отключать (присвоением False ) обновление экрана. Имеет смысл отключить обновление экрана перед теми частями программы, которые интенсивно пользуются данными на листе. Благодаря тому, что системные ресурсы не будут тратиться на обновление экрана, программа будет работать быстрее. Этот метод весьма актуален, так как MS Excel часто используют для проведения ресурсоемких расчетов.

Практика показывает, что если программа интенсивно использует вывод на экран в процессе работы, если она изменяет данные, которые участвуют в расчете формул, расположенных на листе, то отключение вывода может ускорить работу в 3-10 раз.

Например, ниже (листинг 13.8.) приведен код, который два раза повторяет процедуру 100-кратного вывода на экран 400 целых случайных чисел и выводит время, требующееся для выполнения этих действий с обновлением экрана и без него.

'Массив для значений времени
    Dim WorkTime(2)
    'Время начала теста
    Dim StartTime
    'Время окончания теста
    Dim StopTime
    'Включаем обновление
    Application.ScreenUpdating = True
    For i = 1 To 2
        'Во втором проходе цикла
        'выключим обновление
        If i = 2 Then _
            Application.ScreenUpdating = False
        End If
        'Запишем текущее время
        StartTime = Time
        'Перейдем на лист для теста
        Worksheets("Тест скорости").Activate
        'Выведем 100 раз целые случайные
        'числа в область 20х20
        For y = 1 To 100
            For p = 1 To 20
                For j = 1 To 20
                    ActiveSheet.Cells(p, j) = _
                        Int(Rnd * 100)
                Next j
            Next p
        Next y
        'Запишем время окончания
        StopTime = Time
        'Для корректного представления
        'в виде секунд
        WorkTime(i) = _
            (StopTime - StartTime) * 24 * 60 * 60
    Next i
    Application.ScreenUpdating = True
    MsgBox "Время выполнения программы." & Chr(13) + _
        "При включенном обновлении: " & _
        Round(WorkTime(1),2) & " сек." & Chr(13) & _
        "При выключенном обновлении: " & _
        Round(WorkTime(2),2) & " сек."
Листинг 13.8. Оценка скорости работы с обновлением экрана и без него

13.4.5. Selection - ссылка на выделенный объект

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

13.4.6. WorksheetFunction - формулы Excel в коде VBA

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

13.5. События Application

13-07-Excel Application Events.xlsm - пример к п. 13.5.

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

Рассмотрим основные шаги, которые необходимо произвести, чтобы работать с событиями приложения, перечислим события и приведем пример.

Создайте новый модуль класса. Добавьте в него объявление объекта типа Excel.Application с событиями (листинг 13.9.).

Public WithEvents obj_ExApp As Excel.Application
Листинг 13.9. Объявляем новый объект типа Excel.Application с событиями

После этого в списке объектов редактора кода модуля появится объект obj_ExApp, а в списке событий - соответствующие ему события. Выберите нужное вам событие - автоматически будет создан обработчик для него. В частности, Excel.Application поддерживает следующие события:

  • NewWorkbook - происходит при создании новой книги
  • SheetActivate - при активации любого листа
  • SheetBeforeDoubleClick - происходит при двойном щелчке по листу, то есть позволяет перехватить щелчок и выполнить собственную процедуру до того, как будет выполнено стандартное действие.
  • SheetBeforeRightClick - позволяет перехватить нажатие правой кнопки мыши по листу.
  • SheetCalculate - после пересчета листа или после изменения данных, которые отображаются на диаграмме.
  • SheetChange - при изменении содержимого ячеек на любом листе.
  • SheetFollowHyperlink - происходит при переходе по гиперссылке, которая может быть включена в лист Microsoft Excel.
  • SheetSelectionChange - при изменении выделения на листе
  • WindowActivate - при активации окна книги.
  • WindowDeactivate - при деактивации окна книги.
  • WindowResize - при изменении размера окна книги.
  • WorkbookActivate - при активации книги.
  • WorkbookBeforeClose - перед закрытием книги.
  • WorkbookBeforePrint - перед печатью книги.
  • WorkbookBeforeSave - перед сохранением книги.
  • WorkbookDeactivate - при деактивации книги.
  • WorkbookNewSheet - при добавлении нового листа в любую из открытых книг.
  • WorkbookOpen - при открытии книги.

После того, как создан обработчик, написан его код, работа еще не окончена. Следующий шаг - это связывание объекта obj_ExApp с реально работающим приложением. Ниже приведен полный код модуля с одним обработчиком события, а также - процедура, служащая для связывания объекта obj_ExApp с работающим приложением. Эта процедура может существовать в виде отдельного макроса или в виде кода обработчика нажатия на кнопку. Ее выполнение можно назначить событию открывающейся книги, которая содержит данный модуль класса и т.д.

Итак, вот (листинг 13.10.) код процедуры, который связывает объект созданного нами класса AppEvents с приложением:

Dim obj_ExcelAppEv As New AppEvents
Sub EventsInit()
    Set obj_ExcelAppEv.obj_ExApp = Excel.Application
End Sub
Листинг 13.10. Связываем объект с приложением

А вот (листинг 13.11.) полный код модуля класса AppEvents с объявлением объектной переменной и обработчиком события.

Public WithEvents obj_ExApp As Excel.Application
Private Sub obj_ExApp_NewWorkbook(ByVal Wb As Workbook)
    'Выполняется при создании новой книги
    MsgBox "Вы создали новую книгу"
End Sub
Листинг 13.11. Код модуля класса с обработчиком события

13.6. Выводы

В этой лекции мы обсудили методы, свойства и события объекта Application приложения Microsoft Excel. Можно заметить, что некоторые из этих методов прямо указывают на то, что Excel - это приложение, рассчитанное на проведение достаточно серьезных расчетов. В следующей лекции мы рассмотрим особенности работы с документами MS Excel.

< Лекция 12 || Лекция 13: 12 || Лекция 14 >
Евгений Ушаков
Евгений Ушаков
О стоимости курса
Александр Новиков
Александр Новиков
Справочник по объектам VBA
Анатолий Федоров
Анатолий Федоров
Россия, Москва, Московский государственный университет им. М. В. Ломоносова, 1989
Михаил Алексеев
Михаил Алексеев
Россия, Уфа, УГАТУ, 2002