Vba word content что это

title keywords f1_keywords ms.prod api_name ms.assetid ms.date ms.localizationpriority

Document.Content property (Word)

vbawd10.chm158007337

vbawd10.chm158007337

word

Word.Document.Content

80578329-a648-1d4b-f83d-4b2d289813fb

06/08/2017

medium

Document.Content property (Word)

Returns a Range object that represents the main document story. Read-only.

Syntax

expression.Content

expression A variable that represents a Document object.

Remarks

The following two statements are equivalent:

Set mainStory = ActiveDocument.Content 
Set mainStory = ActiveDocument.StoryRanges(wdMainTextStory)

Example

This example changes the font and font size of the text in the active document to Arial 10 point.

Set myRange = ActiveDocument.Content 
With myRange.Font 
 .Name = "Arial" 
 .Size = 10 
End With

This example inserts text at the end of the document named «Changes.doc.» The For Each…Next statement is used to determine whether the document is open.

For Each aDocument In Documents 
 If InStr(LCase$(aDocument.Name), "changes.doc") Then 
 Set myRange = Documents("Changes.doc").Content 
 myRange.InsertAfter "the end." 
 End If 
Next aDocument

See also

Document Object

[!includeSupport and feedback]

Ty Anderson

Posted on Wednesday, August 7th, 2013 at 7:32 am by .

Microsoft Word is about the authoring of documents. Documents contain pages, paragraphs, sentences and more. Today, I want to wade into the waters of manipulating Word document content. The plan is to get your feet wet by providing an overview of the key objects along with code samples.

Continuing the fine tradition of all Office applications (OneNote being the exception), Word has an extensive and mature object model. My goal is to show “a way” to accomplish some tasks in Microsoft Word. These samples are not necessarily, “the way” to do it. There is more than one way to achieve the same results.

Today, we are concerned with the structure of a Word document… not its stylings and presentation (I’ll concern ourselves with that topic next).

  • Word document content objects
  • Accessing document content objects with code
  • Working with familiar Word content objects

Document content objects

Let’s look at the objects that combine together to construct a Word document.

  • Document :: The document represents a single, solitary Word document. This is the parent object for all content within a Word document file. It lives in an appropriately named collection called Documents. I covered the document object in a previous article – Word application and base objects.
  • Section :: Documents can contain multiple sections. This is how you apply different formatting, layout, and header/footer options to a Word document… by creating sections and formatting them differently.
  • Page :: Represents a single page within a document. A page can reside within a Range.
  • Paragraph :: A single paragraph of content. A paragraph can reside within a Selection, Document, or Range and is accessible via the Paragraphs collection object. Paragraphs also contain the formatting for content residing above it. Don’t ponder over that last sentence too much, I will explain it further in my next article.
  • Sentence :: This object does not exist… strange as that might seem. Instead, there is the Paragraphs collection object. This collection contains a collection of Range objects, which in turn, contain all the sentences for the Range. Confused? The code samples will help bring focus to the picture.
  • Selection :: This object contains the content selected either by the user or via code. It also is the insertion point if no selection exists. The insertion point is where the cursor blinks in the Word UI to inform the user of their location within the document.
  • Range :: Think of this object like real-estate. It contains a contiguous section of a document. Perhaps its two most popular properties are Start and End. They contain ranges starting and ending character positions within the Word document.

There are more “content” objects than these but the list above are the major objects that provide access to everything else.

Accessing Word document content objects with code

I want to give you a lot of VB.NET code samples today. I’ll start with the Range object and keep going as long as I have paper. By the end of the samples, my hope is you will have a general idea of how to access and edit content within a Word document.

The Range object

The Word object model is extensive and more than a little complex. The best way to figure out how to make things happen via code is to learn to think like Word thinks. The quickest way to achieve this goal is to master the Range and the Selection objects. I covered the selection object in this article so I will focus on the Range object. Just know that together, these two objects allow you to select and find Word content.

Enumerate paragraphs in a range

This method loops through all the paragraphs in the active document and reverses their order in a new document.

Private Sub EnumerateParagraphs()
    Dim curDoc As Word.Document = WordApp.ActiveDocument
    Dim newDoc As Word.Document
    Dim rng As Word.Range
    Dim str As String = ""
    Dim i As Integer
 
    rng = curDoc.Content
    i = rng.Paragraphs.Count()
 
    Do Until i = 0
        str = str & rng.Paragraphs.Item(i).Range.Text & vbCrLf
        i = i - 1
    Loop
 
    newDoc = WordApp.Documents.Add
    newDoc.Range().Text = str
 
    Marshal.ReleaseComObject(rng)
    Marshal.ReleaseComObject(curDoc)
    Marshal.ReleaseComObject(newDoc)

The key is the use of the Range object and all the document content. The code first grabs all the document content and assigns it to a Range variable (rng). Then the code finds out how many paragraphs exist and loops backwards to create a string. This string is then inserted into a new document. It’s a good bar trick that only works in nerd bars.

Select the current page range

In this sample, we use a Range object that’s buried deeper in the Word object model. The reason for this sample is that I want to point out that the Range object is darn near everywhere within Word.

Private Sub SelectedPageRange()
    Dim curDoc As Word.Document
    curDoc = WordApp.ActiveDocument
 
    curDoc.Bookmarks("page").Range.Select()
 
    Marshal.ReleaseComObject(curDoc)
 
End Sub

In this procedure, I employ the predefined “page” bookmark. This is a standard Word bookmark that always exists and allows easy selection of the page containing the current focus (or selection).

