VBA в MS Office 2007

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

Разбить на страницы
Показывать лекцию целиком

9.1. Объектная модель MS Word

Microsoft Word 2007, как, впрочем, и другие приложения Office, имеет большую объектную модель, в которую входят множество объектов и коллекций. Однако на практике чаще всего используются лишь некоторые из них.

В частности, это следующие:

  • Word (Microsoft Word) - чтобы вызывать объекты Microsoft Office Word из других приложений используется объект Word.
  • Application (Приложение) - объект, который включает в себя все остальные объекты и коллекции. Сам объект Application включается в объект Word.
  • Documents (Документы) - коллекция, которая включает в себя объекты Document (Документ). Объект Document представляет собой документ, с которым вы работаете в редакторе.
  • Bookmarks (Закладки) - c помощью объектов этой коллекции можно задавать места в документе, в которые, при автоматическом создании, можно вставлять изменяемые части.
  • Paragraphs (Абзацы), Sentences (Предложения), Words (Слова), Characters (Символы), Tables (Таблицы), OMath (Математические формулы), Эти коллекции, содержащие объекты, соответствующие их названиям, могут использоваться для обработки слов документа ( Words ), предложений ( Sentences ), отдельных символов ( Characters ) и т.д.
  • Selection (Выделенная область) - представляет собой выделенную область документа или позицию, в которую будет осуществляться вставка очередного символа. Этот объект часто используют при создании простых документов. Однако у него есть существенные недостатки, что делает предпочтительнее использование объекта Range в большинстве случаев.
  • Range (Диапазон) - входит в Document и другие объекты, представляет собой диапазон документа, ограниченный начальным и конечным символом.
  • Работая с объектной моделью MS Word следует понимать, что, например, объекты Document и Selection могут содержать одинаковые коллекции объектов, например, и там и там есть коллекция Characters, в которую входят объекты Character - то есть - символы. Однако в случае с объектом Document мы можем работать с любым символом документа, а в случае с Selection - лишь с символами в пределах выделенной области. Однако, несмотря на различия, и там и там коллекция Characters имеет одинаковые свойства и методы. То же самое касается и других коллекций и объектов.

    Давайте начнем с объекта Application и здесь же поговорим об использовании объектных переменных.

    9.2. Работа с объектными переменными

    Объектные переменные - это переменные, которые хранят ссылки на объекты. Чтобы инициализировать объектную переменную, нужно использовать ключевое слово Set. Например, так (листинг 9.1.):

    Set obj_NewWord = Word.Application

    Здесь вы можете видеть присваивание переменной ссылки на объект Word.Application. Код, подобный этому, нужен в других приложениях Microsoft Office для запуска нового экземпляра MS Word.

    Для того чтобы вы могли работать с Microsoft Word из других приложений - подключите библиотеку Microsoft Word 12.0 Object Library. Сделать это можно, открыв в редакторе окно References командой Tools o References.

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

    Как видите, в листинге 9.1 мы не объявляли переменную - мы сразу присвоили ей ссылку на объект. При последующей работе с такой необъявленной объектной переменной, мы не сможем пользоваться подсказкой по свойствам и методам. Вспомните - когда вы набираете в редакторе имя элемента управления и ставите после него точку - вы видите подсказку. Это очень удобно, так как позволяет избежать ошибок и излишних "походов" в справочную систему VBA.

    Для того чтобы справка по свойствам и методам работала, объектную переменную надо сначала объявить, а потом присвоить ей ссылку на объект. Например, так (листинг 9.2.):

    Dim obj_NewWord As Word.Application
    Set obj_NewWord = Word.Application

    Ссылку на объект можно присвоить в процессе объявления переменной. Для этого нужно воспользоваться ключевым словом New (листинг 9.3.):

    Dim obj_NewWord As New Word.Application

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

    О том, как же пользоваться объектными переменными, скорее даже не ими, а объектами, на которые они ссылаются, мы поговорим ниже.

    9.3. Объект Application - приложение

    09-01-With For Each.docm - пример к п. 9.3.

    Объект Application можно представить в виде приложения Microsoft Word.

    Такой код позволит вывести в окно сообщения информацию об имени приложения:

    MsgBox Application.Name

    Как видите, здесь мы обратились к свойству Name (Имя) объекта Application. Вот, что будет выведено при его исполнении (рис. 9.1.).

    (рис 9.1) Свойство Name объекта Application

    Здесь мы обходимся без объектных переменных, работая с уже существующим объектом. Ведь если этот код исполняется в Microsoft Word, это значит, что сам Microsoft Word уже запущен.

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

    With Application
            MsgBox .Name
            MsgBox .Build
        End With

    Здесь мы использовали объект Application - вместо него может быть любой другой объект или объектная переменная.

    Еще один оператор, которым удобно пользоваться при работе с объектами и коллекциями - это For Each…Next.

    Например, для вывода в окнах сообщений имен всех открытых документов, можно написать такой код (листинг 9.5.):

    Dim var_Doc
        For Each var_Doc In Application.Documents
           MsgBox var_Doc.Name
        Next var_Doc

    Var_Doc - это переменная типа Variant. Коллекция Application.Documents содержит все открытые документы. При каждом проходе цикла в переменную var_Doc записывается ссылка на очередной объект в коллекции.

    Чтобы выйти из цикла, можно воспользоваться оператором Exit For.

    Сейчас мы кратко опишем важнейшие методы, свойства и события объекта Application.

    9.4. Методы объекта Application

    9.4.1. BuildKeyCode, KeyString - горячие клавиши

    BuildKeyCode возвращает уникальный цифровой код для заданной комбинации клавиш. Используется при назначении "горячих клавиш" для выполнения различных операций.

    KeyString возвращает комбинацию клавиш для переданного кода.

    Ниже мы рассмотрим пример программного назначения клавиатурной комбинации для вызова макроса.

    9.4.2. ChangeFileOpenDirectorу - путь для работы с файлами

    ChangeFileOpenDirectory позволяет установить директорию, в которой Microsoft Word ищет файлы для открытия. В установленной папке программа будет искать файлы при программном открытии файлов и при вызове окна открытия файлов.

    Выбранная директория будет использоваться для открытия файлов по умолчанию лишь до тех пор, пока Word не будет перезапущен.

    Например, чтобы установить папку " C:\Новые документы " в качестве папки по умолчанию, можно использовать такой код (листинг 9.6.):

    Application.ChangeFileOpenDirectory ("C:\Новые документы")

    Следует отметить, что если мы вызываем метод или свойство объекта Application из макроса Microsoft Word, мы можем опускать вызов Application - то есть, в вышеприведенном примере можно написать так:

    ChangeFileOpenDirectory ("C:\Новые документы")

    9.4.3. CleanString - очистка строк

    CleanString очищает переданную строку от непечатаемых и специальных символов, превратив ее в обычный текст. Такой же текст можно получить, если скопировать текст из Microsoft Word в Блокнот, а потом - обратно. Например, с помощью такого кода можно получить очищенную строку из выделенной области документа (листинг 9.7.).

    str_Clean = Application.CleanString(Selection.Text)

    9.4.4. Keyboard - программное переключение раскладки

    Keyboard позволяет программно переключать раскладку клавиатуры. При переключении используется идентификатор языковых и клавиатурных установок. Чтобы включить русскую раскладку, можно воспользоваться таким кодом (листинг 9.8.):

    Application.Keyboard 1049

    Очевидно, что 1049 - это код русского языка. Для включения английской раскладки используйте этот метод с идентификатором 1033.

    9.4.5. ListCommands - справка по горячим клавишам

    ListCommands это необычный метод - если вызвать его с параметром True (листинг 9.9.) - он создаст новый документ, содержащий таблицу со списком клавиатурных сочетаний, назначенных командам MS Word. Таблица содержит несколько десятков страниц.

    Application.ListCommands True

    9.4.6. NewWindow - копия окна активного документа

    09-02-New Window.docm - пример к п. 9.4.6.

    NewWindow создает копию окна активного документа. Это может быть полезным например, для того, чтобы вывести один и тот же документ на два монитора при работе с расширенным рабочим столом и т.д. Например, метод можно вызвать так:

    Application.NewWindow

    При необходимости можно задать, для какого именно документа вы хотите создать копию окна. Однако, это потребует использования других объектов. Например - коллекции Windows, содержащей окна документов. Такой код (листинг 9.11.) создаст одну копию для каждого открытого окна:

    For i = Application.Windows.Count To 1 Step -1
        Application.Windows.Item(i).NewWindow
    Next i

    Мы не случайно запустили цикл обхода открытых окон в обратном порядке. Дело в том, что иначе будет создано несколько копий одного и того же документа.

    В этом примере вам встретились неизвестные ранее свойства Count и Item. Первое обычно содержит количество элементов в коллекции, второе позволяет обращаться к элементам по индексам или именам.

    При создании копии после имени документа появляется двоеточие с номером окна, например, ":1" для первого, ":2" для второго и т.д.

    9.4.7. OnTime - запуск макросов по расписанию

    09-03-OnTime.docm - пример к п. 9.4.7.

    OnTime позволяет устанавливать таймер, по которому можно запустить макрос в определенное время. Например, чтобы выполнить макрос MyMacros, который хранится в том же документе, что и исполняемый макрос, достаточно выполнить такой код (листинг 9.12.).

    Application.OnTime When:="08:37:00", Name:="MyMacros"

    Параметр When указывает на время запуска, параметр Name - на имя макроса. Важно, чтобы макрос был доступен как в момент запуска таймера, так и в момент запуска самого макроса. Для того чтобы это условие соблюдалось, желательно хранить макросы, запускаемые по таймеру, в Normal.dotm, в другом глобальном шаблоне, или в том же документе, в котором произошел запуск таймера.

    Как видите, мы привели пример лишь для запуска макроса в строго определенное время. А как же быть, если нужно запустить макрос, например, через пятнадцать секунд после выполнения какой-либо процедуры? Ответ прост (листинг 9.13.)

    Application.OnTime _ 
    When:=Now + TimeValue("00:00:15"), _ 
    Name:="MyMacros"

    Здесь мы запускаем тот же самый макрос, но уже через 15 секунд после установки таймера. Функция Now имеет тип Date и возвращает текущую дату и время, а функция TimeValue преобразует переданное ей время в формат Date.

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

    9.4.8. PrintOut - распечатка документов

    PrintOut предназначен для вывода документов на печать. Например, следующий код (листинг 9.14.) выводит на печать все документы Microsoft Word 2007 (то есть - с расширениями docx и docm ), расположенные в корневом каталоге диска C.

    var_Doc = Dir("C:\*.doc?")
    Do While var_Doc <> ""
        Application.PrintOut FileName:=var_Doc
        var_Doc = Dir()
    Loop

    Метод PrintOut существует для различных объектов и может принимать множество параметров, управляющих всеми тонкостями печати. Например, с помощью такого кода (листинг 9.15.) мы можем распечатать первые пять страниц текущего документа:

    ActiveDocument.ActiveWindow.PrintOut _
    Range:=wdPrintFromTo, From:="1", To:="5"

    9.4.9. Quit - выход из приложения

    Quit используется для выхода из приложения (листинг 9.16.):

    Application.Quit

    9.4.10. Run - запуск макросов

    Run позволяет запускать макросы и, при необходимости, передавать им параметры (до 30). При вызове методу Run передается имя, состоящее из имени проекта, имени модуля, и, собственно, имени макроса. Например, запуск макроса MyMacros, расположенного в модуле NewModule проекта Project1 выглядит так (листинг 9.17.):

    Application.Run ("Project1.NewModule.MyMacros")

    Параметры, передаваемые макросу, перечисляются после его имени через запятую.

    9.4.11. ScreenRefresh - принудительное обновление экрана

    ScreenRefresh позволяет принудительно обновить экран. Используется обычно в комбинации с запретом автоматического обновления экрана (свойство Application.ScreenUpdating, его мы рассмотрим ниже). Как правило, обновление экрана делают через некоторые промежутки времени - тогда у пользователя не возникает ощущения, что программа зависла.

    Теперь рассмотрим наиболее полезные свойства объекта Application.

    9.5. Свойства объекта Application

    9.5.1. ActiveDocument и другие - активный документ

    ActiveDocument возвращает объект активного документа - того, который открыт в данный момент в Microsoft Word для редактирования. У объекта ActiveDocument есть множество полезных свойств и методов. Мы обсудим их при разговоре об объекте Document.

    Например, в листинге 9.18 мы выводим в окне сообщения имя активного документа.

    MsgBox Application.ActiveDocument.Name

    Надо отметить, что нельзя модифицировать свойство ActiveDocument - то есть не можем с его помощью сделать неактивный документ активным. Чтобы сделать документ активным, используют специальный метод объекта Document.

    Существует немало других свойств Application, имена которых начинаются с Active.

    ActivePrinter возвращает объект активного принтера - устройства, используемого для печати документов по умолчанию.

    ActiveWindow возвращает активное окно - объект типа Window.

    9.5.2. CapsLock - текущее состояние Caps Lock

    CapsLock показывает текущее состояние режима Caps Lock. Если этот режим активен, по умолчанию при вводе с клавиатуры вводятся прописные буквы. Если режим Caps Lock включен - свойство возвращает True, если выключен - False.

    9.5.3. Caption - заголовок окна MS Word

    Caption позволяет узнать, и, при желании, изменить заголовок окна Microsoft Word.

    Например код в листинге 9.19. меняет словосочетание Microsoft Word в заголовке окна на слова "Моя программа".

    Application.Caption = "Моя программа"

    9.5.4. CustomizationContext - область сохранения настроек

    CustomizationContext позволяет узнавать и задавать документ и шаблон, в котором сохраняются такие настройки, как изменения в настройке меню, панелей инструментов, горячих клавиш. Чтобы узнать текущую область настройки, достаточно выполнить код из листинга 9.20.

    MsgBox Application.CustomizationContext

    Чтобы установить в качестве области настройки шаблон Normal.dotm (то есть - сделать настройки доступными для всех документов), достаточно воспользоваться кодом листинга 9.21.:

    CustomizationContext = NormalTemplate

    Обратите внимание на то, что в предыдущих версиях MS Word этот шаблон назывался Normal.dot.

    Для сохранения изменений в шаблоне, присоединенном к активному документу, можно воспользоваться командой из листинга 9.22.:

    CustomizationContext = ActiveDocument.AttachedTemplate

    Для сохранения изменений лишь в текущем документе, можно использовать команду из листинга 9.23.

    CustomizationContext = ThisDocument

    9.5.5. Dialogs - диалоговые окна MS Word

    09-04-Dialogs.docm - пример к п. 9.5.5.

    Dialogs возвращает коллекцию Dialogs (Диалоговые окна), которая дает доступ ко всем диалоговым окнам Microsoft Word. Если выполнить код листинга 9.24., можно узнать количество объектов в коллекции Dialogs.

    MsgBox ("Количество окон в коллекции Dialogs:" + _
        Str(Application.Dialogs.Count))

    Чтобы отобразить диалоговое окно поиска строк в документе, можно использовать код, представленный в листинге 9.25.

    Dim obj_FindS As Dialog
        Set obj_FindS = Dialogs(wdDialogEditFind)
        With obj_FindS
            .Find = "Строка"
            .Show
        End With

    Здесь мы объявляем объектную переменную типа Dialog, создаем ссылку на окно поиска строк в документе - это окно представлено константой wdDialogEditFind, после чего присваиваем свойству Find окна поиска значение "Строка" - именно это значение будет отображаться в строке поиска, и показываем окно поиска, используя метод Show. Похожим образом работают и с другими диалоговыми окнами. Их имена (около 230) можно найти в перечислении WdWordDialog.

    9.5.6. DisplayAlerts - управление выводом сообщений

    DisplayAlerts - позволяет управлять выводом диалоговых окон, сообщений об ошибках и т.д. при работе в Microsoft Word. Чтобы запретить вывод всех сообщений, используйте код, приведенный в листинге 9.26.

    Application.DisplayAlerts = wdAlertsNone

    Константа wdAlertsNone запрещает вывод сообщений. Аналогично, константа wdAlertsAll разрешает вывод всех сообщений, а wdAlertsMessageBox разрешает лишь вывод окон сообщений, сообщения об ошибках не выводятся.

    9.5.7. EnableCancelKey - запрещаем остановку программы

    09-05-Cancel.docm - пример к п. 9.5.7

    EnableCancelKey - позволяет разрешать и запрещать пользователю остановку программы по нажатию сочетания клавиш Ctrl + Break. Это может быть полезно при выполнении участков кода, которые нельзя прерывать.

    Для того чтобы запретить прерывание работы программы нужно присвоить этому свойству значение wdCancelDisabled, для разрешения - wdCancelInterrupt.

    Пример использования этого оператора вы можете найти в листинге 9.27.

    Dim num_b As Double
        MsgBox ("Вы не сможете прервать выполнение " + _
            "следующего кода")
        Application.EnableCancelKey = wdCancelDisabled
        For i = 1 To 1000000
            For j = 100 To 1 Step -1
                num_b = num_b * i / j
            Next j
        Next i
        Application.EnableCancelKey = wdCancelInterrupt
        MsgBox ("А теперь Ctrl + Pause Break " + _
            "снова работает")

    9.5.8. IsObjectValid - проверка объектных переменных

    IsObjectValid - позволяет проверить объектную переменную. Если объект, на которую она ссылается, существует - проверка возвратит True, если нет - False. Это свойство полезно использовать для проверки объектов, которые могут быть удалены пользователем. Если объект существует, можно произвести с ним какие-либо действия. Если нет - сообщить причину, по которой действия невозможны.

    9.5.9. KeyBindings - назначаем клавиатурные сокращения

    KeyBindings - возвращает коллекцию KeyBindings, которая содержит информацию о клавиатурных привязках. Это очень полезная коллекция - с ее помощью можно, например, назначить клавиатурную комбинацию для запуска какого-нибудь макроса. листинг 9.28. позволяет назначить комбинацию клавиш Alt + Shift + T макросу TextEdit, хранящемуся в модуле MyMacros шаблона Normal.Dotm

    Application.CustomizationContext = NormalTemplate
    Application.KeyBindings.Add _
    wdKeyCategoryMacro, _
    "Normal.MyMacros.TextEdit", _
    BuildKeyCode(wdKeyAlt, wdKeyShift, wdKeyT)

    Сначала с помощью свойства CustomizationContext мы устанавливаем место, где будет сохранена привязка. Это - шаблон Normal.Dotm. Далее мы используем метод Add коллекции KeyBindings. Мы передаем этому методу три параметра. Первый ( wdKeyCategoryMacro ) указывает методу на то, что мы назначаем клавиатурную комбинацию макросу. Второй -" Normal.MyMacros.TextEdit " - указывает путь к макросу, запуск которого мы назначаем клавиатурному сокращению. Третий параметр содержит вызов метода BuildKeyCode - напомню, что он генерирует код сочетания клавиш на основе переданных ему параметров. В нашем случае он сгенерирует код для сочетания клавиш Alt + Shift + T - мы передали методу параметры wdKeyAlt, wdKeyShift и wdKeyT.

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

    9.5.10. NumLock - состояние цифровой клавиатуры

    NumLock возвращает состояние клавиши NumLock - True если цифровая клавиатура находится в режиме ввода цифр, иначе - False.

    9.5.11. RecentFiles - недавно открытые файлы

    RecentFiles - позволяет работать с файлами, которые вы недавно открывали. Список этих файлов можно увидеть в диалоговом окне открытия файлов. Последний файл, с которым вы работали, хранится в списке первым. Чтобы открыть его, можно воспользоваться кодом из листинга 9.29.

    RecentFiles(1).Open

    9.5.12. ScreenUpdating - запрет обновления экрана

    09-06-ScreenUpdating.docm - пример к п. 9.5.12.

    Свойство ScreenUpdating используют для отключения обновления экрана во время вывода в документ большого количества информации или других действий с документом. Это позволяет ускорить работу, так как системные ресурсы не тратятся на постоянное обновление экрана. В листинге 9.30. мы запрещаем обновление экрана, выводим в документ 10000 строк, принудительно обновляя экран после каждой 1000 строк, после чего разрешаем автоматическое обновление.

    Application.ScreenUpdating = False
        For i = 1 To 10
            For j = 1 To 1000
                Selection.TypeText ("Строка №" + Str(i * j))
                Selection.TypeParagraph
            Next j
            Application.ScreenRefresh
        Next i
        Application.ScreenUpdating = True

    Очевидно, что присвоив False свойству ScreenUpdating мы запрещаем обновление экрана, а присвоив True - разрешаем.

    9.5.13. StatusBar - вывод информации в строку состояния

    09-07-Status Bar.docm - пример к п. 6.3.2.13

    Модифицировав свойство StatusBar вы можете записать любой текст в строку состояния Microsoft Word. Туда можно выводить сообщения о ходе выполнения какой-нибудь длительной операции и т.д. В листинге 9.31. приведен пример использования этого свойства.

    Application.StatusBar = "Пожалуйста, подождите..."

    9.5.14. System - системная информация

    09-08-System.docm - пример к п. 9.5.12.

    Это свойство возвращает объект System, который дает доступ к различной системной информации (о разрешении экрана, типе процессора, объеме свободного места на жестких дисках и т.д.)

    Например, свойство FreeDiskSpace объекта System позволяет узнать размер свободного пространства на текущем жестком диске (листинг 9.32.)

    Dim var_DiskSize As Variant
    var_DiskSize = Application.System.FreeDiskSpace
    var_DiskSize = Int(var_DiskSize / (1024 ^ 2))
    If var_DiskSize >= 2047 Then _
    MsgBox ("На текущем HDD более 2 Гб свободного места") _
    Else MsgBox ("Размер свободного места на текущем диске " + _
    "равен " + Str(var_DiskSize) + " Мб")

    В этом примере мы учитываем тот факт, что при определении свободного места свойство FreeDiskSpace, во-первых, возвращает значение в байтах, а во-вторых - максимальное значение, возвращаемое функцией, не превышает 2,147,483,647 байт, то есть 2048 Мб или 2 Гб. Для получения значения в мегабайтах мы делим полученное значение на 1024 во второй степени.

    9.5.15. Tasks - работа с запущенными приложениями

    09-09-Tasks.docm - пример к п. 9.5.15.

    Это свойство возвращает коллекцию Tasks, которая дает доступ ко всем приложениям, запущенным в системе. Давайте рассмотрим пример работы с приложением Notepad.exe (Блокнот), которое представлено в системе процессом Блокнот. Напишем программу (листинг 9.33.), которая проверяет, запущен ли Блокнот, если запущен - выводит сообщение "Блокнот уже запущен", активирует его окно. Если Блокнот не запущен - запускает его, сообщив об этом.

    If Application.Tasks.Exists("Блокнот") = True Then
        MsgBox ("Блокнот уже запущен")
        With Tasks("Блокнот")
            .Activate
            .WindowState = wdWindowStateMaximize
        End With
    Else
        MsgBox "Запускаем Блокнот..."
        Shell ("Notepad.exe")
            With Tasks("Блокнот")
            .Activate
            .WindowState = wdWindowStateMaximize
        End With
    End If

    9.5.16. Visible - скрытие окна MS Word

    Visible позволяет скрыть окно Microsoft Word. Если присвоить ему значение False - окно приложения будет скрыто, причем даже с панели задач Windows. Если значение True - окно снова отобразится.

    9.5.17. Windows - работа с окнами

    09-10-Windows.docm - пример к п. 9.5.17.

    Это свойство возвращает коллекцию Windows, которая содержит окна всех открытых документов. Она позволяет управлять окнами. Например, код листинга 9.34. располагает окна на экране без перекрытия:

    Application.Windows.Arrange (wdTiled)

    Посмотрите на листинг 9.35. Он иллюстрирует применение коллекции Windows:

    For i = 1 To Application.Windows.Count
       With Application.Windows.Item(i)
        .Activate
        .WindowState = wdWindowStateNormal
        .Width = 400
        .Height = 400
        .Left = i * 10 - 10
        .Top = i * 10 - 10
       End With
    Next i

    Здесь мы перебираем по очереди все окна (свойство Count коллекции Windows ), активируем каждое из них ( Activate ), после чего устанавливаем параметр WindowsState (Состояние окна) в значение wdWindowsStateNormal (иначе, если окно развернуто на весь экран, мы не сможем изменить его размеры и получим сообщение об ошибке). Далее, устанавливаем ширину и высоту окна по 400 пикселей и размещаем окна каскадом от левого верхнего угла экрана (координата 0,0), располагая каждое следующее окно правее и ниже предыдущего на 10 пикселей.

    9.6. События объекта Application

    09-11-События.docm - пример к п. 9.6.

    Как и любые другие объекты, Application может реагировать на различные события. Чтобы события объекта отображались в редакторе, нужно воспользоваться особой методикой. Во-первых - вставьте в ваш VBA-проект модуль класса командой Insert - Class Module (Вставить - Модуль класса) или любым другим удобным для вас способом. Теперь разместить в модуле такое объявление (листинг 9.36.).

    Public WithEvents obj_Application As Word.Application

    После этого в списке объектов модуля появится новый объект obj_Application, который будет представлять собой приложение Microsoft Word. В списке событий доступны для выбора различные события, соответствующие этому объекту. Например, следующие:

  • DocumentBeforeClose (Перед закрытием документа) - событие генерируется непосредственно перед закрытием одного из открытых документов. В этот обработчик можно вставить, например, команды проверки документа, команды сохранения копий документа и т.д.
  • DocumentBeforePrint (Перед печатью документа)
  • DocumentBeforeSave (Перед сохранением документа)
  • DocumentChange (Изменение документа) - это событие гененируется при создании нового документа, открытии существующего или тогда, когда любой документ становится активным.
  • DocumentOpen (Открытие документа)
  • NewDocument (Создание нового документа)
  • Quit (Выход из Microsoft Word)
  • WindowActivate (Активация окна документа)
  • WindowBeforeDoubleClick (Перед двойным щелчком) - происходит после двойного щелчка в области редактирования документа до выполнения стандартной процедуры обработчика двойного щелчка.
  • WindowBeforeRightClick (Перед щелчком правой кнопкой мыши)
  • WindowDeactivate (Деактивация окна)
  • WindowSelectionChange (Изменение выделенной области)
  • WindowSize (Размер окна) - происходит при изменении размеров или перетаскивании окна.
  • Если вы создадите модуль класса, объявите в нем объект приложения, создадите обработчики, они не будут работать без специальной подготовки. Дело в том, что прежде чем обработчики для Word.Application заработают, нужно связать переменную, представляющую приложение, с приложением. Это можно сделать из какого-нибудь другого модуля. Например, чуть ниже мы познакомимся с автоматически выполняемыми макросами - их можно использовать для подобных целей.

    Создадим новый документ Microsoft Word, в редакторе VBA добавим к нему новый модуль класса, назовем его AppEventsModule. Разместим в нем сначала объявление объектной переменной так, как указано выше, а потом создадим пару обработчиков, например, для событий NewDocument и WindowSelectionChange, в которые добавим код вызова окна сообщения с соответствующими сообщениями, указывающими на выполнение данного обработчика. Ниже, на рис. 9.2. вы можете видеть окно проекта после создания модуля и добавления в него соответствующего кода.

    (рис 9.2) Окно проекта после добавления модуля класса

    Теперь перейдем из редактора в документ, переключимся в режим конструктора, создадим в документе новую кнопку, назовем ее cmd_initObject подпишем как Инициализация, и напишем для нее такой код (листинг 9.37.):

    Dim obj_Module As New AppEventsModule
    Private Sub cmd_InitObject_Click()
        Set obj_Module.obj_Application = Word.Application
    End Sub

    Мы не случайно привели здесь полный код обработчика - дело в том, что переменная obj_Module должна быть объявлена не внутри обработчика, а в разделе объявлений модуля. Давайте подробнее рассмотрим этот код.

    Выше мы не работали с модулями класса, поэтому сейчас нас ждут некоторые неожиданности. Первая неожиданность возникает при объявлении переменной obj_Module. Как вы помните, при создании модуля класса мы задали его имя - AppEventsModule. Это имя может быть произвольным, главное - оно должно соответствовать общим правилам именования объектов и переменных VBA. В модуле мы объявили переменную obj_Application, которая должна представлять приложение. Итак, объявляя переменную obj_Module мы задаем для нее тип данных AppEventsModule - то есть создаем на основе класса AppEventsModule новый объект. В обработчике события нажатия кнопки cmd_InitObject мы связываем переменную объекта obj_Application (если следовать объектно-ориентированной терминологии, правильнее будет назвать ее свойством) с приложением Microsoft Word.

    После того, как код обработчика для кнопки создан, выйдите из редактора VBA в документ, выключите режим конструктора, нажмите на кнопку и попытайтесь выполнить одно из действий, для которых в модуле AppEventsModule созданы обработчики. Если все сделано верно - вы увидите соответствующие этим обработчикам окна сообщений.

    9.7. Выводы

    В этой лекции мы обсудили методы, свойства и события объекта Application приложения Microsoft Word. На очереди - другие объекты. В частности, в следующей лекции мы поговорим о работе с документами.

    Страницы:

    9.1. Объектная модель MS Word

    Microsoft Word 2007, как, впрочем, и другие приложения Office, имеет большую объектную модель, в которую входят множество объектов и коллекций. Однако на практике чаще всего используются лишь некоторые из них.

    В частности, это следующие:

  • Word (Microsoft Word) - чтобы вызывать объекты Microsoft Office Word из других приложений используется объект Word.
  • Application (Приложение) - объект, который включает в себя все остальные объекты и коллекции. Сам объект Application включается в объект Word.
  • Documents (Документы) - коллекция, которая включает в себя объекты Document (Документ). Объект Document представляет собой документ, с которым вы работаете в редакторе.
  • Bookmarks (Закладки) - c помощью объектов этой коллекции можно задавать места в документе, в которые, при автоматическом создании, можно вставлять изменяемые части.
  • Paragraphs (Абзацы), Sentences (Предложения), Words (Слова), Characters (Символы), Tables (Таблицы), OMath (Математические формулы), Эти коллекции, содержащие объекты, соответствующие их названиям, могут использоваться для обработки слов документа ( Words ), предложений ( Sentences ), отдельных символов ( Characters ) и т.д.
  • Selection (Выделенная область) - представляет собой выделенную область документа или позицию, в которую будет осуществляться вставка очередного символа. Этот объект часто используют при создании простых документов. Однако у него есть существенные недостатки, что делает предпочтительнее использование объекта Range в большинстве случаев.
  • Range (Диапазон) - входит в Document и другие объекты, представляет собой диапазон документа, ограниченный начальным и конечным символом.
  • Работая с объектной моделью MS Word следует понимать, что, например, объекты Document и Selection могут содержать одинаковые коллекции объектов, например, и там и там есть коллекция Characters, в которую входят объекты Character - то есть - символы. Однако в случае с объектом Document мы можем работать с любым символом документа, а в случае с Selection - лишь с символами в пределах выделенной области. Однако, несмотря на различия, и там и там коллекция Characters имеет одинаковые свойства и методы. То же самое касается и других коллекций и объектов.

    Давайте начнем с объекта Application и здесь же поговорим об использовании объектных переменных.

    9.2. Работа с объектными переменными

    Объектные переменные - это переменные, которые хранят ссылки на объекты. Чтобы инициализировать объектную переменную, нужно использовать ключевое слово Set. Например, так (листинг 9.1.):

    Set obj_NewWord = Word.Application

    Здесь вы можете видеть присваивание переменной ссылки на объект Word.Application. Код, подобный этому, нужен в других приложениях Microsoft Office для запуска нового экземпляра MS Word.

    Для того чтобы вы могли работать с Microsoft Word из других приложений - подключите библиотеку Microsoft Word 12.0 Object Library. Сделать это можно, открыв в редакторе окно References командой Tools o References.

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

    Как видите, в листинге 9.1 мы не объявляли переменную - мы сразу присвоили ей ссылку на объект. При последующей работе с такой необъявленной объектной переменной, мы не сможем пользоваться подсказкой по свойствам и методам. Вспомните - когда вы набираете в редакторе имя элемента управления и ставите после него точку - вы видите подсказку. Это очень удобно, так как позволяет избежать ошибок и излишних "походов" в справочную систему VBA.

    Для того чтобы справка по свойствам и методам работала, объектную переменную надо сначала объявить, а потом присвоить ей ссылку на объект. Например, так (листинг 9.2.):

    Dim obj_NewWord As Word.Application
    Set obj_NewWord = Word.Application

    Ссылку на объект можно присвоить в процессе объявления переменной. Для этого нужно воспользоваться ключевым словом New (листинг 9.3.):

    Dim obj_NewWord As New Word.Application

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

    О том, как же пользоваться объектными переменными, скорее даже не ими, а объектами, на которые они ссылаются, мы поговорим ниже.

    9.3. Объект Application - приложение

    09-01-With For Each.docm - пример к п. 9.3.

    Объект Application можно представить в виде приложения Microsoft Word.

    Такой код позволит вывести в окно сообщения информацию об имени приложения:

    MsgBox Application.Name

    Как видите, здесь мы обратились к свойству Name (Имя) объекта Application. Вот, что будет выведено при его исполнении (рис. 9.1.).

    (рис 9.1) Свойство Name объекта Application

    Здесь мы обходимся без объектных переменных, работая с уже существующим объектом. Ведь если этот код исполняется в Microsoft Word, это значит, что сам Microsoft Word уже запущен.

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

    With Application
            MsgBox .Name
            MsgBox .Build
        End With

    Здесь мы использовали объект Application - вместо него может быть любой другой объект или объектная переменная.

    Еще один оператор, которым удобно пользоваться при работе с объектами и коллекциями - это For Each…Next.

    Например, для вывода в окнах сообщений имен всех открытых документов, можно написать такой код (листинг 9.5.):

    Dim var_Doc
        For Each var_Doc In Application.Documents
           MsgBox var_Doc.Name
        Next var_Doc

    Var_Doc - это переменная типа Variant. Коллекция Application.Documents содержит все открытые документы. При каждом проходе цикла в переменную var_Doc записывается ссылка на очередной объект в коллекции.

    Чтобы выйти из цикла, можно воспользоваться оператором Exit For.

    Сейчас мы кратко опишем важнейшие методы, свойства и события объекта Application.

    9.4. Методы объекта Application

    9.4.1. BuildKeyCode, KeyString - горячие клавиши

    BuildKeyCode возвращает уникальный цифровой код для заданной комбинации клавиш. Используется при назначении "горячих клавиш" для выполнения различных операций.

    KeyString возвращает комбинацию клавиш для переданного кода.

    Ниже мы рассмотрим пример программного назначения клавиатурной комбинации для вызова макроса.

    9.4.2. ChangeFileOpenDirectorу - путь для работы с файлами

    ChangeFileOpenDirectory позволяет установить директорию, в которой Microsoft Word ищет файлы для открытия. В установленной папке программа будет искать файлы при программном открытии файлов и при вызове окна открытия файлов.

    Выбранная директория будет использоваться для открытия файлов по умолчанию лишь до тех пор, пока Word не будет перезапущен.

    Например, чтобы установить папку " C:\Новые документы " в качестве папки по умолчанию, можно использовать такой код (листинг 9.6.):

    Application.ChangeFileOpenDirectory ("C:\Новые документы")

    Следует отметить, что если мы вызываем метод или свойство объекта Application из макроса Microsoft Word, мы можем опускать вызов Application - то есть, в вышеприведенном примере можно написать так:

    ChangeFileOpenDirectory ("C:\Новые документы")

    9.4.3. CleanString - очистка строк

    CleanString очищает переданную строку от непечатаемых и специальных символов, превратив ее в обычный текст. Такой же текст можно получить, если скопировать текст из Microsoft Word в Блокнот, а потом - обратно. Например, с помощью такого кода можно получить очищенную строку из выделенной области документа (листинг 9.7.).

    str_Clean = Application.CleanString(Selection.Text)

    9.4.4. Keyboard - программное переключение раскладки

    Keyboard позволяет программно переключать раскладку клавиатуры. При переключении используется идентификатор языковых и клавиатурных установок. Чтобы включить русскую раскладку, можно воспользоваться таким кодом (листинг 9.8.):

    Application.Keyboard 1049

    Очевидно, что 1049 - это код русского языка. Для включения английской раскладки используйте этот метод с идентификатором 1033.

    9.4.5. ListCommands - справка по горячим клавишам

    ListCommands это необычный метод - если вызвать его с параметром True (листинг 9.9.) - он создаст новый документ, содержащий таблицу со списком клавиатурных сочетаний, назначенных командам MS Word. Таблица содержит несколько десятков страниц.

    Application.ListCommands True

    9.4.6. NewWindow - копия окна активного документа

    09-02-New Window.docm - пример к п. 9.4.6.

    NewWindow создает копию окна активного документа. Это может быть полезным например, для того, чтобы вывести один и тот же документ на два монитора при работе с расширенным рабочим столом и т.д. Например, метод можно вызвать так:

    Application.NewWindow

    При необходимости можно задать, для какого именно документа вы хотите создать копию окна. Однако, это потребует использования других объектов. Например - коллекции Windows, содержащей окна документов. Такой код (листинг 9.11.) создаст одну копию для каждого открытого окна:

    For i = Application.Windows.Count To 1 Step -1
        Application.Windows.Item(i).NewWindow
    Next i

    Мы не случайно запустили цикл обхода открытых окон в обратном порядке. Дело в том, что иначе будет создано несколько копий одного и того же документа.

    В этом примере вам встретились неизвестные ранее свойства Count и Item. Первое обычно содержит количество элементов в коллекции, второе позволяет обращаться к элементам по индексам или именам.

    При создании копии после имени документа появляется двоеточие с номером окна, например, ":1" для первого, ":2" для второго и т.д.

    9.4.7. OnTime - запуск макросов по расписанию

    09-03-OnTime.docm - пример к п. 9.4.7.

    OnTime позволяет устанавливать таймер, по которому можно запустить макрос в определенное время. Например, чтобы выполнить макрос MyMacros, который хранится в том же документе, что и исполняемый макрос, достаточно выполнить такой код (листинг 9.12.).

    Application.OnTime When:="08:37:00", Name:="MyMacros"

    Параметр When указывает на время запуска, параметр Name - на имя макроса. Важно, чтобы макрос был доступен как в момент запуска таймера, так и в момент запуска самого макроса. Для того чтобы это условие соблюдалось, желательно хранить макросы, запускаемые по таймеру, в Normal.dotm, в другом глобальном шаблоне, или в том же документе, в котором произошел запуск таймера.

    Как видите, мы привели пример лишь для запуска макроса в строго определенное время. А как же быть, если нужно запустить макрос, например, через пятнадцать секунд после выполнения какой-либо процедуры? Ответ прост (листинг 9.13.)

    Application.OnTime _ 
    When:=Now + TimeValue("00:00:15"), _ 
    Name:="MyMacros"

    Здесь мы запускаем тот же самый макрос, но уже через 15 секунд после установки таймера. Функция Now имеет тип Date и возвращает текущую дату и время, а функция TimeValue преобразует переданное ей время в формат Date.

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

    9.4.8. PrintOut - распечатка документов

    PrintOut предназначен для вывода документов на печать. Например, следующий код (листинг 9.14.) выводит на печать все документы Microsoft Word 2007 (то есть - с расширениями docx и docm ), расположенные в корневом каталоге диска C.

    var_Doc = Dir("C:\*.doc?")
    Do While var_Doc <> ""
        Application.PrintOut FileName:=var_Doc
        var_Doc = Dir()
    Loop

    Метод PrintOut существует для различных объектов и может принимать множество параметров, управляющих всеми тонкостями печати. Например, с помощью такого кода (листинг 9.15.) мы можем распечатать первые пять страниц текущего документа:

    ActiveDocument.ActiveWindow.PrintOut _
    Range:=wdPrintFromTo, From:="1", To:="5"

    9.4.9. Quit - выход из приложения

    Quit используется для выхода из приложения (листинг 9.16.):

    Application.Quit

    9.4.10. Run - запуск макросов

    Run позволяет запускать макросы и, при необходимости, передавать им параметры (до 30). При вызове методу Run передается имя, состоящее из имени проекта, имени модуля, и, собственно, имени макроса. Например, запуск макроса MyMacros, расположенного в модуле NewModule проекта Project1 выглядит так (листинг 9.17.):

    Application.Run ("Project1.NewModule.MyMacros")

    Параметры, передаваемые макросу, перечисляются после его имени через запятую.

    9.4.11. ScreenRefresh - принудительное обновление экрана

    ScreenRefresh позволяет принудительно обновить экран. Используется обычно в комбинации с запретом автоматического обновления экрана (свойство Application.ScreenUpdating, его мы рассмотрим ниже). Как правило, обновление экрана делают через некоторые промежутки времени - тогда у пользователя не возникает ощущения, что программа зависла.

    Теперь рассмотрим наиболее полезные свойства объекта Application.

    9.5. Свойства объекта Application

    9.5.1. ActiveDocument и другие - активный документ

    ActiveDocument возвращает объект активного документа - того, который открыт в данный момент в Microsoft Word для редактирования. У объекта ActiveDocument есть множество полезных свойств и методов. Мы обсудим их при разговоре об объекте Document.

    Например, в листинге 9.18 мы выводим в окне сообщения имя активного документа.

    MsgBox Application.ActiveDocument.Name

    Надо отметить, что нельзя модифицировать свойство ActiveDocument - то есть не можем с его помощью сделать неактивный документ активным. Чтобы сделать документ активным, используют специальный метод объекта Document.

    Существует немало других свойств Application, имена которых начинаются с Active.

    ActivePrinter возвращает объект активного принтера - устройства, используемого для печати документов по умолчанию.

    ActiveWindow возвращает активное окно - объект типа Window.

    9.5.2. CapsLock - текущее состояние Caps Lock

    CapsLock показывает текущее состояние режима Caps Lock. Если этот режим активен, по умолчанию при вводе с клавиатуры вводятся прописные буквы. Если режим Caps Lock включен - свойство возвращает True, если выключен - False.

    9.5.3. Caption - заголовок окна MS Word

    Caption позволяет узнать, и, при желании, изменить заголовок окна Microsoft Word.

    Например код в листинге 9.19. меняет словосочетание Microsoft Word в заголовке окна на слова "Моя программа".

    Application.Caption = "Моя программа"

    9.5.4. CustomizationContext - область сохранения настроек

    CustomizationContext позволяет узнавать и задавать документ и шаблон, в котором сохраняются такие настройки, как изменения в настройке меню, панелей инструментов, горячих клавиш. Чтобы узнать текущую область настройки, достаточно выполнить код из листинга 9.20.

    MsgBox Application.CustomizationContext

    Чтобы установить в качестве области настройки шаблон Normal.dotm (то есть - сделать настройки доступными для всех документов), достаточно воспользоваться кодом листинга 9.21.:

    CustomizationContext = NormalTemplate

    Обратите внимание на то, что в предыдущих версиях MS Word этот шаблон назывался Normal.dot.

    Для сохранения изменений в шаблоне, присоединенном к активному документу, можно воспользоваться командой из листинга 9.22.:

    CustomizationContext = ActiveDocument.AttachedTemplate

    Для сохранения изменений лишь в текущем документе, можно использовать команду из листинга 9.23.

    CustomizationContext = ThisDocument

    9.5.5. Dialogs - диалоговые окна MS Word

    09-04-Dialogs.docm - пример к п. 9.5.5.

    Dialogs возвращает коллекцию Dialogs (Диалоговые окна), которая дает доступ ко всем диалоговым окнам Microsoft Word. Если выполнить код листинга 9.24., можно узнать количество объектов в коллекции Dialogs.

    MsgBox ("Количество окон в коллекции Dialogs:" + _
        Str(Application.Dialogs.Count))

    Чтобы отобразить диалоговое окно поиска строк в документе, можно использовать код, представленный в листинге 9.25.

    Dim obj_FindS As Dialog
        Set obj_FindS = Dialogs(wdDialogEditFind)
        With obj_FindS
            .Find = "Строка"
            .Show
        End With

    Здесь мы объявляем объектную переменную типа Dialog, создаем ссылку на окно поиска строк в документе - это окно представлено константой wdDialogEditFind, после чего присваиваем свойству Find окна поиска значение "Строка" - именно это значение будет отображаться в строке поиска, и показываем окно поиска, используя метод Show. Похожим образом работают и с другими диалоговыми окнами. Их имена (около 230) можно найти в перечислении WdWordDialog.

    9.5.6. DisplayAlerts - управление выводом сообщений

    DisplayAlerts - позволяет управлять выводом диалоговых окон, сообщений об ошибках и т.д. при работе в Microsoft Word. Чтобы запретить вывод всех сообщений, используйте код, приведенный в листинге 9.26.

    Application.DisplayAlerts = wdAlertsNone

    Константа wdAlertsNone запрещает вывод сообщений. Аналогично, константа wdAlertsAll разрешает вывод всех сообщений, а wdAlertsMessageBox разрешает лишь вывод окон сообщений, сообщения об ошибках не выводятся.

    9.5.7. EnableCancelKey - запрещаем остановку программы

    09-05-Cancel.docm - пример к п. 9.5.7

    EnableCancelKey - позволяет разрешать и запрещать пользователю остановку программы по нажатию сочетания клавиш Ctrl + Break. Это может быть полезно при выполнении участков кода, которые нельзя прерывать.

    Для того чтобы запретить прерывание работы программы нужно присвоить этому свойству значение wdCancelDisabled, для разрешения - wdCancelInterrupt.

    Пример использования этого оператора вы можете найти в листинге 9.27.

    Dim num_b As Double
        MsgBox ("Вы не сможете прервать выполнение " + _
            "следующего кода")
        Application.EnableCancelKey = wdCancelDisabled
        For i = 1 To 1000000
            For j = 100 To 1 Step -1
                num_b = num_b * i / j
            Next j
        Next i
        Application.EnableCancelKey = wdCancelInterrupt
        MsgBox ("А теперь Ctrl + Pause Break " + _
            "снова работает")

    9.5.8. IsObjectValid - проверка объектных переменных

    IsObjectValid - позволяет проверить объектную переменную. Если объект, на которую она ссылается, существует - проверка возвратит True, если нет - False. Это свойство полезно использовать для проверки объектов, которые могут быть удалены пользователем. Если объект существует, можно произвести с ним какие-либо действия. Если нет - сообщить причину, по которой действия невозможны.

    9.5.9. KeyBindings - назначаем клавиатурные сокращения

    KeyBindings - возвращает коллекцию KeyBindings, которая содержит информацию о клавиатурных привязках. Это очень полезная коллекция - с ее помощью можно, например, назначить клавиатурную комбинацию для запуска какого-нибудь макроса. листинг 9.28. позволяет назначить комбинацию клавиш Alt + Shift + T макросу TextEdit, хранящемуся в модуле MyMacros шаблона Normal.Dotm

    Application.CustomizationContext = NormalTemplate
    Application.KeyBindings.Add _
    wdKeyCategoryMacro, _
    "Normal.MyMacros.TextEdit", _
    BuildKeyCode(wdKeyAlt, wdKeyShift, wdKeyT)

    Сначала с помощью свойства CustomizationContext мы устанавливаем место, где будет сохранена привязка. Это - шаблон Normal.Dotm. Далее мы используем метод Add коллекции KeyBindings. Мы передаем этому методу три параметра. Первый ( wdKeyCategoryMacro ) указывает методу на то, что мы назначаем клавиатурную комбинацию макросу. Второй -" Normal.MyMacros.TextEdit " - указывает путь к макросу, запуск которого мы назначаем клавиатурному сокращению. Третий параметр содержит вызов метода BuildKeyCode - напомню, что он генерирует код сочетания клавиш на основе переданных ему параметров. В нашем случае он сгенерирует код для сочетания клавиш Alt + Shift + T - мы передали методу параметры wdKeyAlt, wdKeyShift и wdKeyT.

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

    9.5.10. NumLock - состояние цифровой клавиатуры

    NumLock возвращает состояние клавиши NumLock - True если цифровая клавиатура находится в режиме ввода цифр, иначе - False.

    9.5.11. RecentFiles - недавно открытые файлы

    RecentFiles - позволяет работать с файлами, которые вы недавно открывали. Список этих файлов можно увидеть в диалоговом окне открытия файлов. Последний файл, с которым вы работали, хранится в списке первым. Чтобы открыть его, можно воспользоваться кодом из листинга 9.29.

    RecentFiles(1).Open

    9.5.12. ScreenUpdating - запрет обновления экрана

    09-06-ScreenUpdating.docm - пример к п. 9.5.12.

    Свойство ScreenUpdating используют для отключения обновления экрана во время вывода в документ большого количества информации или других действий с документом. Это позволяет ускорить работу, так как системные ресурсы не тратятся на постоянное обновление экрана. В листинге 9.30. мы запрещаем обновление экрана, выводим в документ 10000 строк, принудительно обновляя экран после каждой 1000 строк, после чего разрешаем автоматическое обновление.

    Application.ScreenUpdating = False
        For i = 1 To 10
            For j = 1 To 1000
                Selection.TypeText ("Строка №" + Str(i * j))
                Selection.TypeParagraph
            Next j
            Application.ScreenRefresh
        Next i
        Application.ScreenUpdating = True

    Очевидно, что присвоив False свойству ScreenUpdating мы запрещаем обновление экрана, а присвоив True - разрешаем.

    9.5.13. StatusBar - вывод информации в строку состояния

    09-07-Status Bar.docm - пример к п. 6.3.2.13

    Модифицировав свойство StatusBar вы можете записать любой текст в строку состояния Microsoft Word. Туда можно выводить сообщения о ходе выполнения какой-нибудь длительной операции и т.д. В листинге 9.31. приведен пример использования этого свойства.

    Application.StatusBar = "Пожалуйста, подождите..."

    9.5.14. System - системная информация

    09-08-System.docm - пример к п. 9.5.12.

    Это свойство возвращает объект System, который дает доступ к различной системной информации (о разрешении экрана, типе процессора, объеме свободного места на жестких дисках и т.д.)

    Например, свойство FreeDiskSpace объекта System позволяет узнать размер свободного пространства на текущем жестком диске (листинг 9.32.)

    Dim var_DiskSize As Variant
    var_DiskSize = Application.System.FreeDiskSpace
    var_DiskSize = Int(var_DiskSize / (1024 ^ 2))
    If var_DiskSize >= 2047 Then _
    MsgBox ("На текущем HDD более 2 Гб свободного места") _
    Else MsgBox ("Размер свободного места на текущем диске " + _
    "равен " + Str(var_DiskSize) + " Мб")

    В этом примере мы учитываем тот факт, что при определении свободного места свойство FreeDiskSpace, во-первых, возвращает значение в байтах, а во-вторых - максимальное значение, возвращаемое функцией, не превышает 2,147,483,647 байт, то есть 2048 Мб или 2 Гб. Для получения значения в мегабайтах мы делим полученное значение на 1024 во второй степени.

    9.5.15. Tasks - работа с запущенными приложениями

    09-09-Tasks.docm - пример к п. 9.5.15.

    Это свойство возвращает коллекцию Tasks, которая дает доступ ко всем приложениям, запущенным в системе. Давайте рассмотрим пример работы с приложением Notepad.exe (Блокнот), которое представлено в системе процессом Блокнот. Напишем программу (листинг 9.33.), которая проверяет, запущен ли Блокнот, если запущен - выводит сообщение "Блокнот уже запущен", активирует его окно. Если Блокнот не запущен - запускает его, сообщив об этом.

    If Application.Tasks.Exists("Блокнот") = True Then
        MsgBox ("Блокнот уже запущен")
        With Tasks("Блокнот")
            .Activate
            .WindowState = wdWindowStateMaximize
        End With
    Else
        MsgBox "Запускаем Блокнот..."
        Shell ("Notepad.exe")
            With Tasks("Блокнот")
            .Activate
            .WindowState = wdWindowStateMaximize
        End With
    End If

    9.5.16. Visible - скрытие окна MS Word

    Visible позволяет скрыть окно Microsoft Word. Если присвоить ему значение False - окно приложения будет скрыто, причем даже с панели задач Windows. Если значение True - окно снова отобразится.

    9.5.17. Windows - работа с окнами

    09-10-Windows.docm - пример к п. 9.5.17.

    Это свойство возвращает коллекцию Windows, которая содержит окна всех открытых документов. Она позволяет управлять окнами. Например, код листинга 9.34. располагает окна на экране без перекрытия:

    Application.Windows.Arrange (wdTiled)

    Посмотрите на листинг 9.35. Он иллюстрирует применение коллекции Windows:

    For i = 1 To Application.Windows.Count
       With Application.Windows.Item(i)
        .Activate
        .WindowState = wdWindowStateNormal
        .Width = 400
        .Height = 400
        .Left = i * 10 - 10
        .Top = i * 10 - 10
       End With
    Next i

    Здесь мы перебираем по очереди все окна (свойство Count коллекции Windows ), активируем каждое из них ( Activate ), после чего устанавливаем параметр WindowsState (Состояние окна) в значение wdWindowsStateNormal (иначе, если окно развернуто на весь экран, мы не сможем изменить его размеры и получим сообщение об ошибке). Далее, устанавливаем ширину и высоту окна по 400 пикселей и размещаем окна каскадом от левого верхнего угла экрана (координата 0,0), располагая каждое следующее окно правее и ниже предыдущего на 10 пикселей.

    9.6. События объекта Application

    09-11-События.docm - пример к п. 9.6.

    Как и любые другие объекты, Application может реагировать на различные события. Чтобы события объекта отображались в редакторе, нужно воспользоваться особой методикой. Во-первых - вставьте в ваш VBA-проект модуль класса командой Insert - Class Module (Вставить - Модуль класса) или любым другим удобным для вас способом. Теперь разместить в модуле такое объявление (листинг 9.36.).

    Public WithEvents obj_Application As Word.Application

    После этого в списке объектов модуля появится новый объект obj_Application, который будет представлять собой приложение Microsoft Word. В списке событий доступны для выбора различные события, соответствующие этому объекту. Например, следующие:

  • DocumentBeforeClose (Перед закрытием документа) - событие генерируется непосредственно перед закрытием одного из открытых документов. В этот обработчик можно вставить, например, команды проверки документа, команды сохранения копий документа и т.д.
  • DocumentBeforePrint (Перед печатью документа)
  • DocumentBeforeSave (Перед сохранением документа)
  • DocumentChange (Изменение документа) - это событие гененируется при создании нового документа, открытии существующего или тогда, когда любой документ становится активным.
  • DocumentOpen (Открытие документа)
  • NewDocument (Создание нового документа)
  • Quit (Выход из Microsoft Word)
  • WindowActivate (Активация окна документа)
  • WindowBeforeDoubleClick (Перед двойным щелчком) - происходит после двойного щелчка в области редактирования документа до выполнения стандартной процедуры обработчика двойного щелчка.
  • WindowBeforeRightClick (Перед щелчком правой кнопкой мыши)
  • WindowDeactivate (Деактивация окна)
  • WindowSelectionChange (Изменение выделенной области)
  • WindowSize (Размер окна) - происходит при изменении размеров или перетаскивании окна.
  • Если вы создадите модуль класса, объявите в нем объект приложения, создадите обработчики, они не будут работать без специальной подготовки. Дело в том, что прежде чем обработчики для Word.Application заработают, нужно связать переменную, представляющую приложение, с приложением. Это можно сделать из какого-нибудь другого модуля. Например, чуть ниже мы познакомимся с автоматически выполняемыми макросами - их можно использовать для подобных целей.

    Создадим новый документ Microsoft Word, в редакторе VBA добавим к нему новый модуль класса, назовем его AppEventsModule. Разместим в нем сначала объявление объектной переменной так, как указано выше, а потом создадим пару обработчиков, например, для событий NewDocument и WindowSelectionChange, в которые добавим код вызова окна сообщения с соответствующими сообщениями, указывающими на выполнение данного обработчика. Ниже, на рис. 9.2. вы можете видеть окно проекта после создания модуля и добавления в него соответствующего кода.

    (рис 9.2) Окно проекта после добавления модуля класса

    Теперь перейдем из редактора в документ, переключимся в режим конструктора, создадим в документе новую кнопку, назовем ее cmd_initObject подпишем как Инициализация, и напишем для нее такой код (листинг 9.37.):

    Dim obj_Module As New AppEventsModule
    Private Sub cmd_InitObject_Click()
        Set obj_Module.obj_Application = Word.Application
    End Sub

    Мы не случайно привели здесь полный код обработчика - дело в том, что переменная obj_Module должна быть объявлена не внутри обработчика, а в разделе объявлений модуля. Давайте подробнее рассмотрим этот код.

    Выше мы не работали с модулями класса, поэтому сейчас нас ждут некоторые неожиданности. Первая неожиданность возникает при объявлении переменной obj_Module. Как вы помните, при создании модуля класса мы задали его имя - AppEventsModule. Это имя может быть произвольным, главное - оно должно соответствовать общим правилам именования объектов и переменных VBA. В модуле мы объявили переменную obj_Application, которая должна представлять приложение. Итак, объявляя переменную obj_Module мы задаем для нее тип данных AppEventsModule - то есть создаем на основе класса AppEventsModule новый объект. В обработчике события нажатия кнопки cmd_InitObject мы связываем переменную объекта obj_Application (если следовать объектно-ориентированной терминологии, правильнее будет назвать ее свойством) с приложением Microsoft Word.

    После того, как код обработчика для кнопки создан, выйдите из редактора VBA в документ, выключите режим конструктора, нажмите на кнопку и попытайтесь выполнить одно из действий, для которых в модуле AppEventsModule созданы обработчики. Если все сделано верно - вы увидите соответствующие этим обработчикам окна сообщений.

    9.7. Выводы

    В этой лекции мы обсудили методы, свойства и события объекта Application приложения Microsoft Word. На очереди - другие объекты. В частности, в следующей лекции мы поговорим о работе с документами.

    Вернуться к учебному плану