Vba word структура документа

2006 г.

Word и его объекты
Лекция из курса «Основы офисного программирования и документы Word»

Биллиг Владимир Арнольдович
Интернет-Университет Информационных Технологий, INTUIT.ru

Назад Оглавление Вперёд

Работа с документами и класс Document

Вспомним, что мы уже знаем о документах Word. Когда открывается приложение, создается коллекция документов Documents, содержащая открытые документы. Если приложение Word создается в момент открытия документа Word, (заметим, что объект Word.Application может быть создан и в программном проекте другого приложения, например, Excel), то в начальный момент коллекция содержит минимум один новый или ранее существовавший документ. Программно новый документ добавляется в коллекцию методом Add, а уже существующий — методом Open объекта Documents. Чтобы добраться до нужного документа в коллекции, достаточно указать его индекс — имя файла, хранящего документ, — или его порядковый номер в коллекции. Для той же цели можно использовать и метод Item, но обычно он опускается. Метод Save позволяет сохранить документ, а метод Close, сохраняя документ в файле, закрывает его и удаляет из коллекции.

При применении метода Open обязательно указывать имя, а точнее путь к открываемому файлу. Однако задание конкретного пути всегда чревато неприятностями, поскольку при любом переносе системы местоположение файла может измениться. В одной из предыдущих процедур этой лекции WorkWithSearch я демонстрировал возможность использования свойства Path для нахождения пути к документу. Часто предпочтительнее предоставить пользователю возможность выбирать открываемый файл, хранящий документ. Для этого, конечно, можно использовать объект Dialog, при вызове методов которого открывается соответствующее диалоговое окно.

Вот еще один пример использования уже знакомого нам объекта Dialog FileOpen:

Public Sub WorkWithDialogs()
Dim dlg As Dialog
   'Открытие документа в диалоге с пользователем
   'Метод  Show ведет диалог и открывает документ
   Dialogs(wdDialogFileOpen). Show

   'Метод  Display ведет диалог, не открывая документа,
   'но позволяя получить имя файла.
   Set dlg = Dialogs (wdDialogFileOpen)
   If dlg. Display = -1 Then 'нажата кнопка Open
      Documents.Open FileName:=dlg.Name
   End If
End Sub

Листинг 1: html, txt

Теперь подробнее рассмотрим свойства и методы документа — объекта класса Document. Это основной объект, свойства, события и методы которого следует знать основательно. Объект Document не менее сложен, чем объект Application.

Коллекции объекта Document