You can learn more about predefined bookmarks at MSDN.

Enumerate sentences in a range

This one is similar to paragraphs but we switch sentences for paragraphs. The idea is the same… create a new document that contains the sentences in reverse order.

Private Sub EnumerateSentences()
    Dim curDoc As Word.Document = WordApp.ActiveDocument
    Dim newDoc As Word.Document
    Dim rng As Word.Range
    Dim str As String = ""
    Dim i As Integer
 
    rng = curDoc.Content
    i = rng.Sentences.Count()
 
    Do Until i = 0
        str = str & rng.Sentences.Item(i).Text
        i = i - 1
    Loop
 
    newDoc = WordApp.Documents.Add
    newDoc.Range().Text = str.ToUpper
 
    Marshal.ReleaseComObject(rng)
    Marshal.ReleaseComObject(curDoc)
    Marshal.ReleaseComObject(newDoc)
End Sub

To mix it up, the final document’s text is upper case. I know, this is dazzling trickery.

The takeaway is that the Range object contains a section of the Word document. Within it are major items like paragraphs and sentences.

The Section object

Documents can contain multiple sections. Sections allow you to define different page layouts and header/footer schemes.

Enumerate sections

You can loop through document sections by accessing the Sections collection. This collection resides directly beneath the Document object.

Private Sub EnumerateSections()
    Dim curDoc As Word.Document
    Dim newDoc As Word.Document
    Dim str As String = ""
    Dim i As Integer
 
    curDoc = WordApp.ActiveDocument
 
    For i = 1 To curDoc.Sections.Count
        str = str & "SECTION " & i & vbCr
        str = str & vbTab & "start = " & curDoc.Sections(i).Range.Start
        str = str & vbTab & "end = " & curDoc.Sections(i).Range.End & vbCrLf
    Next
 
    newDoc = WordApp.Documents.Add
    newDoc.Range().Text = str
 
    Marshal.ReleaseComObject(curDoc)
    Marshal.ReleaseComObject(newDoc)
End Sub

This procedure builds a string that 1) lists each document section and 2) contains the section’s Start and End character position. Notice the use of the Range object to read this information.

Create a new section

When building Word documents via code, you will likely need to create a new section. This procedure will do the trick.

Private Sub CreateSection()
    Dim curDoc As Word.Document
    curDoc = WordApp.ActiveDocument
 
    curDoc.Sections.Add(WordApp.Selection.Range)
 
    Marshal.ReleaseComObject(curDoc)
End Sub

This sample inserts a section break at the current selection (or cursor) location. Again, notice the use of the Range property. You can easily grab a different range within the document and pass it as the location of the page break.

The Page object

The page object resides in a “funny” location. Not “ha ha” funny… more like “why the hell is it here?” funny. You access document pages via the Document.ActiveWindow.Panes collection. Why? Because these are the rules.

Enumerate pages

Someday you might want to loop through all document pages and perform some very specific business logic on them. This code does exactly that.

Private Sub EnumeratePages()
    Dim curDoc As Word.Document
    Dim newDoc As Word.Document
    Dim pgs As Word.Pages
    Dim str As String = ""
    Dim i As Integer
 
    curDoc = WordApp.ActiveDocument
    pgs = curDoc.ActiveWindow.Panes(1).Pages
 
    For i = 1 To pgs.Count
        str = "PAGE " & i & vbCr
        str = str & vbTab & "height = " & pgs.Item(i).Height
        str = str & vbTab & "width = " & pgs.Item(i).Width & vbCrLf
    Next
 
    newDoc = WordApp.Documents.Add
    newDoc.Range().Text = str
 
    Marshal.ReleaseComObject(pgs)
    Marshal.ReleaseComObject(curDoc)
    Marshal.ReleaseComObject(newDoc)
End Sub

Here, the business logic is to create a string that contains the height and width of each page and then display it in a new document. Your business logic will probably be more complex than this. Consider this procedure a starter kit for processing document pages.

Insert a page break

To create a page, you create a page break.

Private Sub InsertPageBreak()
    Dim sel As Word.Selection
    sel = WordApp.Selection
 
    sel.InsertBreak(Type:=Word.WdBreakType.wdPageBreak)
 
    Marshal.ReleaseComObject(sel)
End Sub

I start by referencing the current insertion point via the Selection object. I then invoke the InsertBreak method and specify a page break. Walla! We have a new page.

Working with familiar (some) Word content objects

Now that you know the basics of working with the Range, Section, and Page objects, let’s look at working with typical Word content like tabless, comments, & text.

Insert a table

I use tables all the time. I can see how it would be useful to have a procedure that inserts a table exactly how I like it.

Private Sub InsertTable(rowCount As Integer, columnCount As Integer)
    Dim curDoc As Word.Document = WordApp.ActiveDocument
    Dim table As Word.Table
 
    table = curDoc.Tables.Add(WordApp.Selection.Range, rowCount, columnCount)
    table.Cell(1, 1).Range.Text = "Hello Table"
 
    Marshal.ReleaseComObject(table)
    Marshal.ReleaseComObject(curDoc)
End Sub

In this case, I like a table with 1 column and 7 rows and 0 formatting. The Tables collection resides under the Document object. To add a new table, you call the collection’s Add method and specify its location (via a Range object), number of rows, and number of columns.

Enumerate comments

Authoring a quality document of any type (blog, article, report, proposal, etc.) is a collaborative effort. Comments are key to the collaborative process. If you receive your document after this process and it is littered with helpful comments for improving it… the following code will come in handy.

