Аннотация: Лекция посвящена описанию объектной модели 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
Листинг
9.1.
Связывание объекта с объектной переменной
Здесь вы можете видеть присваивание переменной ссылки на объект 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
Листинг
9.2.
Предварительное объявление объектной переменной
Ссылку на объект можно присвоить в процессе объявления переменной. Для этого нужно воспользоваться ключевым словом New (листинг 9.3.):
Dim obj_NewWord As New Word.Application
Листинг
9.3.
Ключевое слово New при объявлении переменной
Переменную, объявленную таким образом, мы можем сразу же использовать по назначению. Новый экземпляр объекта будет создан при первом обращении к нему.
О том, как же пользоваться объектными переменными, скорее даже не ими, а объектами, на которые они ссылаются, мы поговорим ниже.
9.3. Объект Application — приложение
09-01-With For Each.docm — пример к п. 9.3.
Объект Application можно представить в виде приложения Microsoft Word.
Такой код позволит вывести в окно сообщения информацию об имени приложения:
Как видите, здесь мы обратились к свойству 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
Листинг
9.4.
Оператор With — 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
Листинг
9.5.
Оператор For Each — Next
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:Новые документы")
Листинг
9.6.
Установка новой папки по умолчанию
Следует отметить, что если мы вызываем метод или свойство объекта Application из макроса Microsoft Word, мы можем опускать вызов Application — то есть, в вышеприведенном примере можно написать так:
ChangeFileOpenDirectory ("C:Новые документы")
9.4.3. CleanString — очистка строк
CleanString очищает переданную строку от непечатаемых и специальных символов, превратив ее в обычный текст. Такой же текст можно получить, если скопировать текст из Microsoft Word в Блокнот, а потом — обратно. Например, с помощью такого кода можно получить очищенную строку из выделенной области документа (листинг 9.7.).
str_Clean = Application.CleanString(Selection.Text)
Листинг
9.7.
Очистка строки
9.4.4. Keyboard — программное переключение раскладки
Keyboard позволяет программно переключать раскладку клавиатуры. При переключении используется идентификатор языковых и клавиатурных установок. Чтобы включить русскую раскладку, можно воспользоваться таким кодом (листинг 9.8.):
Application.Keyboard 1049
Листинг
9.8.
Переключение на русскую раскладку клавиатуры
Очевидно, что 1049 — это код русского языка. Для включения английской раскладки используйте этот метод с идентификатором 1033.
9.4.5. ListCommands — справка по горячим клавишам
ListCommands это необычный метод — если вызвать его с параметром True (листинг 9.9.) — он создаст новый документ, содержащий таблицу со списком клавиатурных сочетаний, назначенных командам MS Word. Таблица содержит несколько десятков страниц.
Application.ListCommands True
Листинг
9.9.
Вывод информации о горячих клавишах
9.4.6. NewWindow — копия окна активного документа
09-02-New Window.docm — пример к п. 9.4.6.
NewWindow создает копию окна активного документа. Это может быть полезным например, для того, чтобы вывести один и тот же документ на два монитора при работе с расширенным рабочим столом и т.д. Например, метод можно вызвать так:
Application.NewWindow
Листинг
9.10.
Создание копии окна активного документа
При необходимости можно задать, для какого именно документа вы хотите создать копию окна. Однако, это потребует использования других объектов. Например — коллекции Windows, содержащей окна документов. Такой код (листинг 9.11.) создаст одну копию для каждого открытого окна:
For i = Application.Windows.Count To 1 Step -1 Application.Windows.Item(i).NewWindow Next i
Листинг
9.11.
Создание копии для каждого открытого окна
Мы не случайно запустили цикл обхода открытых окон в обратном порядке. Дело в том, что иначе будет создано несколько копий одного и того же документа.
В этом примере вам встретились неизвестные ранее свойства 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"
Листинг
9.12.
Установка таймера запуска макроса
Параметр When указывает на время запуска, параметр Name — на имя макроса. Важно, чтобы макрос был доступен как в момент запуска таймера, так и в момент запуска самого макроса. Для того чтобы это условие соблюдалось, желательно хранить макросы, запускаемые по таймеру, в Normal.dotm, в другом глобальном шаблоне, или в том же документе, в котором произошел запуск таймера.
Как видите, мы привели пример лишь для запуска макроса в строго определенное время. А как же быть, если нужно запустить макрос, например, через пятнадцать секунд после выполнения какой-либо процедуры? Ответ прост (листинг 9.13.)
Application.OnTime _ When:=Now + TimeValue("00:00:15"), _ Name:="MyMacros"
Листинг
9.13.
Запуск макроса по расписанию
Здесь мы запускаем тот же самый макрос, но уже через 15 секунд после установки таймера. Функция Now имеет тип Date и возвращает текущую дату и время, а функция TimeValue преобразует переданное ей время в формат Date.
Если вы хотите, чтобы какой-то макрос запускался с некоторой периодичностью — установку таймера на запуск этого макроса можно установить в нем. Первый запуск макроса можно произвести вручную или каким-то другим способом (например — по событию приложения, с помощью автоматически выполняемого макроса), а последующие запуски этот макрос будет инициировать самостоятельно.
title | description | ms.date | ms.topic | dev_langs | helpviewer_keywords | author | ms.author | manager | ms.technology | ms.workload | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Word object model overview |
The Word object model consists of classes and interfaces that are provided in the primary interop assembly for Word and are defined in the Word namespace. |
02/02/2017 |
conceptual |
|
|
John-Hart |
johnhart |
jmartens |
office-development |
office |
Word object model overview
[!INCLUDE Visual Studio]
When you develop Word solutions in Visual Studio, you interact with the Word object model. This object model consists of classes and interfaces that are provided in the primary interop assembly for Word, and are defined in the xref:Microsoft.Office.Interop.Word namespace.
[!INCLUDEappliesto_wdalldocapp]
This topic provides a brief overview of the Word object model. For resources where you can learn more about the entire Word object model, see Use the Word object model documentation.
For information about using the Word object model to perform specific tasks, see the following topics:
-
Work with documents
-
Work with text in documents
-
Work with tables
Understand the Word object model
Word provides hundreds of objects with which you can interact. These objects are organized in a hierarchy that closely follows the user interface. At the top of the hierarchy is the xref:Microsoft.Office.Interop.Word.Application object. This object represents the current instance of Word. The xref:Microsoft.Office.Interop.Word.Application object contains the xref:Microsoft.Office.Interop.Word.Document, xref:Microsoft.Office.Interop.Word.Selection, xref:Microsoft.Office.Interop.Word.Bookmark, and xref:Microsoft.Office.Interop.Word.Range objects. Each of these objects has many methods and properties that you can access to manipulate and interact with the object.
The following illustration shows one view of these objects in the hierarchy of the Word object model.
At first glance, objects appear to overlap. For example, the xref:Microsoft.Office.Interop.Word.Document and xref:Microsoft.Office.Interop.Word.Selection objects are both members of the xref:Microsoft.Office.Interop.Word.Application object, but the xref:Microsoft.Office.Interop.Word.Document object is also a member of the xref:Microsoft.Office.Interop.Word.Selection object. Both the xref:Microsoft.Office.Interop.Word.Document and xref:Microsoft.Office.Interop.Word.Selection objects contain xref:Microsoft.Office.Interop.Word.Bookmark and xref:Microsoft.Office.Interop.Word.Range objects. The overlap exists because there are multiple ways you can access the same type of object. For example, you apply formatting to a xref:Microsoft.Office.Interop.Word.Range object; but you may want to access the range of the current selection, of a particular paragraph, of a section, or of the entire document.
The following sections briefly describe the top-level objects and how they interact with each other. These objects include the following five:
-
Application object
-
Document object
-
Selection object
-
Range object
-
Bookmark object
In addition to the Word object model, Office projects in Visual Studio provide host items and host controls that extend some objects in the Word object model. Host items and host controls behave like the Word objects they extend, but they also have additional functionality such as data-binding capabilities and extra events. For more information, see Automate Word by using extended objects and Host items and host controls overview.
Application object
The xref:Microsoft.Office.Interop.Word.Application object represents the Word application, and is the parent of all of the other objects. Its members usually apply to Word as a whole. You can use its properties and methods to control the Word environment.
In VSTO Add-in projects, you can access the xref:Microsoft.Office.Interop.Word.Application object by using the Application
field of the ThisAddIn
class. For more information, see Program VSTO Add-ins.
In document-level projects, you can access the xref:Microsoft.Office.Interop.Word.Application object by using the xref:Microsoft.Office.Tools.Word.Document.Application%2A property of the ThisDocument
class.
Document object
The xref:Microsoft.Office.Interop.Word.Document object is central to programming Word. It represents a document and all of its contents. When you open a document or create a new document, you create a new xref:Microsoft.Office.Interop.Word.Document object, which is added to the xref:Microsoft.Office.Interop.Word.Documents collection of the xref:Microsoft.Office.Interop.Word.Application object. The document that has the focus is called the active document. It is represented by the xref:Microsoft.Office.Interop.Word._Application.ActiveDocument%2A property of the xref:Microsoft.Office.Interop.Word.Application object.
The Office development tools in Visual Studio extend the xref:Microsoft.Office.Interop.Word.Document object by providing the xref:Microsoft.Office.Tools.Word.Document type. This type is a host item that gives you access to all features of a xref:Microsoft.Office.Interop.Word.Document object, and adds additional events and the ability to add managed controls.
When you create a document-level project, you can access xref:Microsoft.Office.Tools.Word.Document members by using the generated ThisDocument
class in your project. You can access members of the xref:Microsoft.Office.Tools.Word.Document host item by using the Me or this keywords from code in the ThisDocument
class, or by using Globals.ThisDocument
from code outside the ThisDocument
class. For more information, see Program document-level customizations. For example, to select the first paragraph in the document, use the following code.
C#
:::code language=»csharp» source=»../vsto/codesnippet/CSharp/Trin_VstcoreWordAutomationCS/ThisDocument.cs» id=»Snippet120″:::
VB
:::code language=»vb» source=»../vsto/codesnippet/VisualBasic/Trin_VstcoreWordAutomationVB/ThisDocument.vb» id=»Snippet120″:::
In VSTO Add-in projects, you can generate xref:Microsoft.Office.Tools.Word.Document host items at run time. You can use the generated host item to add controls to the associated document. For more information, see Extend Word documents and Excel workbooks in VSTO Add-ins at run time.
Selection object
The xref:Microsoft.Office.Interop.Word.Selection object represents the area that is currently selected. When you perform an operation in the Word user interface, such as bolding text, you select, or highlight the text and then apply the formatting. The xref:Microsoft.Office.Interop.Word.Selection object is always present in a document. If nothing is selected, then it represents the insertion point. In addition, a selection can encompass multiple blocks of text that are not contiguous.
Range object
The xref:Microsoft.Office.Interop.Word.Range object represents a contiguous area in a document, and is defined by a starting character position and an ending character position. You are not limited to a single xref:Microsoft.Office.Interop.Word.Range object. You can define multiple xref:Microsoft.Office.Interop.Word.Range objects in the same document. A xref:Microsoft.Office.Interop.Word.Range object has the following characteristics:
-
It can consist of the insertion point alone, a range of text, or the entire document.
-
It includes non-printing characters such as spaces, tab characters, and paragraph marks.
-
It can be the area represented by the current selection, or it can represent an area different from the current selection.
-
It is not visible in a document, unlike a selection, which is always visible.
-
It is not saved with a document and exists only while the code is running.
When you insert text at the end of a range, Word automatically expands the range to include the inserted text.
Content control objects
A xref:Microsoft.Office.Interop.Word.ContentControl provides a way for you to control the input and presentation of text and other types of content in Word documents. A xref:Microsoft.Office.Interop.Word.ContentControl can display several different types of UI that are optimized for use in Word documents, such as a rich text control, a date picker, or a combo box. You can also use a xref:Microsoft.Office.Interop.Word.ContentControl to prevent users from editing sections of the document or template.
Visual Studio extends the xref:Microsoft.Office.Interop.Word.ContentControl object into several different host controls. Whereas the xref:Microsoft.Office.Interop.Word.ContentControl object can display any of the different types of UI that are available for content controls, Visual Studio provides a different type for each content control. For example, you can use a xref:Microsoft.Office.Tools.Word.RichTextContentControl to create a rich text control, or you can use a xref:Microsoft.Office.Tools.Word.DatePickerContentControl to create a date picker. These host controls behave like the native xref:Microsoft.Office.Interop.Word.ContentControl, but they have additional events and data-binding capabilities. For more information, see Content controls.
Bookmark object
The xref:Microsoft.Office.Interop.Word.Bookmark object represents a contiguous area in a document, with both a starting position and an ending position. You can use bookmarks to mark a location in a document, or as a container for text in a document. A xref:Microsoft.Office.Interop.Word.Bookmark object can consist of the insertion point, or be as large as the entire document. A xref:Microsoft.Office.Interop.Word.Bookmark has the following characteristics that set it apart from the xref:Microsoft.Office.Interop.Word.Range object:
-
You can name the bookmark at design time.
-
xref:Microsoft.Office.Interop.Word.Bookmark objects are saved with the document, and thus are not deleted when the code stops running or your document is closed.
-
Bookmarks can be hidden or made visible by setting the xref:Microsoft.Office.Interop.Word.View.ShowBookmarks%2A property of the xref:Microsoft.Office.Interop.Word.View object to false or true.
Visual Studio extends the xref:Microsoft.Office.Interop.Word.Bookmark object by providing the xref:Microsoft.Office.Tools.Word.Bookmark host control. The xref:Microsoft.Office.Tools.Word.Bookmark host control behaves like a native xref:Microsoft.Office.Interop.Word.Bookmark, but has additional events and data-binding capabilities. You can bind data to a bookmark control on a document in the same way that you bind data to a text box control on a Windows Form. For more information, see Bookmark control.
Use the Word object model documentation
For complete information about the Word object model, you can refer to the Word primary interop assembly (PIA) reference and the Visual Basic for Applications (VBA) object model reference.
Primary interop assembly reference
The Word PIA reference documentation describes the types in the primary interop assembly for Word. This documentation is available from the following location: Word 2010 primary interop assembly reference.
For more information about the design of the Word PIA, such as the differences between classes and interfaces in the PIA and how events in the PIA are implemented, see Overview of classes and interfaces in the Office primary interop assemblies.
VBA object model reference
The VBA object model reference documents the Word object model as it is exposed to VBA code. For more information, see Word 2010 object model reference.
All of the objects and members in the VBA object model reference correspond to types and members in the Word PIA. For example, the Document object in the VBA object model reference corresponds to the xref:Microsoft.Office.Interop.Word.Document object in the Word PIA. Although the VBA object model reference provides code examples for most properties, methods, and events, you must translate the VBA code in this reference to Visual Basic or Visual C# if you want to use them in a Word project that you create by using Visual Studio.
See also
- Office primary interop assemblies
- Automate Word by using extended objects
- Work with documents
- Work with text in documents
- Work with tables
- Host items and host controls overview
- Programmatic limitations of host items and host controls
- Optional parameters in Office solutions
Введение
Без понимания объектной модели приложения невозможно осуществления написания каких-либо серьезных программ.
Все действия основаны на чтении или изменении свойств объектов, использование их методов.
Страница выделена для накопления информации, необходимой в учебном процессе.
Пока что её структура понятна не до конца, так как она может содержать колоссальное количество сведений, хоть это и не предполагается.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
Word
Для начала можно предложить ознакомится с базовой моделью Word 2003,
в свое время созданной автором в связи с невозможностью понять иначе подходы для программирования, а также для выполнения задания по анализу.
Также необходимо обращаться к описанию от Microsoft.
Его категорическим недостатком является актуальность для последней версии программы, причем без каких-либо отсылок на изменения.
Первыми информационными сведениями будут перечни наиболее важных объектов.
Часть из них служит для извлечения сведений, часть может быть изменена.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
Объект Selection
Данный объект, пожалуй, является наиболее важным с точки использования макросов.
Анализ и редактирование текста документа всегда основано на использовании в первую очередь его, как самого наглядного.
Selection соответствует выделенному тексту (фрагменту) или точке вставки курсора.
Последний случай можно рассматривать как минимальное (нулевое) выделение.
Selection имеет 114 методов и 67 свойств, что наглядно иллюстрирует его значимость.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
Метод Extend
Его использование позволит решить ряд вполне логичных, но непростых ситуаций, реализовать которые намного сложнее другими способами.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
Объект Range
Важный объект с точки зрения именно программирования, так как доступ к нему посредством интерфейса программы крайне ограничен.
Высокая скорость работы объясняется в том числе и тем, что ничего, что не изменяет текст, не выводится на экран.
Поскольку слово переводится как «диапазон», у него есть начало и конец, определяемые при создании соответствующего объекта.
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
….
Объект Table
Изначально важным моментом является то, что объект входит в коллекцию документа Tables!
Любая таблица состоит из столбцов и строк, на пересечении которых формируются ячейки.
Каждый из перечисленных подобъектов также входит в одноименную коллекцию.
….
Excel
Пока приведем только ссылку на модель
от Microsoft.
Вероятнее всего, при развитии будет сформирована отдельная страница.
….
PowerPoint
Пока приведем только ссылку на модель
от Microsoft.
Вероятнее всего, при развитии будет сформирована отдельная страница.
….
Объектная модель
Microsoft Word, объекты
Application, Document, Selection, Range, Bookmark
Общая структура объектов Word выглядит
так, как показано на рис. 10.1.
Рис. 10.1 Так выглядят главные объекты
Word
Но пугаться совсем не стоит — большая
часть из этих сотен объектов никогда
вам не понадобится. На практике для
решения большинства программных задач
достаточно знать всего лишь пять объектов
(с сопутствующими коллекциями):
-
объект Application;
-
объект Document (с коллекцией Documents);
-
объект Selection;
-
объект Range;
-
объект Bookmark (с коллекцией Bookmarks).
Ниже все эти самые важные объекты будут
подробно рассмотрены. Для каждого
объекта вначале будут рассмотрены общие
моменты, связанные с ними, например, в
каких ситуациях они нужны и как при
помощи них выполнять те или иные действия.
Поскольку наиболее часто встречающаяся
задача программирования в Word — это
создание документа (на основе шаблона)
и запись в нужное место документа
необходимой информации, то акцент будет
сделан использовании соответствующих
объектов для решении этой задачи.
Кроме того, для каждого объекта будут
перечислены самые важные свойства,
методы и события с кратким их описанием.
Эта часть добавлена по просьбе слушателей
учебного курса по программированию в
Office, поскольку многие из них не владеют
английским так, чтобы свободно читать
документацию. Если вы читаете эту книгу
подряд, то эти справочные части можно
просто пропускать.
5.3 Объект Application
5.3.1 Как работать с объектом Application
Объект Word.Application, запуск
нового экземпляра
Word, события объекта
Word.Application
Объект Application — это само приложение
Microsoft Word. Все остальные объекты Word
«вложены» в этот объект. Создать
этот объект — значит запустить Word на
вашем компьютере. Как правило, это нам
и надо (если мы создаем в формате Word из
другого приложения, например, из Access).
Но не забудьте — если вы запускаете
Word из другого приложения Office, то необходимо
добавить в ваш проект ссылку на библиотеку
Microsoft Word 11.0 Object Library.
Код на запуск Word очень прост:
Dim oWord As New Word.Application
Однако, выполнив этот код из другого
приложения, вы, скорее всего, даже не
заметите, что у вас что-то произошло.
Причины просты:
-
по умолчанию Word запускается в скрытом
окне; -
если в нем не открыт ни один документ,
он тут же и закрывается (после того, как
завершается создавшая его процедура).
Сделать Word видимым очень просто:
oWord.Visible = True
Однако возникает вопрос: а нужно ли его
делать видимым? Некоторые знакомые
разработчики утверждают, что не нужно.
Пусть Word работает в скрытом окне, создавая
требуемый документ. Когда пользователю
потребуется, он этот документ откроет.
Решать вам, но я предпочитаю, чтобы Word
все-таки был видимым: во-первых, сразу
видны все проблемы при создании документа,
а, во-вторых, пользователям почему-то
очень нравится, когда у них на глазах
открывается Word и начинает печатать
строки, которые в противном случае
пришлось бы печатать им самим.
Если вы работаете с Word в скрытом окне,
не забудьте после выполнения необходимых
действий его закрыть (иначе он так и
останется в оперативной памяти, видимый
только через Task Manager). Для закрытия Word
нужно вызвать его метод Quit().
Чтобы Word не закрывался сам собой, в нем
достаточно создать новый документ.
Подробно об этом будет рассказано в
следующем разделе, но самый простой
вариант создания нового документа Word
выглядит так:
Dim oWord As New Word.Application
oWord.Visible = True
oWord.Documents.Add
Если Word уже открыт, то можно получить
на него ссылку, например, при помощи
такого кода:
Set oWord = GetObject(,»Word.Application»)
Однако на практике, кроме очень специальных
случаев (активизация объектов OLE), такой
подход по сравнению с открытием нового
экземпляра Word ничего нам не дает.
Наоборот, появляется дополнительный
риск нечаянно испортить открытый в
существующем экземпляре созданный
пользователем документ или закрыть
существующий экземпляр Word без сохранения
пользовательских документов. Поэтому
лучше создавать новый экземпляр Word.
Если же ваш код VBA выполняется в Word (то
есть Word уже запущен), то объект Application
создавать уже не надо. В этой ситуации
он будет автоматически доступен в любой
момент (чтобы в этом убедиться, достаточно
впечатать в окне редактора кода
Application и добавить точку). Более того,
если не указано, к какому объекту
относится то или иное свойство или
метод, компилятор VBA в Word автоматически
считает, что это свойство или метод
принадлежит объекту Application. Поэтому
такой код функционально одинаков:
Application.Selection.TypeText «Мой
текст» и
Selection.TypeText «Мой текст»
Еще один важный момент, который связан
с объектом Application в Word. Для этого объекта
предусмотрено большое количество
удобных в использовании событий (открытие
документа, выход из Word, щелчок правой
кнопкой мыши, изменение документа,
печать документа, сохранение документа
и т.п.) Однако по умолчанию все эти события
не видны. Чтобы они появились, необходимо
в разделе Declarations кода формы (только
формы — не модуля!) объявить объект
Application с ключевым словом WithEvents, например,
так:
Public WithEvents App As Word.Application
В списке объектов у нас появится новый
объект App (то есть Application), для которого
можно выбрать события и добавлять код
в событийные процедуры точно так же,
как это мы делаем для формы и элементов
управления.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
18.02.2016194.27 Кб44V.docx
- #
- #
- #
- #
- #
- #
- #
- #
Объектная модель MSWord. Основные понятия.
(обращений: 377
)
Продолжая разговор о связи Access и других приложений необходимо четко знать
структуру того приложения, которым мы собираемся управлять. Волею судеб
получилось так, что первое приложение, краткий экскурс по которому я хочу
провести, будет Word.
Структура Word рассматривается в основном структура word97(8), но будут
ссылки и на 9 версию.
Рассматривать все объекты и классы я не буду, но важные обьекты структуры
будут мной отмечены. За описанием остальных обращайтесь к литературе, встроенной
помощи и другим источникам.
Для получения «структурного дерева» приложения Word нажмите F1 в окне
редактора кода VBA Word и в сведениях о программировании найдите пункт Microsoft
Word Objects(Объекты Word). Там вы обнаружите более 35 коллекций и объектов.
Обращаю ваше внимание только на объекты ,необходимые для понимания прочитанного
материала в дальнейшем.
Объектная модель Word представляет собой иерархию объектов, подчиненных
одному объекту application. Большинство объектов используют только библиотеку
Word, однако, некоторые ссылаются и на другие библиотеки (например, объект
assistant — помощник ссылается на библиотеку объектов office)
табличка объектов первого уровня иерархии объектной модели Word.(элементы с
пометкой «2000» доступны соответственно только в версиях Word начиная с
9)
Объект (семейство) |
Комментарии |
Application | Ссылается на активное приложение Word. Используется для управления приложением. Этот объект может быть использован другим приложением с помощью метода automation технологии ActiveX |
Addin (addins) | Семейство объектов addin — набор всех доступных надстроек Word. Просмотреть надстройки и шаблоны можно в диалоговом окне, выбрав в меню Word пункт сервисшаблоны и надстройки. |
Browser | Средство передвижения курсора по объектам документа (задействуется при активации в нижнем правом углу окна Word в полосе вертикальной прокрутки одной из трех кнопок навигации или нажатии комбинации клавиш «ctrl+alt+home») |
Dafaultweboptions 2000 | Активизируется при работе с Web-документами. |
Dialog(dialogs) | Набор встроенных диалоговых окон (например «Открытие файла») |
Document(documents) | Семейство объектов document- набор всех открытых документов |
Emailoptions 2000 | Через этот объект приложение Word имеет доступ ко всем глобальным параметрам, используемым при правке в Word сообщений электронной почты |
Filecionverter(Filecionverters) | Набор всех установленных конверторов, которые используются при открытии/сохранении документа |
Language(Languages) | Набор языков используемых при проверке орфографии |
Options | Через этот объект производится доступ к параметрам приложения и документов Word. Многие параметры доступны в диалоговом окне Word в меню сервиспараметры |
Selection | Выделенная область или точка правки активного документа. Только одна из областей выделения доступна в каждый момент времени. |
System | Через этот объект производится доступ к некоторым параметрам операционной системы, производится доступ к реестру, файлам *.ini и др. |
Template(Templates) | Семейство всех шаблонов Word. Просмотреть шаблоны и надстройки можно в диалоговом окне, выбрав в меню Word пункт сервисшаблоны и надстройки. |
Window(Windows) | Все окна приложения Word |
Быстро пробежав по основным объектам, обратим свое внимание на выделенные объекты (семейства). Т.к. именно они
будут часто использоваться в дальнейшем.
Хочется еще отметить, что объект Selection
вынесен в верхушку иерархии Word и обращается к выделенной области или месту
вставки активного документа приложения. Т.е. надо быть аккуратным,
при обращении к свойствам этого объекта, пока открыты несколько документов Word,
и не забывать, что Selection принадлежит объекту Application. И он единственный.
Семейство Documents предназначено для
управления документами Word. Это наиболее употребляемый объект и поэтому приведу
описание основных объектов и семейств подчиненных этому объекту.
Табличка объектов, подчиненных объекту Document .
Объекты |
Комментарии |
Bookmark(Bookmarks) | Семейство объектов, каждый из которых являет собой закладку в документе. Доступ к закладкам можно получить в диалоговом окне, выбрав в меню Word пункт вставка/закладка |
Characters[range] | Важный элемент семейства range. Каждый элемент соответствует одному символу документа, диапазона или области выделения. Свойство count элемента Characters даст количество символов документа. ВНИМАНИЕ! Нет элемента Character. |
Email 2000 | Объект — сообщение электронной почты. У каждого документа — только 1 такой объект. Доступен только в режимах правки документа как электронного сообщения. |
Fields(field) | Семейство объектов — полей документа, диапазона или области выделения. Поле в понятии Word — вычисляемый элемент, который вставлен в документ, поле содержит определенный код и может иметь несколько параметров документа. Обзор типов полей можно получить в диалоговом окне, выбрав в меню Word пункт вставка/поле |
Pagesetup | Через этот объект производится доступ к параметрам документа, используемым при печати документа Доступ к этим параметрам можно получить в диалоговом окне выбрав в меню Word пункт файл/параметры страницы |
Paragraph(Paragraphs) | Коллекция абзацев документа, диапазона или области выделения. |
Range | Наверное, самый важный элемент документа по работе с его содержимым. Представляет собой строго определенный диапазон, однозначно определен начальным и конечным символом диапазона. Используется для идентификации текста в документе. От области выделения не зависят. В отличие от выделенной области можно работать с несколькими диапазонами одновременно. Доступны только во время выполнения процедуры VBA . Любая манипуляция с диапазоном (диапазонами) вне области выделения не затрагивает области выделения и никак ее не меняет. |
Section(sections) | Набор разделов документа, диапазона или области выделения |
Sentences[range] | Важный элемент семейства range. Каждый элемент соответствует одному предложению документа, диапазона или области выделения. Свойство count элемента Sentencesдаст количество предложений документа. ВНИМАНИЕ! Нет элемента Sentence. |
Style(Styles) | Семейство всех стилей Word в т.ч. и тех, что определены пользователем в выбранном документе. Просмотреть стили можно в диалоговом окне, выбрав в меню Word пункт формат/стиль. |
Subdocument(subdocuments) | Коллекция подчиненных документов документа или диапазона |
Table(tables) | Коллекция таблиц документа, диапазона или области выделения |
Variable(variables) | Семейство объектов — переменных документа. Variableсодержит определенный код, и в обычном режиме не доступна конечному пользователю. Используя определенный тип поля(fields) можно выводить содержимое Variableв определенное место документа. Чаще всего используется в VBA . |
Weboptions 2000 | Через этот объект производится доступ к параметрам документа при сохранении или открытии WEB-документа. |
Words[range] | Важный элемент семейства range. Каждый элемент соответствует одному слову документа, диапазона или области выделения. Свойство count элемента Wordsдаст количество словдокумента. ВНИМАНИЕ! Нет элемента Word. |
В этой табличке были выделены те элементы
объекта document, что принадлежат семейству range
(диапазон).
Именно через этот элемент происходит доступ к любому
месту/символу/вставке/и т.д. Как вы успели, наверное, заметить, любой символ
документа принадлежит к семейству range. Причем один символ еще принадлежит к
подразделу characters, группа символов ограниченных
пробелами (точнее заканчивающиеся пробелами или знаками препинания) — к
подразделу words, набор символов ограниченных точками с
пробелом (переводами каретки, и т.п.) — к Sentences. На
мой взгляд — замечательная задумка. Само собой, что там, где есть что-то хорошее
— там есть и плохое.
Плюсы, наверное, очевидны:
* Быстрый доступ к
любому элементу — слову, предложению, и т.п.
* Проверка слов (символов,
предложений) происходит автоматически при добавлении чего-либо в семейство.
* Удобная навигация перехода — посимвольно, пословно, по предложениям.
*
Поиск по семейству проще.
* Статистика автоматическая — выделил — получил
отчет о наличии чего-либо.
Эти огромные преимущества над многими иными
способами отметки элементов текста, к сожалению, немного смазываются некоторыми
неприятностями.
* Большой текст — много элементов семейства — документ
сильнее загружает машину при работе с ним.
* Известно, что, например, работа
с массивом происходит быстрее.
* Ввиду заложенных особенностей каждого
элемента семейства range не всегда корректно работает поэлементная статистика,
для предотвращения чего навешивается проверка ошибок статистики и проч.
Нет, конечно же, Range работает правильно. Именно так, как и должно быть
по правилам элементов семейств. Но не всегда так, как хочется. Например: Данилов
М.Е. — Это 6 слов (точка — самостоятельное слово, пробел к словам не относится,
далее следует место вставки т.е. курсор — это тоже слово), и одно предложение.
Но проверка насильно мне указывает, что я забыл пробел после первой точки.
Ставим пробел — получили 6 слов, и 2 предложения. Именно этот момент чаще всего
вынуждает при авто переносе текста из какого-нибудь другого приложения office
использовать другие механизмы передачи данных (поля, закладки, переменные). Но
если вы точно знаете, сколько слов и предложений будет (было), то раскидать по
местам нужные нам данные не составит очень уж большого труда.
Принципы использования основных методов и свойств того или иного семейства
Word не имеют особых различий с принципами общей работы с семействами в VBA.
Поэтому обращать внимание на них нет необходимости, а при наличии таковой
обращайтесь к встроенной помощи Word, там все понятно написано. А пока пример,
на использование основных, отмеченных элементов.
Задача.
* Открываем новый документ на основе шаблона normal.
*
Проверим, нет ли там чего ненужного (слов, и т.п.).
* Создаем и вставляем
текст.
* Находим 10 Слово.
* Меняем его на него же, но с заглавной
буквы.
* Находим слово аксессс и меняем его на Access
* Находим символ
[@], причем не позднее 3-го предложения, меняем его на [№].
* Ищем «господа»
и добавляем «, а также дяденьки и тетеньки».
Все действия производим,
используя механизмы Word.
Public Sub
text_in_word()Dim word_obj As Object ‘ не стоит забывать что так
тоже можно обьявлять переменную.Dim
const_input_txt As String
‘ Это тот кусок текста, что нам надо перенести в
вордDim Full_name_new_doc As String ‘ПОЛНОЕ имя нашего документа будет лежать
здесьDim Name_new_doc As String ‘имя
нашего документа будет лежать здесьDim i As Integer ‘пригодится, мало ли чего…..
Dim range_word As Word.Range ‘а вот это стадия
раннего связывания. {О раннем и позднем связывании можно прочитать здесь}.
‘
Ниже будет понятно зачем оно нам надо (не
связывание а переменная)
Dim
range_character As Word.Range
‘Ниже будет понятно зачем оно нам надоDim range_sentences As
Word.Range ‘Ниже будет понятно зачем оно нам
надо» ———-стандартный модуль
открытия объекта ———
Err.Clear
‘очистка ошибокOn Error Resume NextSet word_obj =
GetObject(, «word.Application»)‘Проверили, вдруг ворд
уже открытIf Err = 429 Then ‘ ну коли закрыт —
откроемSet word_obj =
CreateObject(«word.Application») ‘так или иначе, объект
мы получилиElseIf Err <> 0
Then
MsgBox «error» & Err
‘ если какая то еще ошибка — например пользователь не имеет
доступаEnd If ‘ к ворд — пишем какая
ошибкаIf Err <> 429 And Err <> 0 Then Exit
Sub Else Err.Clear ‘ и выйдем, если ошиблисьOn Error GoTo 0 ‘ при этом еще происходит
очистка ошибки аналогично Err.Clear»
———-Ваяем далее ———»————Проверка свободного файла
——————On Error Resume NextIf
Dir(«c:text_in.doc», vbNormal) <> «» Then
Kill «c:text_in.doc» ‘Этот файл будет
шаблоном‘для последующего переноса
данных. Если он уже есть тогда его удалим.If Err = 75 Then
MsgBox
«А кто то с этим файлом работает….»
‘если файл занят
другими пользователями
Exit
Sub ‘ остановим процедуруElseIf Err <> 0 Then
MsgBox Err
‘ при условии
что призошла ошибка файловой системы
Exit
Sub ‘ тоже остановим
процедуруEnd IfOn Error GoTo 0»——————- место для файла есть, объект создали
———»—— Откроем новый файл, с
шаблоном Normal ———With
word_obj ‘Что бы не писать далее много раз имя
переменной.‘И работать будет немного
быстрее
.Visible = True
‘а то не видно,
чего там происходит
.Documents.Add
Template:=»normal.dot», NewTemplate:=False,
_
DocumentType:=wdNewBlankDocument, Visible:=True
‘ добавили ЧИСТЫЙ НОВЫЙ документ, шаблон у него будет normal,
он станет активным при открытии‘ и будет
именно документом, а не шаблоном
Full_name_new_doc =
.ActiveDocument.FullName
‘ получили ПОЛНОЕ имя нашего
нового документа
Name_new_doc = .ActiveDocument.Name
‘ получили имя нашего нового
документа
const_input_txt = «Уважаемые дамы и господа!
Оповещаем Вас, что надо обработать » & _
«все нижеперечисленные
заказы и развезти их по адресам:» & vbCrLf & » Заказ#234/исп »
& _
vbCrLf & «тот кто не имеет аксесс к необходимым
документам, тот будет отстранен до выяснения » & _
«причин
присутствия наличия отсутствия!»
‘Тут я использовал
vbcrlf,как перенос строки, для получения‘более структурно различимого текста в документе. Но даже
перенос можно было обработать програмно‘
добавлением в слова перенос строки.If .ActiveDocument.FullName <> Full_name_new_doc
Then
.Documents(Name_new_doc).ActivateIf
.ActiveDocument.Words.Count > 1 Then ‘ дело в том что в чистом документе есть 1
«слово»‘Это место
вставки.For i =
.ActiveDocument.Words.Count To 2 Step -1 ‘Задом наперед
для того что бы не возиться с‘ do while —
end
.ActiveDocument.Words(i).Delete
‘убираем все слова поочередно, начиная с
последнего‘я, конечно же, понимаю, что в
НОВОМ документе нет ничего. Этот кусок нужен тем, кто
работает‘ с существующими
документами.NextEnd If
.Selection.Text =
const_input_txt
‘ Использовали объект selection для
вставки текста.‘т.к. именно наш документ
сейчас активен — то все нормально.Но все же я проверил какой документ
активен.‘ввиду того, что никаких
выделеных областей в новом документе нет, а есть только область
вставки‘(палочка-курсор), то вставится
именно в это место.If
.ActiveDocument.Words.Count > 10 Then
‘Мы то знаем что слов вставили более 10 шт. Но мало ли
чего.
.ActiveDocument.Words(10).
Case
= wdTitleWord ‘Удобный метод range, по смене
регистраFor Each range_word In
.ActiveDocument.Words ‘Поиск во всем диапазоне
словIf range_word.Text = «аксессc »
Then range_word.Text = «Access »
‘ слово должно оканчиваться пробелом
‘ или знаком препинания или спец сиволомNextEnd IfSet range_sentences =
.ActiveDocument.Range(Start:=.ActiveDocument.Sentences(1).Start, End:=.ActiveDocument.Sentences(3).End)
‘ сделали конецом диапазона
третье предложение ‘ сделали началом диапазона первое
предложение
range_sentences.
SelectFor Each range_character In
range_sentences.Characters
‘ только для 3х
предложенийIf range_character.Text
Like «@» Then
range_character.Text = «№»
‘ like тоже можно
использоватьNext
‘ последнее, это добавление новых элементов в
коллекцию.
‘ много вариантов. Например
использовать метод replace
‘ можно
использовать метод find, а потом selection и вставить
текст
‘ ну раз уж мы используем коллекции. У
words нет явного метода add. Думаю это сделано для
‘ избежания неразберихи, при введении этого метода
явно.
‘ а вот метод insertafter (before) как
пить дать то что надо!For Each range_word In
.ActiveDocument.WordsIf range_word.Text =
«господа» Then range_word.InsertAfter «, а также
дяденьки и тетеньки»Next
‘ ну вроде все что обещался — сделал. Причем только методы
ворд использовал.
Full_name_new_doc =
«c:text_in.doc»
‘Задали имя для записи
документа
.ActiveDocument.saveas
filename:=Full_name_new_doc, fileformat:=wdFormatDocument
‘вообще
‘SaveAs имеет много
параметров, так что я часть их просто не
использовал
.ActiveDocument.
Close
‘Закрыл именно этот
документIf .Documents.Count = 0
Then .Application.Quit
SaveChanges:=wdDoNotSaveChanges
‘А вот тут как раз
проверили, если нет более документов — можем вообще закрыть
приложение.End WithSet word_obj = Nothing
‘очистили
памятьEnd Sub
Модуль запускается из Access и создает документ на диске С в корневом
каталоге. Этот пример при пристальном осмотре должен научить использовать
основные элементы семейства range объекта document приложения Word. В принципе,
все вышеперечисленные механизмы позволят быстро ориентироваться в теле любого
документа. Одно большое НО. Для передачи данных из другого приложения и создания
шаблона надо выстроить четкий алгоритм расстановки данных.
Самое неприятное, что из-за 1 неправильного символа все может «поплыть».
Тогда полученный документ нельзя будет назвать созданным автоматически — его же
придется потом подправлять руками. Те механизмы, что я привел, легко позволят
забрасывать в чистый новосозданный файл какие-то данные без каких-либо
затруднений. Указывая разные диапазоны вставки, можно заполнять и уже
существующие документы, хотя, что бы не испортить уже существующие данные надо
четко представлять себе процесс работы. Самым важным фактором этого метода
является «наличие отсутствия» как такового файла шаблона создаваемого документа,
т.е. посредством него можно сделать т.н. «Защиту от Дурака» — любителя стирать
непонятно зачем файлы типа «Шаблон_моей_программы.dot»
Что касается остальных, не менее важных элементов Document, то оставим их на
следующий раз.
Напоследок маленький, но забавный и не особо нужный в работе пример.
Кувыркатель индикатора клавиатуры (язык при этом меняется только в Word) при
запуске модуля из Access. Не знаю, то, что в других приложениях office язык
остается тем же, хотя индикатор сменился, правильно это или нет. Вам судить. Но,
как факт, такое возможно:
Public Sub
shifted_lang()Dim word_obj As Word.Application
‘Требует
раннего связывания
Err.Clear ‘очистка ошибок
On Error Resume NextSet word_obj = GetObject(, «word.Application»)
‘Проверили, вдруг ворд уже открытIf Err = 429 Then ‘ ну коли
закрыт — откроемSet word_obj =
CreateObject(«word.Application»)
‘так или иначе,
объект мы получилиElseIf Err
<> 0 Then
MsgBox «error» & Err
‘ если какая то еще ошибка — например пользователь
не имеет доступаEnd If ‘ к ворд — пишем какая ошибкаIf Err <> 429 And Err
<> 0 Then Exit Sub
Else Err.Clear
‘ и выйдем,
если ошиблисьOn Error GoTo 0 ‘ при этом еще
происходит очистка ошибки аналогично Err.ClearIf word_obj.Keyboard = 68748313 Then word_obj.Keyboard (1033) Else word_obj.Keyboard (1049)‘если английский — переключили на русский и
наоборот.If
word_obj.Documents.Count = 0 Then
word_obj.Application.Quit SaveChanges:=wdDoNotSaveChanges‘Проверили, если нет более документов — можем вообще закрыть
приложение.Set word_obj = Nothing ‘очистили памятьEnd Sub
Этот момент показывает наличие некоторых удобных, но недоступных Access,
механизмов Word. Так что ждем. Вдруг и у Access такое будет возможно. Без
WinApi.
Подведем итог всего, что тут написано.
Приложение Word достаточно сложно и имеет множество (мало сказано J )
элементов, способов и проч. Навигацию по документам можно легко осуществлять
программно через метод range. Создание нового документа и передача в него данных
из Access с использованием вышеприведенного метода сложно, однако при разработке
четкого алгоритма позволит обойтись без лишнего шаблона. Доступ к механизмам
замены, сортировки, и статистики можно также получить только через этот метод.
Остальные свойства/методы/элементы будут мною рассмотрены в дальнейшем.
С уважением, MAKC.
Danilov_maks@mail.ru http://mytraffic.narod.ru
Все приведенные модули проверены и работают.
О найденных неточностях
прошу сообщать на почтовый ящик.
При написании этой статьи использовалась литература издательства BHV г. Санкт
— Петербург.Серия «Мастер».