Рассмотрим список коллекций, входящих в состав объекта Document:

  1. Bookmarks
  2. Characters (Range)
  3. CommandBars
  4. Comments
  5. DocumentProperties
  6. Endnotes
  7. Fields
  8. Footnotes
  9. FormFields
  10. Frames
  11. Hyperlinks
  12. Indexes
  13. InlineShapes
    • HorizontalLineFormat
  14. ListParagraphs
  15. Lists
    • ListParagraphs
    • Range
  16. ListTemplates
    • ListLevels
    • Font
  17. Paragraphs
  18. ProofreadingErrors (Range)
  19. Revisions
  20. ReadabilityStatistics
  21. Scripts
  22. Sections
  23. Sentences (Range)
  24. Shapes
  25. StoryRanges (Range
  26. Styles
  27. Subdocuments
  28. Tables
  29. TablesOfAuthoritiesCategories (TableOfAuthoritiesCategory)
  30. TablesOfAuthorities (TableOfAuthorities)
  31. TablesOfContents (TableOfContents)
  32. TablesOfFigures (TableOfFigures)
  33. Variables
  34. Versions
  35. Windows
  36. Words (Range)

Среди объектов, вложенных в объект Document на первом уровне иерархии, коллекции составляют явное большинство — их 36. Каждая коллекция содержит элементы одного класса. Как правило, имя класса коллекции строится как множественное число (по правилам английского языка) от имени класса элемента коллекции. Например, коллекция Documents содержит объекты класса Document, а коллекция Paragraphs содержит объекты класса Paragraph. В тех случаях, когда это правило не выполняется, в скобках указано имя класса для объектов, входящих в коллекцию. Заметьте, например, что коллекции предложений, слов и символов документа Word состоят из объектов класса Range.

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

Простые объекты, вложенные в объект Document

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

  1. Email
    • EmailAuthor
  2. Envelope
  3. Frameset
  4. HTMLProject
  5. LetterContent
  6. MailMerge
    • MailMergeDataSource
    • MailMergeFields
  7. PageSetup
    • LineNumbering
    • TextColumns
  8. Range
  9. RoutingSlip
  10. VBProject
  11. WebOptions

В Office 2000 у объекта Document появились три новых объекта в сравнении с предыдущей версией. Это объекты: Email, Frameset и WebOptions.

Итак, только на верхнем уровне в объект Document встроено около 50 объектов, определяющих его свойства. Большинство из этих объектов устроены достаточно сложно, — почти все содержат коллекции внутри себя. Попробуем упорядочить эту «тьму» объектов.

Классы, задающие структуризацию текста документа

Текст — это основа большинства документов. Его можно структурировать, оперируя различными единицами при решении тех или иных задач преобразования текста. Минимальной единицей текста является символ. Другие естественные единицы — это слова, предложения, абзацы. Более крупными частями текста являются страницы, параграфы и главы. Важно уметь оперировать с последовательностями таких единиц. Какие же классы объектов предоставляет Word для этой цели?

Классы Characters, Words, Statements, Paragraphs позволяют работать с последовательностями (коллекциями) символов, слов, предложений, абзацев. Может показаться удивительным, но классов, соответствующих таким элементам, как символ, слово или предложение, нет. Элементом коллекций Characters, Words и Statements является объект класса Range. Это один из самых важных объектов, необходимых для понимания работы с текстами. Объект Range позволяет работать как с одним символом, так и с последовательностью символов. Документы, поддокументы, абзацы, разделы — все они имеют метод или свойство Range, возвращающее объект Range, представляющий область, связанную с объектом, вызвавшим метод (свойство) Range. Эту область можно рассматривать как интервал, задаваемый первым и последним символом текста данной области. Поэтому работа с текстом, так или иначе, ведется через методы и свойства объекта Range.

Чуть позже мы продолжим знакомство с классами Characters, Words, Statements, Paragraphs и Range.

Документ и его части

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

Разделы и поддокументы

Сейчас мы обсудим более подробно две коллекции Sections и SubDocuments, задающие разделы документа и поддокументы, входящие в состав основного документа. Почти в каждом текстовом документе можно встретить символы, слова, предложения и абзацы. Что же касается более крупных единиц текста, то в разных документах они называются по-разному. Чаще всего, приходится встречаться со страницами и листами документа, но используются и такие термины как параграфы, главы, части, разделы документа. В объектной модели Word, к сожалению, нет таких объектов как Page и Pages, соответствующих таким естественным единицам текстового документа как страницы документа и их коллекции. В документе Word следующей крупной единицей после абзаца является раздел — объект класса Section. Все разделы одного документа составляют коллекцию Sections.

Что же такое раздел, как и для чего он создается? Раздел в документе всегда можно создать руками, для чего достаточно вставить символ разрыва документа — Section break, вызвав пункт Break из меню Insert. Символ разрыва может быть разного типа, задавая следующую страницу, четную или нечетную страницу, столбец и другие виды раздела. Таким образом, можно руками разбить документ на страницы, вставляя подходящие символы разрыва в нужных местах. В этом случае разделы будут выступать в роли страниц документа. Иногда разделы создаются автоматически, например, при представлении некоторой части документа в виде нескольких столбцов. Часть документа, представленная в виде нескольких столбцов, представляет отдельный раздел.

При программной работе разделы можно создавать двояко, используя метод InsertBreak, которым обладают объекты Range и Selection, или вызывая метод Add коллекции Sections. Метод Add(Range, Start) имеет два параметра:

  • Range задает область, начинающую новый раздел, или, что тоже, область, перед началом которой будет вставлен символ разрыва.
  • Start задает тип символа разрыва.

Заметьте, в методе InsertBreak указывается только второй параметр, поскольку новый раздел начинается с объекта Range (Selection), вызвавшего метод.

Рассмотрим пример, в котором документ с именем DocThree, программно разбивается на разделы. Наше разбиение гарантирует, что соответствующие главы и параграфы документа находятся в отдельных разделах, что облегчает дальнейшую работу с ними. Вот как выглядит процедура, решающая эту задачу:

Листинг 1: html, txt

В этой процедуре показано, как происходит выделение раздела, подсчет некоторых характеристик раздела, например, подсчет числа абзацев, предложений и символов раздела. Показано, как создаются разделы документа, используя как метод InsertBreak так и метод Add коллекции Sections. Метод Add вызывается как с явно заданными параметрами, так и параметрами, задаваемыми по умолчанию.

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

Листинг 1: html, txt

Наш документ DocThree вначале не имел поддокументов. Этот документ предварительно разбивается на разделы, если это еще не было сделано, а затем в нем выделяется поддокумент, начиная с третьего раздела и кончая последним разделом документа. Метод AddFromRange класса SubDocuments создает поддокумент, выделяя из главного документа область, заданную параметром Range.

Заметьте, область, задаваемая параметром Range, должна начинаться с заголовка, имеющего один из стандартных стилей Heading. При сохранении документа, поддокумент удаляется из документа и сохраняется в отдельном файле. Имя файла строится автоматически, используя текст заголовка, начинающего поддокумент. В главном документе остается ссылка на поддокумент. При желании его всегда можно слить с главным, но с ним можно работать и как с независимым документом. Вот как выглядит наш главный документ после того, как в нем выделен поддокумент:

Главный документ с выделенным поддокументом
Рис. 1.9.  Главный документ с выделенным поддокументом

Назад Оглавление Вперёд

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 минуты
запись макросов вот что выводит:

Visual Basic
1
2
3
4
    Application.Templates( _
        "C:UsersteAppDataRoamingMicrosoftDocument Building Blocks104915Built-In Building Blocks.dotx" _
        ).BuildingBlockEntries("Автособираемое оглавления 1").Insert Where:= _
        Selection.Range, RichText:=True

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



0



KoGG

5590 / 1580 / 406

Регистрация: 23.12.2010

Сообщений: 2,366

Записей в блоге: 1

15.05.2015, 11:15

2

Лучший ответ Сообщение было отмечено EdoBedo как решение

Решение

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

Visual Basic
1
2
3
4
5
6
7
8
9
With ActiveDocument
    .TablesOfContents.Add Range:=Selection.Range, RightAlignPageNumbers:= _
        True, UseHeadingStyles:=True, UpperHeadingLevel:=1, _
        LowerHeadingLevel:=3, IncludePageNumbers:=True, AddedStyles:="", _
        UseHyperlinks:=True, HidePageNumbersInWeb:=True, UseOutlineLevels:= _
        True
    .TablesOfContents(1).TabLeader = wdTabLeaderDots
    .TablesOfContents.Format = wdIndexIndent
End With



1



1 / 1 / 0

Регистрация: 27.03.2015

Сообщений: 36

15.05.2015, 13:52

 [ТС]

3

KoGG, Спасибо, работает!

Добавлено через 1 час 59 минут
KoGG, еще вопрос, вставил код в форму документа, он вставляет на первую страницу вместе с текстом, как сделать чтобы это содержание было только на первой странице, а текст и остальное на следующих



0



KoGG

5590 / 1580 / 406

Регистрация: 23.12.2010

Сообщений: 2,366

Записей в блоге: 1

15.05.2015, 14:29

4

Лучший ответ Сообщение было отмечено EdoBedo как решение

Решение

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Selection.HomeKey wdStory
With ActiveDocument
    .TablesOfContents.Add Range:=Selection.Range, RightAlignPageNumbers:= _
        True, UseHeadingStyles:=True, UpperHeadingLevel:=1, _
        LowerHeadingLevel:=3, IncludePageNumbers:=True, AddedStyles:="", _
        UseHyperlinks:=True, HidePageNumbersInWeb:=True, UseOutlineLevels:= _
        True
    .TablesOfContents(1).TabLeader = wdTabLeaderDots
    .TablesOfContents.Format = wdIndexIndent
End With
Selection.Collapse Direction:=wdCollapseEnd
Selection.InsertBreak Type:=wdPageBreak



1



EdoBedo

1 / 1 / 0

Регистрация: 27.03.2015

Сообщений: 36

15.05.2015, 15:19

 [ТС]

5

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

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 Dim wd As Document
  Dim wd_temp As Document
    Set wd = Documents.Add
    wd.Save
    For i = 0 To ListBox3.ListCount - 1
        Set wd_temp = Documents.Open(ListBox3.List(i, 2) & "" & ListBox3.List(i, 1))
        wd_temp.Activate
        Selection.GoTo what:=wdGoToHeading, which:=wdGoToAbsolute, Count:=ListBox3.List(i, 3)
        Selection.ExtendMode = True
        Selection.GoTo what:=wdGoToHeading, which:=wdGoToNext
        Selection.Copy
           wd.Activate
     With wd.PageSetup
           .MirrorMargins = True
           .TwoPagesOnOne = False
           .SectionStart = wdSectionNewPage
           .OddAndEvenPagesHeaderFooter = True
           .DifferentFirstPageHeaderFooter = False
     End With
     wd.Sections(1).PageSetup.DifferentFirstPageHeaderFooter = True
        Selection.EndKey Unit:=wdStory
        Selection.Paste
 
              Selection.HomeKey wdStory
With wd
    .TablesOfContents.Add Range:=Selection.Range, RightAlignPageNumbers:= _
        True, UseHeadingStyles:=True, UpperHeadingLevel:=1, _
        LowerHeadingLevel:=3, IncludePageNumbers:=True, AddedStyles:="", _
        UseHyperlinks:=True, HidePageNumbersInWeb:=True, UseOutlineLevels:= _
        True
    .TablesOfContents(1).TabLeader = wdTabLeaderDots
    .TablesOfContents.Format = wdIndexIndent
End With
Selection.Collapse Direction:=wdCollapseEnd
Selection.InsertBreak Type:=wdPageBreak
    wd.Save
    Call wd.Sections.Last.Range.Find.Execute(FindText:="^b", _
                                                     ReplaceWith:="", _
                                                     Replace:=wdReplaceOne)
    
    wd.Save
        wd_temp.Close SaveChanges:=wdDoNotSaveChanges
    Next
   wd.Close



0



5590 / 1580 / 406

Регистрация: 23.12.2010

Сообщений: 2,366

Записей в блоге: 1

15.05.2015, 15:58

6

Лучший ответ Сообщение было отмечено EdoBedo как решение

Решение

Мой блок и wd.Save надо вставить в конце после Next и перед wd.Close



1



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

Понравилась статья? Поделить с друзьями:
  • Vba word список папок
  • Vba word сохранить как pdf
  • Vba word сохранить все
  • Vba word создать папку
  • Vba word создание таблиц