Private Sub EnumerateComments()
    Dim curDoc As Word.Document = WordApp.ActiveDocument
 
    For i = 1 To curDoc.Comments.Count
        curDoc.Comments.Item(i).Range.Text = _
            curDoc.Comments.Item(i).Range.Text & vbCrLf & _
            "Corrected. It's all good now!"
    Next
 
    Marshal.ReleaseComObject(curDoc)
End Sub

Here, I loop through the Comments collection. This collection also resides directly under the Document object. For each comment, I insert a comment below the existing comment text.

Create a comment

Creating a comment is straight-forward. The approach below utilizes the current selection’s range as the insertion point.

Private Sub CreateComment(commentText As String)
    WordApp.Selection.Comments.Add(WordApp.Selection.Range, commentText)
End Sub

The text for the comment needs to be passed as the procedure’s parameter.

You can also create comments by calling Document.Comments.Add. If you do that, you need to pass a Range to specify where to insert the comment.

Delete all comments

Deleting all comments is delightfully easy. There is a method that takes care of them.

Private Sub DeleteComments()
    Dim curDoc As Word.Document = WordApp.ActiveDocument
 
    curDoc.DeleteAllComments()
 
    Marshal.ReleaseComObject(curDoc)
End Sub

There is no need to loop through the Comments collection.

Insert text

To insert text, you can utilize the Selection and Range objects.

Private Sub InsertText(textToInsert As String)
    WordApp.Selection.InsertAfter(textToInsert)
    'WordApp.Selection.InsertBefore(textToInsert)
    'WordApp.ActiveDocument.Range.InsertAfter(textToInsert)
End Sub

In this sample, I utilize the current selection to insert the passed string after the current selection. I’ve include commented code to show how you can chose to InsertBefore. Also, I’ve shown how to do the same with the Range object.

Find text

Finding text is a core competency in Word solution development. This sample performs search and replace.

Private Sub FindText()
    Dim rng As Word.Range
    rng = WordApp.ActiveDocument.Content
 
    With rng.Find
        .ClearFormatting()
        .Execute(FindText:="Hello Table", _
                 ReplaceWith:="Found Table", _
                 Replace:=Word.WdReplace.wdReplaceAll)
    End With
 
    Marshal.ReleaseComObject(rng)
End Sub

The procedure sets a Range object that contains all document Content. It then executes a Find & Replace action to replace the text inserted in the InsertTable method from earlier.

Copy and paste text

If you have text in a Word document, you will need to move it around.

Private Sub CopyAndPasteText()
    Dim curDoc As Word.Document = WordApp.ActiveDocument
    Dim rng As Word.Range
    'Dim sel As Word.Selection
    rng = curDoc.Range(curDoc.Paragraphs(1).Range.Start, _
                       curDoc.Paragraphs(3).Range.End)
    rng.Copy()
    'sel = curDoc.Range(curDoc.Paragraphs(1).Range, _
    '                    curDoc.Paragraphs(3).Range.End)
    'sel.Copy()

    WordApp.Selection.GoTo(What:=Word.WdGoToItem.wdGoToBookmark, _
                           Name:="EndOfDoc")
    WordApp.Selection.Paste()
 
    Marshal.ReleaseComObject(rng)
    Marshal.ReleaseComObject(curDoc)
End Sub

This method stores the first 3 paragraphs in a Range object, copies them, moves to the end of the document, and pastes the paragraphs. I’ve included commented code that shows how you could perform the copy using a Selection object.

***

We have now delved into the waters of Word document content manipulation. We’ll continue looking at scenarios in future articles!

Available downloads:

This sample Word add-in was developed using Add-in Express for Office and .net:

VB.NET Word Document Content add-in

Word add-in development in Visual Studio for beginners:

  • Part 1: Word add-in development – Application and base objects
  • Part 2: Customizing Word UI – What is and isn’t customizable
  • Part 3: Customizing Word main menu, context menus and Backstage view
  • Part 4: Creating custom Word ribbons and toolbars: VB.NET, C#
  • Part 5: Building custom task panes for Word 2013 – 2003
  • Part 6: Working with Word document content objects
  • Part 8: Working with multiple Microsoft Word documents
  • Part 9: Using custom XML parts in Word add-ins
  • Part 10: Working with Word document properties, bookmarks, content controls and quick parts
  • Part 11: Populating Word documents with data from external sources
  • Part 12: Working with Microsoft Word templates

10.6. Свойства объекта Document

10.6.1. Application — приложение документа

Это свойство позволяет получить объект приложения документа. Вы можете подумать, что это — ошибка, что, наоборот, объект документа содержится в объекте приложения. Однако, ошибки нет. Это свойство позволяет обращаться к приложению тогда, когда у нас нет ссылки на него, а есть лишь ссылка на документ. Например, код в листинге 10.15 позволяет скрыть окно Microsoft Word вместе с окном документа, используя свойство Visible объекта Application.

ThisDocument.Application.Visible = False


Листинг
10.15.
Скрытие окна приложения

10.6.2. AttachedTemplate — присоединенный шаблон

Свойство AttachedTemplate позволяет узнать, какой шаблон присоединен к документу, а так же — изменить этот шаблон на другой. Это очень полезное свойство — ведь шаблоны могут содержать множество нужных макросов, стилей и т.д., а с помощью AttachedTemplate можно удобно управлять ими.

