Создание нового документа Word или открытие существующего из кода VBA Excel. Методы Documents.Add и Documents.Open. Сохранение и закрытие документа.
Работа с Word из кода VBA Excel
Часть 2. Создание и открытие документов Word
[Часть 1] [Часть 2] [Часть 3] [Часть 4] [Часть 5] [Часть 6]
Новый документ Word создается из кода VBA Excel с помощью метода Documents.Add:
Sub Test1() Dim myWord As New Word.Application Dim myDocument As Word.Document Set myDocument = myWord.Documents.Add myWord.Visible = True End Sub |
Переменную myDocument можно объявить с типом Object, но тогда не будет ранней привязки к типу Word.Document и подсказок при написании кода (Auto List Members).
Открытие существующего документа
Существующий документ Word открывается из кода VBA Excel с помощью метода Documents.Open:
Sub Test2() Dim myWord As New Word.Application Dim myDocument As Word.Document Set myDocument = _ myWord.Documents.Open(«C:Документ1.docx») myWord.Visible = True End Sub |
Замените в этой процедуре строку «C:Документ1.docx» на адрес своего файла.
Подключение к открытому документу
Присвоение переменной ссылки на существующий экземпляр Word.Application осуществляется в VBA Excel с помощью функции GetObject:
Sub Test3() Dim myWord As Object, myDoc As Word.Document On Error GoTo Instr Set myWord = GetObject(, «Word.Application») Set myDoc = myWord.Documents(«Документ1.docx») myDoc.Range.InsertAfter «Добавляем новый текст, подтверждающий подключение к открытому документу.» Exit Sub Instr: MsgBox «Произошла ошибка: « & Err.Description End Sub |
Если открытого приложения Word нет, выполнение функции GetObject приведет к ошибке. Также произойдет ошибка, если не будет найден указанный документ (в примере — «Документ1.docx»).
Сохранение и закрытие документа
Сохранение нового документа
Чтобы сохранить из кода VBA Excel новый документ Word, используйте метод SaveAs2 объекта Document:
myDocument.SaveAs2 («C:Документ2.docx») |
Замените «C:Документ2.docx» на путь к нужному каталогу с именем файла, под которым вы хотите сохранить новый документ.
Сохранение изменений в открытом документа
Сохраняйте изменения в существующем документе с помощью метода Document.Save или параметра SaveChanges метода Document.Close:
‘Сохранение изменений документа myDocument.Save ‘Сохранение изменений документа ‘при закрытии myDocument.Close ‘по умолчанию True myDocument.Close True myDocument.Close wdSaveChanges ‘Закрытие документа без ‘сохранения изменений myDocument.Close False myDocument.Close wdDoNotSaveChanges |
Закрытие любого сохраненного документа
Метод Document.Close закрывает документ, но не приложение. Если работа с приложением закончена, оно закрывается с помощью метода Application.Quit.
Сначала я копирую текстовый документ doc1 в новый текстовый документ с его форматированием с помощью кнопки в пользовательской форме. Во-вторых, я вставляю в конец этого текстового документа (заполненного doc1) новый текстовый документ doc2 (doc1 и doc2 имеют текст и таблицу и разные цвета). Каждый раз, когда я нажимал кнопку в другой пользовательской форме, чтобы поместить doc2, я теряю формат doc2.
Вот мой код:
Dim docSource As Document
Dim docTarget As Document
Set docTarget = ActiveDocument
Set docSource = Documents.Open(strFilename)
' Add the content of docSource to docTarget
docTarget.Range.Collapse Direction:=wdCollapseEnd
docTarget.Content.InsertAfter (docSource.Range.FormattedText)
docSource.Close (0)
Я просто не хочу терять формат, исходящий из другого текстового документа (doc2). В Интернете много информации, но я не нашел той, которая могла бы быть полезной.
2 ответа
Лучший ответ
FWIW наиболее просто для вставки одного документа в другой — это использовать метод InsertFile
, так что вставляемый документ даже не нужно открывать.
Проблема с подходом в вопросе заключается в следующем
docTarget.Content.InsertAfter (docSource.Range.FormattedText)
Необходимо использовать свойство FormattedText
с обеих сторон. Также лучше использовать объекты Range
, по крайней мере, на «целевой» стороне, поскольку InsertAfter
не может работать вместе с FormattedText
. (CollapseEnd
ничего не делает в коде вопроса, потому что он не применяется к независимому объекту Range
.)
Следующее должно работать
Dim rngTarget as Word.Range
Set rngTarget = docTarget.Content
rngTarget.Collapse wdCollapseEnd
rngTarget.FormattedText = docSource.Content.FormattedText
Это будет быстрее, чем при использовании Selection
, и экран не будет «мерцать». Это также оставит нетронутым буфер обмена пользователя.
Единственный случай, когда Selection.Copy
является правильным для использования, — это когда необходимо встретить свойства документа : заголовки, нижние колонтитулы, размер страницы и т. Д. FormattedText
не будет копировать свойства уровня раздела , только свойства Range
.
4
Cindy Meister
3 Фев 2019 в 07:56
Вы должны попробовать использовать специальное копирование и вставку:
Попробуйте следующее:
Sub PasteWithFormat()
Dim docSource As Document
Dim docTarget As Document
Set docTarget = ActiveDocument
Set docSource = Documents.Open(strFileName)
docSource.Select
Selection.HomeKey Unit:=wdStory
Selection.EndKey Unit:=wdStory, Extend:=wdExtend
Selection.Copy
docTarget.Select
Selection.EndKey Unit:=wdStory
Selection.PasteAndFormat (wdPasteDefault)
docSource.Close
Set docSource = Nothing
Set docTarget = Nothing
End Sub
0
IAmNerd2000
2 Фев 2019 в 20:57
title | ms.prod | ms.assetid | ms.date |
---|---|---|---|
Working with Document Objects |
word |
af304f65-6cdd-ff7d-a81f-cce0161f2b47 |
06/08/2017 |
Working with Document Objects
In Visual Basic, the methods for modifying files are methods of the Document object or the Documents collection. This topic includes Visual Basic examples related to the following tasks:
-
Creating a new document
-
Opening a document
-
Saving an existing document
-
Saving a new document
-
Activating a document
-
Determining if a document is open
-
Referring to the active document
Creating a new document
The Documents collection includes all of the open documents. To create a new document, use the Add method to add a Document object to the Documents collection. The following instruction creates a document.
A better way to create a document is to assign the return value to an object variable. The Add method returns a Document object that refers to the new document. In the following example, the Document object returned by the Add method is assigned to an object variable. Then, several properties and methods of the Document object are set. You can easily control the new document using an object variable.
Sub NewSampleDoc() Dim docNew As Document Set docNew = Documents.Add With docNew .Content.Font.Name = "Tahoma" .SaveAs FileName:="Sample.doc" End With End Sub
Opening a document
To open an existing document, use the Open method with the Documents collection. The following instruction opens a document named Sample.doc located in the MyFolder folder.
Sub OpenDocument() Documents.Open FileName:="C:MyFolderSample.doc" End Sub
Saving an existing document
To save a single document, use the Save method with the Document object. The following instruction saves the document named Sales.doc.
Sub SaveDocument() Documents("Sales.doc").Save End Sub
You can save all open documents by applying the Save method to the Documents collection. The following instruction saves all open documents.
Sub SaveAllOpenDocuments() Documents.Save End Sub
Saving a new document
To save a single document, use the SaveAs2 method with a Document object. The following instruction saves the active document as «Temp.doc» in the current folder.
Sub SaveNewDocument() ActiveDocument.SaveAs FileName:="Temp.doc" End Sub
The FileName argument can include only the file name or the complete path (for example, «C:DocumentsTemporary File.doc»).
Closing documents
To close a single document, use the Close method with a Document object. The following instruction closes and saves the document named Sales.doc.
Sub CloseDocument() Documents("Sales.doc").Close SaveChanges:=wdSaveChanges End Sub
You can close all open documents by applying the Close method of the Documents collection. The following instruction closes all documents without saving changes.
Sub CloseAllDocuments() Documents.Close SaveChanges:=wdDoNotSaveChanges End Sub
The following example prompts the user to save each document before the document is closed.
Sub PromptToSaveAndClose() Dim doc As Document For Each doc In Documents doc.Close SaveChanges:=wdPromptToSaveChanges Next End Sub
Activating a document
To change the active document, use the Activate method with a Document object. The following instruction activates the open document named Sales.doc.
Sub ActivateDocument() Documents("Sales.doc").Activate End Sub
Determining if a document is open
To determine if a document is open, you can enumerate the Documents collection by using a For Each…Next statement. The following example activates the document named Sample.doc if the document is open, or opens Sample.doc if it is not currently open.
Sub ActivateOrOpenDocument() Dim doc As Document Dim docFound As Boolean For Each doc In Documents If InStr(1, doc.Name, "sample.doc", 1) Then doc.Activate docFound = True Exit For Else docFound = False End If Next doc If docFound = False Then Documents.Open FileName:="Sample.doc" End Sub
Referring to the active document
Instead of referring to a document by name or by index number—for example, Documents("Sales.doc")
—the ActiveDocument property returns a Document object that refers to the active document (the document with the focus). The following example displays the name of the active document, or if there are no documents open, it displays a message.
Sub ActiveDocumentName() If Documents.Count >= 1 Then MsgBox ActiveDocument.Name Else MsgBox "No documents are open" End If End Sub
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.
Информация о сносках