2006 г. Word и его объекты
|
1. VBA в Word
2. Структура объектов Word
Application
Documents
Windows
Lists
ActiveDocument
Selection
Tables
Paragraphs
Sentences
(Range)
Words
(Range)
Characters
(Range)
Range
Range
3.
Среди объектов, вложенных в объект Document на
первом уровне иерархии, коллекции составляют явное
большинство — их 36. Каждая коллекция содержит
элементы одного класса. Как правило, имя класса
коллекции строится как множественное число (по
правилам английского языка) от имени класса элемента
коллекции. Например, коллекция Documents содержит
объекты класса Document, а коллекция Paragraphs
содержит объекты класса Paragraph. В тех случаях, когда
это правило не выполняется, в скобках указано имя
класса для объектов, входящих в коллекцию. Заметьте,
например, что коллекции предложений, слов и символов
документа Word состоят из объектов класса Range.
4. Работа с документами
Когда открывается приложение, создается коллекция
документов Documents, содержащая открытые документы.
Если приложение Word создается в момент открытия
документа Word, (объект Word.Application может быть создан
и в программном проекте другого приложения, например
Excel), то в начальный момент коллекция содержит минимум
один новый или ранее существовавший документ.
Программно новый документ добавляется в коллекцию
методом Add, а уже существующий — методом Open объекта
Documents. Применяя метод Open, надо обязательно
указывать имя, а точнее путь к открываемому файлу.
Чтобы добраться до нужного документа в коллекции,
достаточно указать его индекс — имя файла, хранящего
документ, — или его порядковый номер в коллекции. Для той
же цели можно использовать и метод Item, но обычно он
опускается. Метод Save позволяет сохранить документ, а
метод Close, сохраняя документ в файле, закрывает его и
удаляет из коллекции.
5. Доступ к объекту Document
В Word каждый документ является объектом типа Document, а все
открытые документы текущей сессии Word образуют коллекцию
Documents. Для ссылок на конкретный документ следует использовать
коллекцию Documents объекта Application
Documents(Index)
Index может быть:
Численным выражением, представляющим документ, который
необходимо использовать. Число 1 означает первый документ,
открытый в ходе текущей рабочей сессии, 2 — второй открытый
документ и так далее.
Строковым выражением, представляющим имя открытого
документа, который нужно использовать.
Наиболее распространенным и в большинстве случаев наиболее
удобным способом использования Index является текстовая строка.
Documents(“Мой документ”).Activate
6. Создание нового документа
Documents.Add([Template] , [NewTemplate])
Оба аргумента метода Documents.Add не являются
обязательными. Template представляет строковое
выражение, задающее имя шаблона документа, на
котором должен основываться новый документ. Аргумент
Template наряду с именем файла может включать имя
диска и путь к папке. Включать полный путь необходимо,
если шаблон документа расположен в папке, отличной от
той, в которой по умолчанию хранятся шаблоны Word.
Если вы опустите аргумент Template, Word создаст новый
документ, основываясь на шаблоне Normal.dot. Аргумент
NewTemplate может быть любым выражением типа
Boolean. Если он равен значению True, Word создает
новый документ в виде шаблона. По умолчанию
значение этого аргумента равно значению False.
7. Сохранение нового документа
Object.SaveAs([FileName], [FileFormat], . . .)
Object — любая допустимая ссылка на открытый
документ типа Document. Необязательный аргумент
FileName — строковое выражение, указывающее новое
имя, под которым должен быть сохранен документ.
Необязательный аргумент FileFormat определяет
формат, в котором будет сохранен документ. Аргумент
FileFormat может быть любой из встроенных констант
(определенных в классе wdSaveFormat):
wdFormatDocument, wdFormat-DOSText,
wdFormatDOSTextLineBreaks, wdFormatEncodedText,
wdFormat-FilteredHTML, wdFormatHTML, wdFormatRTF,
wdFormatTemplate, wdFormatText,
wdFormatTextLineBreaks, wdFormatUnicodeText или
wdFormatWebArchive.
ActiveDocument.SaveAs FileName:=»D:Документ», _
FileFormat:=wdFormatDocument
8. Открытие и закрытие документов
Documents.Open(Filename)
Аргумент Filename является текстовой строкой,
представляющей полный путь к документу: логический
диск, папка и имя файла.
Sub OpenTest()
‘ Предлагает открыть документ и затем его открывает
Dim DocumentName As String
DocumentName = _
InputBox(«Введите полный путь к документу»)
If DocumentName <> «» Then
Documents.Open FileName:=DocumentName
End If
End Sub
9. Открытие и закрытие документов
Завершив работу с документом, надо закрыть его для
освобождения памяти и других системных ресурсов. Закрыть
документ можно, используя одну из следующих форм метода
Close.
Object.Close([SaveChanges][,OriginalFormat] [,. . .])
Аргумент SaveChanges может быть равен одной из
перечисленных ниже встроенных констант (определенных в
классе wdSaveOptions): wdDoNotSaveChanges (документ
закрывается без сохранения изменений),
wdPromptToSaveChanges (Word запрашивает, нужно ли
сохранять изменения), wdSaveChanges (изменения
сохраняются). Аргумент OriginalFormat определяет формат
сохранения для документа и может быть одной из следующих
wdOriginalFormat-констант: wdOriginalDocument Format,
wdPromptUser или wdWordDocument.
10.
Текст — это основа большинства документов. Его можно
структурировать, оперируя различными единицами при решении тех
или иных задач преобразования текста. Минимальная единица текста
— символ. Дальше идут слова, предложения, абзацы. Более крупными
частями текста являются параграфы. Количественными единицами
текста являются страницы.
Классы Characters, Words, Sentences, Paragraphs позволяют работать с
последовательностями (коллекциями) символов, слов, предложений,
абзацев. Может показаться удивительным, но классов,
соответствующих таким элементам, как символ, слово или
предложение, нет. Элементом коллекций Characters, Words и
Sentences является объект класса Range. Это один из самых важных
объектов, необходимых для понимания работы с текстами. Объект
Range позволяет работать как с одним символом, так и с их
последовательностью. Документы, абзацы, разделы, — все они имеют
метод или свойство Range, возвращающее объект Range,
представляющий область, связанную с объектом, вызвавшим метод
(свойство) Range. Эту область можно рассматривать как интервал,
задаваемый первым и последним символом текста данной области.
Поэтому работа с текстом, так или иначе, ведется через методы и
свойства объекта Range.
11. Characters
Коллекция символов. В зависимости от того, из
какого объекта вы получили доступ к коллекции,
она может содержать некоторые или все символы
области документа. Объект для одного символа
отсутствует. Каждый элемент коллекции
Characters является объектом типа Range,
включающим только один символ.
12. Words
Коллекция слов. В зависимости от того, из
какого объекта вы получили доступ к
коллекции Words, она может содержать
некоторые или все слова области
документа. В Word отсутствует объект слово.
Каждый элемент коллекции Words является
объектом типа Range, включающим только
одно слово. (Слово — это группа символов,
отделенная пробелами или знаками
пунктуации.)
13. Sentences
Коллекция предложений. В зависимости от того,
из какого объекта вы получили доступ к
коллекции Sentences, она может содержать
некоторые или все предложения области
документа. Подобно коллекциям Characters и
Words объект одно предложение отсутствует.
Каждый элемент коллекции Sentences является
объектом типа Range , включающим
единственное предложение.
14. Paragraphs
Коллекция абзацев. В зависимости от того, Paragraphsколлекция какого именно объекта используется, может
содержать некоторые или все абзацы области
документа. Каждый элемент коллекции Paragraphs
является объектом типа Paragraph. Вы можете
использовать свойства и методы объекта Paragraph
для изменения стиля, увеличения или уменьшения
интервалов и других, связанных с абзацем задач.
Каждый объект типа Paragraph, в свою очередь,
содержит объект типа Range, который содержит текст
параграфа.
15. Range
Представленный обзор коллекций показывает, что доступ к
тексту для каждой из этих коллекций, в конечном счете,
осуществляется с помощью объекта Range. Объект Range
является одним из основных объектов Word и появляется в
виде свойства во многих других объектах Word.
Каждый объект Range представляет непрерывную часть
области документа, определяемую положениями начального и
конечного символов. Объект Range может не содержать ни
одного, содержать один или много символов и может
представлять весь документ или любую его часть. Используя
методы и свойства объекта Range, можно добавлять текст,
форматировать его, добавлять поля или выполнять любые
другие действия. Объект Range также предоставляет методы,
позволяющие задавать или изменять диапазон символов, на
который ссылается конкретный объект Range, и определять, в
каком текстовом блоке документа находится диапазон.
16. Selection
Объект Selection представляет курсор вставки в окне,
отображающем определенную часть документа. В
каждом окне документа может находиться только один
объект Selection, и только один объект Selection может
быть активным в любой конкретный момент времени.
Объект Selection используется для того, чтобы
добавлять текст в место, на которое указывает курсор
вставки, применять форматирование, выделять текст для
копирования или вырезания, или любой другой задачи,
которую можно выполнить интерактивно с помощью
курсора вставки, вводя текст, щелкая, или перетаскивая
его. Объект Selection может быть как непрерывной
областью документа, так и сжатым до курсора вставки.
17. Ссылка на диапазон
Существует несколько различных способов сослаться на
конкретный диапазон документа. Можно задать диапазон
непосредственно или получить его при помощи одной из
коллекций документа: Paragraphs, Sentences или
Words.
Для того чтобы задать диапазон в области основного
текста документа непосредственно, воспользуйтесь
методом Range, применив следующую синтаксическую
конструкцию:
Object.Range(Start, End)
Здесь Object — любая допустимая ссылка на объект
Document. Start и End — целые значения типа Long,
задающие положение начального и конечного символов
диапазона, соответственно. Метод Range возвращает
объект Range.
Set AnyRange = ActiveDocument.Range(Start:=0, End:=20)
18. Ссылка на диапазон
Ссылку на диапазон можно получить и с
помощью свойства Range любой из коллекций
диапазона, упоминавшихся ранее: Paragraphs,
Sentences или Words.
ActiveDocument.Sentences(3)
ActiveDocument.Paragraphs(2)
ActiveDocument.Words(10)
ActiveDocument.Paragraphs(2).Range.Words(1)
ActiveDocument. Sentences(1).Words(1)
19. Методы объекта Range
Изменение области, на которую ссылается диапазон
SetRange :
Object.SetRange(Start, End)
Здесь Object — любая допустимая ссылка на объект
Range или Selection. Оба аргумента Start и End
являются обязательными, каждый из них является
целым числом типа Long, представляющим новые
позиции начального и конечного символов
диапазона, соответственно.
Set MyRange = ActiveDocument.Words(1)
AnyRange.SetRange Start:=AnyRangeStart, _
End:= ActiveDocument.Words(2).End
20. Методы объекта Range
Метод MoveStart изменяет положение начального символа
диапазона, в то время как метод MoveEnd изменяет
положение конечного символа диапазона. Для увеличения
или уменьшения области, на которую ссылается диапазон, вы
можете перемещать конечную точку диапазона, используя
методы MoveEnd или MoveStart при помощи следующих
синтаксических форм:
Object.MoveEnd([Unit], [Count]) Object.MoveStart([Unit],
[Count])
Object — любая допустимая ссылка на объект Range. Как
для метода MoveEnd, так и для метода MoveStart
аргументы Unit и Count являются необязательными.
Аргумент Unit задает элемент, для которого будет
изменяться начало или конец диапазона. Unit может
быть одной из констант wdUnits. Если вы опустите
аргумент Unit, методы MoveStart и MoveEnd по
умолчанию будут использовать wdCharacter.
21. Метод MoveStart и MoveEnd
Аргумент Count — число элементов (units), на которое
должна быть сдвинута конечная точка. Если вы
используете для аргумента Count положительное число,
конечная точка перемещается в документе вперед, если
вы используете для аргумента Count отрицательное
число, конечная точка перемещается назад.
Пример:
(AnyRange является объектной переменной,
содержащей ссылку на объект Range):
AnyRange.MoveStart Unit:=wdParagraph, Count:= -1
AnyRange.MoveEnd Unit:=wdWord, Count:=-2
AnyRange.MoveEnd Count:=6
AnyRange.MoveStart Count:=8
22. Методы объекта Range
Чтобы расширить диапазон, от его текущего
значения, до размеров, включающих следующий,
больший по величине компонент документа,
используется метод Expand
Object.Expand([Unit] )
Здесь Object — представляет любую допустимую
ссылку на объект Range или Selection.
Необязательный аргумент Unit определяет
элемент, до которого расширяется диапазон, и
может быть равен одной из констант WdUnits.
Если вы опустите аргумент Unit, метод Expand
использует по умолчанию значение константы
wdWord.
23. Методы объекта Range
Фрагмент кода, выделяющий десятое
предложение документа и затем расширяющий
диапазон для включения в него всего абзаца, в
котором находится десятое предложение
(MyRange объектная переменная):
Set MyRange = ActiveDocument.Sentences(10)
MyRange.Expand Unit:=wdParagraph
24. Объект Selection
Используя объект Selection можно создать VBAпрограмму, выполняющую с курсором вставки любые
операции, которые можно выполнить в Word
интерактивно: добавить текст, переместить кур сор
вставки, выделить текст и другие.
Выполнить ссылку на объект Selection очень просто:
необходимо только использовать свойство Selection
объектов Application.
В любой момент может быть активным только один
объект Selection и в любом окне, отображающем
документ, может находиться только один объект
Selection.
Можно связать объект Selection с любым диапазоном,
используя метод Select объекта Range:
MyRange.Select
25. Примеры макросов
26. Вставка разрыва страницы после третьего абзаца
Sub разрыв()
Selection.Move Unit:=wdParagraph, Count:=3
Selection.InsertBreak Type:=wdPageBreak
End Sub
27. Заменить символа на конец абзаца
Заменить символа на конец абзаца
Sub замена()
n = ThisDocument.Range.Characters.Count
For i = 1 To n
c = ThisDocument.Range.Characters(i)
If Asc(c) = 11 Then
ThisDocument.Range.Characters(i) = Chr(13)
End If
Next
End Sub
28. Удаление пустых абзацев
Sub abzacs()
Dim k As Integer, i As Long
k = ActiveDocument.Paragraphs.Count
i=1
Do While i <= k
If ActiveDocument.Paragraphs(i).Range.Characters.Count = 1 _
Then
ActiveDocument.Paragraphs(i).Range.Characters(1).Delete
k = ActiveDocument.Paragraphs.Count
Else
i=i+1
End If
Loop
End Sub
29. Макрос FromEToR, переводящего «английский ошибочный» текст в правильный русский
EdoBedo 1 / 1 / 0 Регистрация: 27.03.2015 Сообщений: 36 |
||||
1 |
||||
Создание структуры на первой странице документа15.05.2015, 09:27. Показов 2230. Ответов 5 Метки нет (Все метки)
Здравствуйте, есть много документов word, в каждом много заголовков, но нет структуры(содержания) можно ли сделать макрос, чтобы создавать структуру документа автоматически на первом листе? Добавлено через 22 минуты
Он работает, но если я буду выполнять на другом компьютере то путь придется менять. От пути как можно избавится?
0 |
KoGG 5590 / 1580 / 406 Регистрация: 23.12.2010 Сообщений: 2,366 Записей в блоге: 1 |
||||
15.05.2015, 11:15 |
2 |
|||
Сообщение было отмечено EdoBedo как решение РешениеНадо было записать макрос другим способом, без использования шаблона:
1 |
1 / 1 / 0 Регистрация: 27.03.2015 Сообщений: 36 |
|
15.05.2015, 13:52 [ТС] |
3 |
KoGG, Спасибо, работает! Добавлено через 1 час 59 минут
0 |
KoGG 5590 / 1580 / 406 Регистрация: 23.12.2010 Сообщений: 2,366 Записей в блоге: 1 |
||||
15.05.2015, 14:29 |
4 |
|||
Сообщение было отмечено EdoBedo как решение Решение
1 |
EdoBedo 1 / 1 / 0 Регистрация: 27.03.2015 Сообщений: 36 |
||||
15.05.2015, 15:19 [ТС] |
5 |
|||
KoGG, мой код ниже, выводит выбранный заголовок в новый документ, я вставил ваш код, и при выполнение его, сколько я заголовков вывел, столько и дублируется содержание страниц.
0 |
5590 / 1580 / 406 Регистрация: 23.12.2010 Сообщений: 2,366 Записей в блоге: 1 |
|
15.05.2015, 15:58 |
6 |
Сообщение было отмечено EdoBedo как решение РешениеМой блок и wd.Save надо вставить в конце после Next и перед wd.Close
1 |
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