Например, такой листинг 10.16. позволяет вывести имя присоединенного шаблона и путь к нему:

Dim obj_Templ As Template
    Set obj_Templ = ActiveDocument.AttachedTemplate
    MsgBox ("Имя шаблона: " & obj_Templ.Name & _
    ", путь к шаблону: " & obj_Templ.Path)


Листинг
10.16.
Имя присоединенного шаблона и путь к нему

Здесь мы сначала объявили новую переменную типа Template, потом присвоили ей ссылку на шаблон, присоединенный к активному документу, а потом воспользовались свойствами Name и Path шаблона, чтобы вывести информацию о нем.

Листинг 10.17 позволяет присоединить к документу шаблон MyTemplate.dotm, расположенный на диске C.

ActiveDocument.AttachedTemplate = "C:MyTemplate.dotm"


Листинг
10.17.
Присоединяем шаблон к документу

10.6.3. Bookmarks — закладки

Возвращает коллекцию Bookmarks, которая содержит все закладки в документе. Закладки позволяют удобно организовать навигацию по документу, особенно удобно с их помощью автоматизировать создание новых документов на основе шаблонов. Подробнее о закладках мы поговорим ниже.

10.6.4. Characters, Words, Sentences, Paragraphs и другие

10-04-Символы.docm — пример к п. 10.6.4.

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

  • Characters (Символы) — возвращает одноименную коллекцию, каждый объект которой представляет собой отдельный символ в документе. Каждый объект коллекции Characters представляет собой диапазон ( Range ), содержащий один символ
  • Words (Слова) — то же самое, но уже для слов.
  • Sentences (Предложения) — то же самое для предложений.
  • Paragraphs (Абзацы) — коллекция абзацев документа.
  • Помимо этих коллекций документ может содержать и другие подобные. В частности, следующие:
  • Hyperlinks — гиперссылки. При добавлении гиперссылки обратите внимание на то, что метод Add использует объект привязки гиперссылки — Anchor (Якорь) — им может быть, например, графический или текстовый элемент.
  • Indexes — индексы.
  • InlineShapes, Shapes — фигуры, графические элементы
  • Lists — списки.
  • OMaths — формулы.
  • Sections — разделы.
  • Tables — таблицы.

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

Листинг 10.18 позволяет вывести в окне сообщения информацию о количестве символов в документе (включая пробелы).

MsgBox ("Количество символов: " & _
    ActiveDocument.Characters.Count)


Листинг
10.18.
Выводим количество символов в документе

С помощью метода Item коллекции, мы можем получить доступ к каждому символу документа. Например, с помощью этого метода можно проводить различные статистические подсчеты. листинг 10.19. позволяет узнать, сколько раз в документе использована буква «ф» в верхнем и нижнем регистре.

Dim var_Fcount
    var_Fcount = 0
    For i = 1 To ActiveDocument.Characters.Count
        If ActiveDocument.Characters.Item(i) = "ф" Or _
        ActiveDocument.Characters.Item(i) = "Ф" Then _
        var_Fcount = var_Fcount + 1
    Next i
    MsgBox ("Количество букв 'Ф' в документе: " & _
    var_Fcount)


Листинг
10.19.
Подсчитываем количество вхождений буквы «ф»

Листинг 10.20 позволяет заменить букву «ё» в верхнем и нижнем регистре на «е».

Dim obj_D As Document
    Set obj_D = ActiveDocument
    For i = 1 To obj_D.Characters.Count
        If obj_D.Characters.Item(i) = "ё" _
        Then obj_D.Characters.Item(i) = "е"
        If obj_D.Characters.Item(i) = "Ё" _
        Then obj_D.Characters.Item(i) = "Е"
    Next i


Листинг
10.20.
Замена буквы е на е

В листинге 10.21 вы можете найти программу, которая «переворачивает» весь текст в документе — меняет последний символ с первым, второй — с предпоследним и так далее.

Dim obj_D As Document
    Dim str_Chr As String
    Dim var_Count As Variant
    Set obj_D = Documents.Add
    obj_D.Range.Text = "Привет!"
    var_Count = obj_D.Characters.Count
    For i = 1 To var_Count  2
        str_Chr = obj_D.Characters.Item(i)
        obj_D.Characters.Item(i) = _
        obj_D.Characters.Item(var_Count - i + 1)
        obj_D.Characters.Item(var_Count - i + 1) = _
        str_Chr
    Next i


Листинг
10.21.
Переворачивание текста в документе

Здесь мы сначала заводим переменную для хранения ссылки на активный документ, далее — строковую переменную для временного хранения одного символа и переменную типа Variant, в которой будем хранить количество символов в документе.

Далее создаем новый документ и добавляем в него текст «Привет» с помощью свойства Text объекта Range. Именно этот текст мы и будем переворачивать.

Итак, мы используем цикл длительностью, равной количеству символов в документе, деленному на 2, причем обратите внимание на оператор деления. Это — целочисленное деление, то есть для четного числа символов в обмене будут участвовать все символы, а для нечетного — один, «центральный» символ останется на своем месте.

В цикле мы сначала присваиваем i -й символ переменной, потом присваиваем i -му символу противоположный ему символ, а в конце — противоположному символу — символ, хранящийся в переменной. Обратите внимание на алгоритм расчета противоположного символа. Var_Count — i + 1 дает нам последний символ при i = 1, то есть — для первого символа и т.д. В этом несложно убедиться путем расчетов. Например, если в тексте 10 символов, то для обмена с первым символом ( i = 1) мы получим последний символ (10-1+1=10), для второго ( i =2) — девятый (10-2+1=9) и т.д.

