Vba word добавить документ к документу

Создание нового документа 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.
Информация о сносках

Понравилась статья? Поделить с друзьями:
  • Vba word rows count
  • Vba word диалог выбора файла
  • Vba word replace wdreplaceall
  • Vba word двусторонняя печать
  • Vba word replace all text