10.6.5. Content — «чистый» текст документа

10-05-Content.docm — пример к п. 10.6.5.

Свойство документа Content возвращает объект Range — текст документа без сносок, колонтитулов и т.д.

В листинге 10.22 вы можете найти пример использования свойства Content для настройки шрифта документа.

Dim obj_C As Range
    Set obj_C = ActiveDocument.Content
    With obj_C.Font
        .Name = "Arial"
        .Size = 12
        .Spacing = 1.5
    End With


Листинг
10.22.
Настраиваем шрифт текста документа

В этом коде мы объявили объектную переменную типа Range, связали с ней объект Range, возвращаемый свойством Content активного документа, после чего, воспользовавшись свойством Font объекта Range, установили гарнитуру ( Name ) шрифта Arial, размер ( Size ) — 12 пунктов и расстояние между символами в 1.5 пункта.

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

Dim str_Text As String
    str_Text = ActiveDocument.Content.Text


Листинг
10.23.
Записываем текст документа в переменную

Cвойство Text объекта Range возвращает текст объекта. Записав текст в переменную, мы сможем работать с ней средствами VBA.

10.6.6. Endnotes, Footnotes — сноски

10-06-Сноски.docm — пример к п. 10.6.6.

Эти свойства возвращают, соответственно, коллекцию Endnotes и Footnotes. В коллекции Endnotes находятся объекты Endnote — то есть концевые ссылки — ссылки, которые расположены в конце документа. В коллекции Footnotes расположены объекты Footnote — обычные ссылки, которые расположены в конце страницы.

Давайте рассмотрим работу с этими объектами на примере Footnotes. Работа с Endnotes аналогична работе с Footnotes.

Добавить в документ новую ссылку можно с помощью метода Add коллекции Footnotes.

Полный вызов метода Add выглядит так:

  • ActiveDocument.Footnotes.Add(Range, Reference, Text)
  • Range — область текста, для которой вставляется сноска.
  • Reference — определяет символ сноски. По умолчанию используется автоматическая нумерация сносок.
  • Text — текст сноски.

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

ActiveDocument.Footnotes.Add _ 
    Range:=Selection.Range, _
    Text:="Новая сноска!"


Листинг
10.24.
Добавление сноски к выделенному фрагменту документа

Свойство Count коллекции Footnotes позволяет узнать количество ссылок в документе.

Чтобы обращаться к отдельным сноскам (объектам Footnote ), можно пользоваться либо их индексами в коллекции Footnotes, либо — оператором For Each — Next.

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

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

В листинге 10.25 приведен пример форматирования сносок и ссылок на них.

Dim obj_D As Document
    Dim obj_Footnote As Footnote
    Set obj_D = ActiveDocument
    'Форматируем сноски
    For Each obj_Footnote In obj_D.Footnotes
        obj_Footnote.Range.Font.Size = 11
    Next
    'Форматируем знаки-ссылки на сноски
    For i = 1 To obj_D.Footnotes.Count
        obj_D.Footnotes.Item(i).Reference _
        .Font.Color = wdColorRed
    Next i


Листинг
10.25.
10.25. Форматирование сносок и ссылок на них

Сначала мы, с помощью конструкции For-Each перебираем все сноски и устанавливаем размер шрифта для каждой из них равным 11 пунктов.

Далее, с помощью цикла For-Next мы обходим все ссылки на сноски в тексте и делаем цвет их шрифта красным.

Чтобы удалить сноску, можно воспользоваться методом Delete объекта Footnote.

Узнать номер сноски в коллекции Footnotes можно, используя свойство Index. Например, код листинга 10.26 позволяет вывести поочередно все сноски с их номерами в окне сообщения.

Dim obj_D As Document
    Dim obj_Footnote As Footnote
    Set obj_D = ActiveDocument
    'Выводим информацию о сносках
    For Each obj_Footnote In obj_D.Footnotes
      MsgBox ("Номер сноски: " & obj_Footnote.Index & _
      vbCrLf & "Текст сноски: " & obj_Footnote.Range.Text)
    Next


Листинг
10.26.
10.26. Выводим все сноски и их номера

Константа vbCrLf заменяет собой знак перевода строки, в итоге при выполнении этого кода для каждой сноски будет выведено такое окно (рис. 10.2.).

Информация о сносках

Рис.
10.2.
Информация о сносках

Автоматизация работы с имеющимися данными 163

.SenderCompany = «ООО Универсал»

Наконец, наименование должности отправителя:

.SenderJobTitle = «Менеджер по работе с клиентами»

На этом заполнение свойств объекта LetterContent можно завершить:

End With

Поскольку предполагается воспользоваться методом SetLetterContent, заполнение всех свойств необязательно (остался целые ряд свойств, которые не были упомянуты). При других способах создания и использования объекта LetterContent необходимо задать значения абсолютно всем свойствам объекта.

Итак, поскольку приложение Word уже запущено и доступно через переменную WD, можно создать новый документ,

WD.Documents.Add

вставить в пустой документ заготовленную строку текста письма,

WD.ActiveDocument.Content.InsertBefore LetterText

и обратиться к методу SetLetterContent активного документа, передав ему в качестве параметра подготовленный объект типа LetterContent:

WD.ActiveDocument.SetLetterContent MyLetter

В результате документ превратится в письмо, которое мог бы создать мастер писем, основываясь на шаблоне Современное письмо. Помошник Office, возможно, предложит создать также конверт или наклейку.

Программный код функции Анализ_баланса

Теперь можно свести весь разработанный код воедино и записать исходный текст функции

Анализ_баланса (листинг 6.2).

ЛИСТИНГ 6.2

Public Function Анализ_Баланса()

Dim MyDb As Database

Dim Klients As Recordset

Dim Operations As Recordset

Dim WordRunning As Boolean

Dim KodKlienta As String

Dim SQLstr As String

Dim SumIn, SumOut As Currency

Dim LetterText As String

Dim WD As Word.Application

Dim MyLetter As New LetterContent

Set MyDb = CurrentDb

Set Klients = MyDb.OpenRecordset(«Клиенты»)

164 Глава 6. Access: автоматизация офисной базы данных

WordRunning = False

Klients.MoveFirst

Do While Not Klients.EOF

If Klients.Fields(«Фамилия») <> «» Then

KodKlienta = Klients.Fields(«КодКлиента»)

SQLstr = «SELECT * _

FROM Операции WHERE КодКлиента=» + KodKlienta

Set Operations = MyDb.OpenRecordset(SQLstr)

SumIn = 0

SumOut = 0

Operations.MoveFirst

Do While Not Operations.EOF

If Operations.Fields(«КодОперации») = 2 Then

SumIn = SumIn + _

Operations.Fields(«СуммаОперации»)

Else

SumOut = SumOut + _

Operations.Fields(«СуммаОперации»)

End If

Operations.MoveNext

Loop

Operations.Close

Set Operations = Nothing

If SumOut > SumIn Then

If MsgBox(«Отрицательное сальдо по клиенту » _ + Klients.Fields(«Фамилия») + _

«. Создать письмо?», vbYesNo, _ «Отрицательное сальдо») = vbYes _

Then

If Not WordRunning Then

Set WD = CreateObject(«Word.Application»)

WD.Visible = True

WordRunning = True

End If

LetterText = _

«Считаем необходимым обратить » + _ «Ваше внимание на то, что Ваш » + _ «баланс в операциях с нашей » + _ «компанией принял отрицательное » + _ «значение и составляет » + _

Str(SumIn — SumOut) + » руб.»

Автоматизация работы с имеющимися данными 165

With MyLetter

.DateFormat = Date$

.IncludeHeaderFooter = True

.PageDesign = _

«D:OfficeTemplates1049» + _ «Современное письмо ltr.dot»

.LetterStyle = wdModifiedBlock

.RecipientName = Klients.Fields(«Имя») + _

«» + Klients.Fields(«Отчество») + _

«» + Klients.Fields(«Фамилия»)

.RecipientAddress = _ Klients.Fields(«Адрес»)

.MailingInstructions = _ «ДЕЛОВАЯ КОРРЕСПОНДЕНЦИЯ»

.AttentionLine = «Внимание!»

.Subject = «Отрицательный баланс»

.ReturnAddress = _

«ООО Универсал, малая Ивановская 1»

.SenderName = «Петров П.П.»

.Closing = «С уважением,»

.SenderCompany = «ООО Универсал»

.SenderJobTitle = _

«Менеджер по работе с клиентами»

End With

WD.Documents.Add

WD.ActiveDocument.Content.InsertBefore LetterText

WD.ActiveDocument.SetLetterContent MyLetter

End If

End If

End If

Klients.MoveNext

Loop

Klients.Close

Set Klients = Nothing

Set Operations = Nothing

Set MyDb = Nothing

On Error Resume Next

If WordRunning Then WD.Quit

End Function

Чтобы выполнить функцию, достаточно выбрать двойным щелчком макрос Анализ балан-

са на вкладке Макросы. Далее, если в процессе анализа обнаружится отрицательное сальдо по одному из клиентов, достаточно будет щелкнуть на кнопке Äà в окне сообщения, и в открывшемся окне Word будет создано и отформатировано “современное письмо” с заданным содержанием и реквизитами (рис. 6.7).

166 Глава 6. Access: автоматизация офисной базы данных

Рис. 6.7. Письмо сформировано методом SetLetterContent

Глава 7

В мире объектов MS Office

Кое-что об объектах MS Office уже было рассмотрено в предыдущих главах. Чтобы более полно осознать возможности макросов VBA и представить себе, какие вообще задачи можно было бы решать с их помощью, а также узнать, как выполнить ту или иную операцию над ними, посвятим отдельную главу книги краткому обзору объектов MS Office. Направленность и объем этой книги не предполагают полного и детального рассмотрения объектной модели MS Office — этого, собственно, и не требуется никому, кроме профессиональных офис-программистов. Поэтому для начала вполне достаточно познакомиться с основными объектами, которые требуются для решения часто встречающихся задач, и научиться выполнять с ними типичные операции. Более того: многие действия с объектами MS Office можно выполнить десятком способов. Здесь будут рассмотрены на примерах одно-два самых простых действий. Таким образом, эта глава должна представлять собой что-то вроде краткого путеводителя по миру объектов Office или сборника “готовых рецептов” для непрофессионального программиста, который пытается самостоятельно решать при помощи VBA задачи автоматизации, характерные для своего конкретного офиса.

Работа с объектами MS Word

Объектная модель Word, как таковая, достаточно сложна. Однако все в ней подчинено строгим правилам, которые одинаково применимы ко всем уровням ее иерархической структуры: на уровне приложения, документа, абзаца, слова или символа. По этой причине овладеть основными приемами VBA-программирования для Word не так уж и трудно: достаточно понять несколько основных принципов, и уже никакие, даже совсем незнакомые объекты Word не поставят вас в тупик.

Работа с объектами Word на уровне приложения и документа

Объект Application

Приложение Word в целом представлено объектом Application. Это так называемый глобальный объект и во многих ситуациях его имя можно не упоминать, как нечто само собой разумеющееся (то есть, в большинстве приведенных ниже примеров префикс “Application.” можно было бы опустить). В свойствах этого объекта содержатся открытые окна, документы, всевозможные параметры рабочей среды Word и многое другое.

Свойство Caption

Например, заголовок окна Word задается свойством Caption этого объекта:

Application.Caption = “Мое приложение”

Свойства ActiveWindow, ActiveDocument и ActivePrinter

В свойствах ActiveWindow, ActiveDocument и ActivePrinter содержатся ссылки на,

соответственно, текущее окно, документ и принтер. Следующий код максимизирует текущее окно, сохраняет текущий документ и сообщает пользователю имя текущего принтера:

168 Глава 7. В мире объектов MS Office

Application.ActiveWindow.WindowState = wdWindowStateMaximize Application.ActiveDocument.Save

MsgBox Application.ActivePrinter

Семейство CommandBars

Семейство CommandBars представляет панели меню и панели инструментов Word. Например, включить в окне Word режим “крупные значки” можно при помощи следующего кода:

Application.CommandBars.LargeButtons = True

Свойства DisplayScrollBars и DisplayStatusBar

Многие свойства объекта Application отвечают за внешний вид и поведение окна Word. Например, присваивание логического значения False следующим свойствам приведет к тому, что будет отключено отображение полос прокрутки и строки состояния:

Application.DisplayScrollBars = False

Application.DisplayStatusBar = False

Объект Options

Все параметры и настройки Word, содержащиеся в диалоговом окне Сервис | Параметры, доступны посредством объекта Options.

Свойство AllowDragAndDrop: управление режимом перетаскивания текста в режиме Правка

Например, флажок использовать перетаскивание текста на вкладке Правка можно устано-

вить при помощи присваивания:

Application.Options.AllowDragAndDrop = True

Свойство SaveInterval: задание интервала автосохранения

А следующий код задаст интервал автосохранения (см. вкладку Сохранение) равным десяти минутам:

Application.Options.SaveInterval = 10

Свойство StatusBar

Свойство StatusBar позволяет записать произвольный текст в строку состояния Word:

Application.StatusBar = «Выполняется макрос, ждите…»

Метод Quit

Метод Quit завершает работу Word и закрывает его окно. Закрыть окно Word с сохранением всех открытых документов можно при помощи следующего кода:

Application.Quit wdSaveChanges

Семейство Documents

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

Работа с объектами MS Word 169

Метод Add

Метод Add создает новый документ на основе указанного шаблона (если не задавать этот параметр, то документ будет создан на основе шаблона Обычный). Как правило, используют объектную переменную типа Document, чтобы “запомнить” ссылку на вновь созданный документ:

Dim MyDoc As Document

Set MyDoc = Documents.Add(«C:MSOfficeTemplatesMy.dot»)

Метод Open

Метод Open используют для открытия уже существующего, то есть записанного ранее на диск документа:

Set MyDoc = Documents.Open(«C:Мои документыMyDoc1.doc»)

Методы Close и Activate

Обращаться к членам семейства Documents можно как по номерам, так и по именам. Например, следующий код закроет документ с именем “Документ1” и сделает активным четвертый из остающихся открытыми документов (если документа с именем “Документ1” среди открытых документов нет, или, если открыто менее четырех документов, то возникнет ошибка выполнения):

Documents(“Документ1”).Close

Documents(4).Activate

Объекты ActiveDocument и ThisDocument

С точки зрения макроса VBA есть два особенных документа из всех документов семейства Documents. Очень часто эти два документа совпадают в одном: ActiveDocument во многих случаях означает то же самое, что и ThisDocument, хотя, вообще говоря, это разные объекты. Объект ActiveDocument указывает на активный, то есть текущий документ, тот документ, чье окно активно и находится на переднем плане. Объект ThisDocument содержит ссылку на тот документ, в котором, собственно, находится выполняемый макрос.

Метод PrintOut: печать документа

Вывести на печать документ:

ActiveDocument.PrintOut

Метод SendMail: отправка документа по электронной почте, как вложение

Отправить документ по электронной почте, как вложение:

Options.SendMailAttach = True

ThisDocument.SendMail

В последнем случае по электронной почте будет отправлен документ или шаблон, в котором содержится макрос. Если макрос создан при помощи диалогового окна Макросы без уточнения местонахождения макроса, то в путь отправится шаблон Normal.dot. При этом автоматически откроется окно MS Exchange с созданным сообщением E-mail, где остается лишь указать адрес.

Метод Close

Метод Close имеется как у семейства Documents в целом, так и у каждого отдельно взятого Document-объекта. В первом случае он используется для группового закрытия документов, во втором — для закрытия конкретного документа.

Закрыть все документы с сохранением по подтверждению пользователя:

170 Глава 7. В мире объектов MS Office

Documents.Close wdPromptToSaveChanges

Закрыть текущий документ без сохранения:

ActiveDocument.Close wdDoNotSaveChanges

Методы Save и SaveAs

Явным образом сохранить документ можно при помощи метода Save (сохранение под текущим именем) или SaveAs (сохранить как):

ActiveDocument.Save

ActiveDocument.SaveAs «C:Мои документыMyDoc2.doc»

Объект Range: работа с текстовым содержимым документа

Основным рабочим инструментом для операций с содержимым документа Word является объект типа Range. Этот специальный, “абстрактный” объект представляет собой диапазон текста. По названию, а также по своему смыслу он схож с объектом Range рабочего листа Excel. Эти два

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

см. в гл. раздел “”.

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

Явно задать текстовый диапазон Range можно задать множеством различных способов. Многие свойства документа, не содержащие в своем названии слова “Range”, на самом деле возвращают при обращении к ним объект типа Range. У многих объектов существует свойство Range

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

Свойство Bold: выделение диапазона полужирным начертанием его символов

Выделить полужирным начертанием первые десять символов документа:

ActiveDocument.Range(Start:=0, End:=9).Bold = True

Свойство InsertBefore: вставка строки

Вставить вначале документа строку “АБВГД”:

ActiveDocument.Range(Start:=0, End:=0).InsertBefore «АБВГД»

Проверка правописания

Выполнить проверку правописания в первом разделе документа, и, в случае обнаружения ошибки, выдать сообщение:

If Not CheckSpelling(ActiveDocument.Sections(1).Range) Then

MsgBox «Обнаружена ошибка!»

End If

Работа с объектами MS Word 171

Задание верхнего колонтитула

Задать верхний колонтитул первой страницы для второго раздела:

ActiveDocument.Sections(2).Headers(wdHeaderFooterFirstPage).Range = _ «Глава 2»

Семейства Paragraphs, Sentences, Words и Characters

Семейство Paragraphs представляет все абзацы документа, семейство Sentences — все предложения, в семействе Words содержатся слова, а в семействе Characters — символы документа. Все эти семейства устроены одинаковым образом.

Свойства First и Last

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

Свойства Count

Свойстве Count содержится число элементов в семействе. И для всех этих семейств в любом случае в результате возвращается объект типа Range.

Свойство Alignment

Задать выравнивание по правому краю для первого абзаца:

ActiveDocument.Paragraphs(1).Alignment = wdAlignParagraphRight

Создание вокруг абзаца рамку заданного стиля

Заключить первый абзац в рамку стиля 3D:

ActiveDocument.Paragraphs.First.Borders.OutsideLineStyle = _

wdLineSyleEmboss3D

Вставка текста после заданного абзаца

Вставить текст после последнего абзаца:

ActiveDocument.Paragraphs.Last.Range.InsertAfter «Конец.»

Изменение фона абзаца

Задать для пятого абзаца штриховку (узор) 15%:

ActiveDocument.Paragraphs(5).Shading.Texture = _

wdTexture15Percent

Изменение стиля абзаца

Задать стиль 1-го абзаца Заголовок1:

ActiveDocument.Paragraphs.First.Style = «Заголовок 1»

Изменение стиля абзаца

Аналогичным образом можно обращаться к предложениям документа. Выбрать для первого предложения шрифт Arial:

ActiveDocument.Sentences(1).Font.Name = «Arial»

172 Глава 7. В мире объектов MS Office

Перемещение по тексту

Задать смещение вверх на три пункта для символов первого предложения и вниз на три пункта для второго:

ActiveDocument.Sentences(1).Font.Position = 3

ActiveDocument.Sentences(2).Font.Position = — 3

Метод Delete

Удалить последнее предложение:

ActiveDocument.Sentences.Last.Delete

Преобразование символов в верхний регистр

Преобразовать символы первого предложения в верхний регистр:

ActiveDocument.Sentences(1).Case = wdUpperCase

Изменение начертания символов Выделить первое слово полужирным начертанием:

ActiveDocument.Words.First.Bold = True

Семейство StoryRanges

Семейство StoryRanges также возвращает Range-объект, — оно обеспечивает доступ к различным структурным компонентам текста, таким, как основной текст, примечания, сноски, колонтитулы и др. Выбор нужного компонента осуществляется посредством соответствующей константы. Например, задать шрифт Arial для основного текста документа (не затронув при этом все остальное, как случилось бы при обращении к свойству ActiveDocument.Range), можно при помощи следующего кода:

ActiveDocument.StoryRanges(wdMainTextStory).Font.Name = «Arial»

Выделить полужирным нижний колонтитул 1-й страницы:

ActiveDocument.StoryRanges(wdFirstPageFooterStory).Bold = True

Работа со списками и таблицами документа Word

Word-таблицы

Таблицы в документе Word представлены объектами типа Table, доступными через семейство Tables. Каждая таблица — объект Table — состоит из строк (объекты типа Row, объединенные в семейство Rows) и столбцов (объекты типа Column, объединенные в семейство Rows). Кроме того, таблицу можно рассматривать, как набор ячеек (объектов типа Cell, объединенных в семейство Cells).

Управление границами таблиц

Разрешить отображение границ для первой таблицы документа:

ActiveDocument.Tables(1).Borders.Enable = True

Удаление столбца таблицы

Удалить первый столбец в первой таблице:

Соседние файлы в папке Книги

  • #

    31.05.201530.78 Кб77excel_vba.html

  • #
  • #

    31.05.2015192.38 Кб65VBA.htm

  • #
  • #

Понравилась статья? Поделить с друзьями:
  • Vba word combobox заполнение
  • Vba word columns width
  • Vba word change the
  • Vba word cell text
  • Vba word application getopenfilename