Set word createobject word application

Создание нового экземпляра приложения Word из кода VBA Excel или подключение к открытому для работы с документами. Функции CreateObject и GetObject.

Работа с Word из кода VBA Excel
Часть 1. Управление приложением Word
[Часть 1] [Часть 2] [Часть 3] [Часть 4] [Часть 5] [Часть 6]

Создание объекта Word.Application

Экземпляр приложения Word необходим для того, чтобы с его помощью создавать новые документы или открывать существующие для редактирования из кода VBA Excel.

Создать новый экземпляр объекта Word.Application можно при помощи раннего или позднего связывания, используя при позднем связывании функцию CreateObject. Подключиться к открытому экземпляру приложения Word можно только при помощи позднего связывания, используя функцию GetObject.

Раннее связывание приложения Word

Создание нового экземпляра Word.Application и присвоение ссылки на него переменной myWord:

‘Создание экземпляра приложения Word

‘с ранней привязкой одной строкой

Dim myWord As New Word.Application

‘Создание экземпляра приложения Word

‘с ранней привязкой двумя строками

Dim myWord As Word.Application

Set myWord = New Word.Application

Для раннего связывания переменной с объектом Word.Application необходимо подключить в редакторе VBA Excel ссылку на библиотеку Microsoft Word Object Library, если она не подключена. Подключается ссылка в окне «References VBAproject», перейти в которое можно через главное меню редактора: Tools–>References…

Раннее связывание позволяет при написании кода использовать лист подсказок для выбора и вставки свойств и методов привязанных объектов (Auto List Members). Если проект VBA Excel создается на заказ, то, после его завершения, раннее связывание следует заменить на позднее, так как на компьютере пользователя может не оказаться нужной библиотеки, и код работать не будет.

Позднее связывание приложения Word

Создание нового экземпляра Word.Application с помощью функции CreateObject и присвоение ссылки на него переменной myWord:

Dim myWord As Object

Set myWord = CreateObject(«Word.Application»)

Присвоение переменной myWord ссылки на открытый экземпляр приложения Word с помощью функции GetObject:

Dim myWord As Object

Set myWord = GetObject(, «Word.Application»)

Если открытого приложения Word нет, выполнение функции GetObject приведет к ошибке. Чтобы ее избежать, следует предусмотреть создание нового экземпляра Word.Application с помощью функции CreateObject, если открытое приложение не будет найдено (смотрите пример 3).

В программы VBA Excel, работающие с Word, следует включать обработчик ошибок.

Закрытие объекта Word.Application

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

‘отображаем приложение Word

myWord.Visible = True

‘освобождаем переменную от ссылки

Set myWord = Nothing

Если перед завершением процедуры VBA Excel необходимо приложение Word закрыть, используйте метод Quit:

‘закрываем приложение Word

myWord.Quit

‘освобождаем переменную от ссылки

Set myWord = Nothing

Если переменная не содержит ссылку на приложение (myWord = Nothing), метод Quit возвратит ошибку. Чтобы этого не произошло, перед применением метода Quit необходимо проверить наличие ссылки в переменной myWord (смотрите пример 3).

Пример 1
Создаем новый экземпляр объекта Word.Application с ранним связыванием и отображаем его на экране:

Sub Primer1()

Dim myWord As New Word.Application

‘———-

‘блок операторов для создания, открытия

‘и редактирования документов Word

‘———-

myWord.Visible = True

Set myWord = Nothing

End Sub

Запустите код примера 1 на выполнение. Вы увидите появившийся на панели задач ярлык приложения Word. Перейдите на него и закройте приложение вручную.

Пример 2
Создаем новый экземпляр объекта Word.Application с поздним связыванием, отображаем его на экране, останавливаем программу и наблюдаем закрытие приложения методом Quit:

Sub Primer2()

Dim myWord As Object

Set myWord = CreateObject(«Word.Application»)

‘———-

‘блок операторов для создания, открытия

‘и редактирования документов Word

‘———-

myWord.Visible = True

MsgBox «Остановка программы»

myWord.Quit

Set myWord = Nothing

End Sub

Запустите код примера 2 на выполнение. Закройте информационное окно MsgBox и смотрите, как исчезнет с панели задач ярлык приложения Word, созданного перед остановкой кода.

Пример 3
Пытаемся создать ссылку на открытый экземпляр приложения Word с помощью функции GetObject, а если открытого экземпляра нет, создаем новый с помощью функции CreateObject:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

Sub Primer3()

Dim myWord As Object

On Error Resume Next

Set myWord = GetObject(, «Word.Application»)

  If myWord Is Nothing Then

    Set myWord = CreateObject(«Word.Application»)

  End If

On Error GoTo Instr

‘———-

‘блок операторов для создания, открытия

‘и редактирования документов Word

‘———-

myWord.Visible = True

Set myWord = Nothing

Exit Sub

Instr:

  If Err.Description <> «» Then

    MsgBox «Произошла ошибка: « & Err.Description

  End If

  If Not myWord Is Nothing Then

    myWord.Quit

    Set myWord = Nothing

  End If

End Sub

Строка On Error Resume Next передаст управление следующему оператору, если открытого экземпляра программы Word не существует, и выполнение функции GetObject приведет к ошибке. В этом случае будет создан новый экземпляр Word.Application с помощью функции CreateObject.

В код добавлен обработчик ошибок On Error GoTo Instr, который поможет корректно завершить программу при возникновении ошибки. А также он позволит во время тестирования не наплодить большое количество ненужных экземпляров приложения Word. Проверяйте их наличие по Диспетчеру задач (Ctrl+Shift+Esc) и удаляйте лишние.

Строка Exit Sub завершит процедуру, если она прошла без ошибок. В случае возникновения ошибки, будет выполнен код после метки Instr:.

Хитрости »

24 Февраль 2012              91407 просмотров


Иногда бывает необходимо перенести что-то из Excel в другое приложение. Я возьму для примера Word. Например скопировать ячейки и вставить. Обычно мы это так и делаем — скопировали в Excel, открыли Word — вставили. Но сделать это при помощи кода чуть сложнее, хотя если разобраться никаких сложностей нет. Ниже приведен пример кода, который открывает Word, открывает в нем определенный документ, копирует данные из Excel и вставляет в открытый документ Word.

Sub OpenWord()
    Dim objWrdApp As Object, objWrdDoc As Object
    'создаем новое приложение Word
    Set objWrdApp = CreateObject("Word.Application")
    'Можно так же сделать приложение Word видимым. По умолчанию открывается в скрытом режиме
    'objWrdApp.Visible = True
    'открываем документ Word - документ "Doc1.doc" должен существовать
    Set objWrdDoc = objWrdApp.Documents.Open("C:Doc1.doc")
    'Копируем из Excel диапазон "A1:A10"
    Range("A1:A10").Copy
    'вставляем скопированные ячейки в Word - в начала документа
    objWrdDoc.Range(0).Paste
    'закрываем документ Word с сохранением
    objWrdDoc.Close True    ' False - без сохранения
    'закрываем приложение Word - обязательно!
    objWrdApp.Quit
    'очищаем переменные Word - обязательно!
    Set objWrdDoc = Nothing: Set objWrdApp = Nothing
End Sub

Скачать пример:

  Tips_Macro_OpenWord.xls (49,5 KiB, 6 264 скачиваний)

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

Sub Check_OpenWord()
    Dim objWrdApp As Object
    On Error Resume Next
    'пытаемся подключится к объекту Word
    Set objWrdApp = GetObject(, "Word.Application")
    If objWrdApp Is Nothing Then
        'если приложение закрыто - создаем новый экземпляр
        Set objWrdApp = CreateObject("Word.Application")
        'делаем приложение видимым. По умолчанию открывается в скрытом режиме
        objWrdApp.Visible = True
    Else
        'приложение открыто - выдаем сообщение
        MsgBox "Приложение Word уже открыто", vbInformation, "Check_OpenWord"
    End If
End Sub

В принципе, активировать или вызвать(если закрыто) другое приложение Офиса можно одной строкой:

Sub Open_AnotherApp()
    Application.ActivateMicrosoftApp xlMicrosoftWord
End Sub

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

По сути, методами CreateObject и GetObject можно обратиться к любому стороннему приложению(например Internet Explorer). Куда важнее при обращении к этим объектам знать объектную модель того приложения, к которому обращаетесь. Чтобы увидеть свойства и методы объектной модели приложения, можно в редакторе VBA подключить необходимую библиотеку, объявить переменную, назначив ей тип приложения. Покажу на примере того же Word-а.
Для начала открываем меню Tools -References:

Подключаем библиотеку:

Затем объявляем переменную и присваиваем ей тип нужного приложения:

Sub OpenWord()
    Dim objWrdApp As Word.Application
    Set objWrdApp = New Word.Application
    objWrdApp.Visible = True
End Sub

Если теперь в редакторе, внутри этой процедуры в любом месте ниже объявления переменной набрать objWrdApp и точку, то сразу после ввода точки выпадет меню, в котором будут перечислены все доступные методы и свойства этого приложения.

Так же можно нажать F2 и через поиск найти Word и просмотреть все методы и свойства данного приложения.

Метод установки ссылки на библиотеку приложения через ToolsReferences называют еще ранним связыванием. Подобный метод позволяет создать ссылку на приложение быстрее и, как описано выше, предоставляет разработчику доступ к визуальному отображению свойств и методов объекта. Но есть существенный минус: если в своем коде Вы установите ссылку на Word 12 Object Libbary(Word 2007), то на ПК с установленным Word 2003 получите ошибку MISSING, т.к. Word 2003 относится к библиотеке Word 11 Object Libbary. Подробнее можно прочитать в статье Ошибка — Cant find project or library.
Метод же CreateObject еще называется методом позднего связывания. Применяя его не возникнет проблем с MISSING, очень часто возникающих при раннем связывании. Поэтому я рекомендовал бы при разработке использовать раннее связывание для удобства использования свойств и методов(если Вы их не знаете), а перед распространением приложения в коде заменить все именованные константы(типа wdLine) на числовые константы(для wdLine это 5) и применить позднее связывание. Посмотреть числовое значение константы можно просто записав её в коде, начать выполнение кода через F8 и навести курсор мыши на эту константу. Всплывающая подсказка покажет числовое значение. Так же можно отобразить окно Immediate(ViewImmediate Window или сочетание клавиш Ctrl+G), записать вопросительный знак и вставить эту константу и нажать Enter:
?wdLine
ниже будет выведено числовое представление этой константы.
А заменять эти константы их числовыми значениями в случае с поздним связыванием необходимо, т.к. Excel не знает их значений.
Попробую пояснить поподробнее про эти константы и почему их надо заменять какими-то числами: при подключении библиотеки Wordа(Word 12 Object Libbary) мы так же подключаем и все свойства, методы и константы, которые доступны из Wordа. И их использование напрямую становится доступно из Excel и мы можем смело написать что-то вроде wbLine и Excel поймет эту константу. При позднем же связывании мы уже не подключаем библиотеки Word(во избежание ошибок совместимости) и как следствие — методы, свойства и константы Wordа для Excel становятся чем-то неизвестным и не документированным и мы получим ошибку «Variable not defined»(если включена директива Option Explicit) при попытке назначить свойство через wdLine. Если же Option Explicit не включена — то хоть ошибки не будет, но и код будет работать неверно, т.к. для неизвестной для Excel переменной wbLine будет назначено значение 0(Empty). Поэтому и надо все константы другого приложения заменять их числовыми значениями.

Главная ошибка новичка
И хочу так же упомянуть про ошибку, которую очень часто совершают при обращении к одному приложению из другого. Допустим, необходимо скопировать из Word все данные в Excel. Часто начинающие делают это так:

Sub OpenWord()
    Dim objWrdApp As Object, objWrdDoc As Object
    'создаем новое приложение Word
    Set objWrdApp = CreateObject("Word.Application")
    'Можно так же сделать приложение Word видимым. По умолчанию открывается в скрытом режиме
    'objWrdApp.Visible = True
    'открываем документ Word - документ "Doc1.doc" должен существовать
    Set objWrdDoc = objWrdApp.Documents.Open("C:Doc1.doc")
    'Копируем из Word все данные, обращаясь к объекту Range документа
    Range.Copy
    'вставляем скопированное в ячейку А1 активного листа Excel
    ActiveSheet.Paste
    'закрываем документ Word без сохранения
    objWrdDoc.Close False
    'закрываем приложение Word
    objWrdApp.Quit
    'очищаем переменные Word - обязательно!
    Set objWrdDoc = Nothing: Set objWrdApp = Nothing
End Sub

На строке Range.Copy обязательно получите ошибку от VBA, указывающую, что нужен аргумент для объекта. Можно попробовать добавить этот аргумент: Range(1).Copy. Но все равно получим ошибку. Можно, конечно, указать даже ячейки: Range(«A1»).Copy. Но это приведет к тому, что скопирована будет ячейка А1 активного листа Excel.
Все дело в том, что мы хотим скопировать данные из Word-а, выполняя при этом код из Excel. А у Excel тоже есть объект Range с другими аргументами. И если не указать какому приложению, листу или документу принадлежит Range, то по умолчанию он будет отнесен к тому приложению, из которого выполняется код. Т.е. к Excel. Если совсем кратко об этом — всегда надо указывать какому приложению или объекту принадлежит используемый объект или свойство. Правильно код должен выглядеть так:

Sub OpenWord()
    Dim objWrdApp As Object, objWrdDoc As Object
    'создаем новое приложение Word
    Set objWrdApp = CreateObject("Word.Application")
    'Можно так же сделать приложение Word видимым. По умолчанию открывается в скрытом режиме
    'objWrdApp.Visible = True
    'открываем документ Word - документ "Doc1.doc" должен существовать
    Set objWrdDoc = objWrdApp.Documents.Open("C:Doc1.doc")
    'Копируем из Word все данные, обращаясь к объекту Range документа
    'при этом перед Range явно указываем откуда его брать - из документа Word -objWrdDoc("C:Doc1.doc")
    objWrdDoc.Range.Copy
    'вставляем скопированное из Word в активную ячейку активного листа Excel
    ActiveSheet.Paste
    'закрываем документ Word без сохранения
    objWrdDoc.Close False
    'закрываем приложение Word
    objWrdApp.Quit
    'очищаем переменные Word - обязательно!
    Set objWrdDoc = Nothing: Set objWrdApp = Nothing
End Sub

Вместо Range ту же ошибку делают и с Selection(потому что Selection часто присутствует в записанных макрорекордером макросах), т.к. этот объект есть и в Excel и в Word и без явного указания приложения будет относится к приложению, в котором записано.


В приложенном файле код немного отличается от представленных выше — в нем можно посмотреть как вставить текст из ячеек в определенные(созданные заранее) закладки Word-а. Это удобно для создания бланков в Word и заполнения их через Excel

Скачать пример:

  Tips_Macro_OpenWord.xls (49,5 KiB, 6 264 скачиваний)


А в архиве ниже — практически готовое решение заполнения всевозможных бланков Word из Excel. Как это работает. У нас есть таблица Excel с данными для заполнения бланков заявлений на пособия:
Исходная таблица
Обращаю внимание, что в первой строке расположены метки. Они нужны для того, чтобы код мог понять значения какого столбца в какое место шаблона Word должны попасть. А в самом шаблоне Word мы должны проставить эти самые метки:
Шаблон Word с метками
Фигурные скобки сделаны для того, чтобы код 100% искал и заменял только метку в шаблоне, исключая при этом замену случайного текста вне скобок(ведь слово «Должность» может встречаться и само по себе).
А здесь я схематично привел то, как будут происходить замены:
Схема замен
Сначала программа создаст новую папку, в которую и будет сохранять создаваемые файлы(имя папки состоит из даты и времени запуска кода). Далее программа циклом пройдется по каждой строке таблицы, создаст на основании шаблона Word(«Шаблон.doc») новый файл для этой строки, заполнит этот шаблона данными на основании меток, и сохранит созданный файл под новым именем. Сам файл шаблона при этом не изменяется — все метки в нем сохраняются как были настроены до запуска кода. Конкретно в приложенном коде значение для имени нового файла берется из первого столбца «ФИО с инициалами». Но это можно изменить в коде при необходимости. Делается это в этой строке:

'считываем фамилию с инициалами
sWDDocName = .Cells(lr, 1).Value

Что еще важно: файл шаблона Word должен находиться в той же папке, что и файл с кодом. Название файла в приложенном к статье файле должно быть «Шаблон.doc». Но его так же можно изменить, не забыв изменив его в коде в этой строке:

'имя шаблона Word с основным текстом и метками
Const sWDTmpl As String = "Шаблон.doc"

В общем-то, если хоть чуть-чуть разбираетесь, то поменять можно многое. А для тех, кто не разбирается достаточно будет просто создавать метки в файле Word и обозначать ими столбца в таблице Excel. Количество столбцов и строк в таблице код определяет автоматически и при изменении размеров таблицы ничего изменять не надо. Главное, чтобы метки находились в первой строке, вторая строка — заголовок(необязательно), а с третьей строки начинаются данные, которые и используются для наполнения шаблонов.
Скачать пример:

  Автосоздание бланков Word из таблицы Excel.zip (37,6 KiB, 1 470 скачиваний)

Примеры работы с тем же Outlook можно посмотреть в моих статьях:
Как отправить письмо из Excel?
Сохранить вложения из Outlook в указанную папку


Статья помогла? Поделись ссылкой с друзьями!

  Плейлист   Видеоуроки


Поиск по меткам



Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика

Permalink

main

Switch branches/tags

Could not load branches
Nothing to show

{{ refName }}
default

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Go to file

  • Go to file

  • Copy path


  • Copy permalink

Cannot retrieve contributors at this time

Application object (Word)
Remarks
Events
Methods
Properties
See also

274 lines (254 sloc)

13.8 KB


Raw


Blame

Open in GitHub Desktop

  • Open with Desktop

  • View raw


  • Copy raw contents

  • View blame

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

Application object (Word)

vbawd10.chm2416

vbawd10.chm2416

word

Word.Application

d1cf6f8f-4e88-bf01-93b4-90a83f79cb44

06/08/2017

medium

Application object (Word)

Application object (Word)

Represents the Microsoft Word application. The Application object includes properties and methods that return top-level objects. For example, the ActiveDocument property returns a Document object.

Remarks

Use the Application property to return the Application object. The following example displays the user name for Word.

MsgBox Application.UserName

Many of the properties and methods that return the most common user-interface objects—such as the active document (ActiveDocument property)—can be used without the Application object qualifier. For example, instead of writing Application.ActiveDocument.PrintOut, you can write ActiveDocument.PrintOut. Properties and methods that can be used without the Application object qualifier are considered «global.» To view the global properties and methods in the Object Browser, click <globals> at the top of the list in the Classes box. (Also see the Global object.)

Remarks

To use Automation (formerly OLE Automation) to control Word from another application, use the Microsoft Visual Basic CreateObject or GetObject function to return a Word Application object. The following Microsoft Excel example starts Word (if it is not already running) and opens an existing document.

Set wrd = GetObject(, "Word.Application")
wrd.Visible = True
wrd.Documents.Open "C:My DocumentsTemp.doc"
Set wrd = Nothing

Events

  • DocumentBeforeClose
  • DocumentBeforePrint
  • DocumentBeforeSave
  • DocumentChange
  • DocumentOpen
  • DocumentSync
  • EPostageInsert
  • EPostageInsertEx
  • EPostagePropertyDialog
  • MailMergeAfterMerge
  • MailMergeAfterRecordMerge
  • MailMergeBeforeMerge
  • MailMergeBeforeRecordMerge
  • MailMergeDataSourceLoad
  • MailMergeDataSourceValidate
  • MailMergeDataSourceValidate2
  • MailMergeWizardSendToCustom
  • MailMergeWizardStateChange
  • NewDocument
  • ProtectedViewWindowActivate
  • ProtectedViewWindowBeforeClose
  • ProtectedViewWindowBeforeEdit
  • ProtectedViewWindowDeactivate
  • ProtectedViewWindowOpen
  • ProtectedViewWindowSize
  • Quit
  • WindowActivate
  • WindowBeforeDoubleClick
  • WindowBeforeRightClick
  • WindowDeactivate
  • WindowSelectionChange
  • WindowSize
  • XMLSelectionChange
  • XMLValidationError

Methods

  • Activate
  • AddAddress
  • AutomaticChange
  • BuildKeyCode
  • CentimetersToPoints
  • ChangeFileOpenDirectory
  • CheckGrammar
  • CheckSpelling
  • CleanString
  • CompareDocuments
  • DDEExecute
  • DDEInitiate
  • DDEPoke
  • DDERequest
  • DDETerminate
  • DDETerminateAll
  • DefaultWebOptions
  • GetAddress
  • GetDefaultTheme
  • GetSpellingSuggestions
  • GoBack
  • GoForward
  • Help
  • HelpTool
  • InchesToPoints
  • Keyboard
  • KeyboardBidi
  • KeyboardLatin
  • KeyString
  • LinesToPoints
  • ListCommands
  • LoadMasterList
  • LookupNameProperties
  • MergeDocuments
  • MillimetersToPoints
  • Move
  • NewWindow
  • NextLetter
  • OnTime
  • OrganizerCopy
  • OrganizerDelete
  • OrganizerRename
  • PicasToPoints
  • PixelsToPoints
  • PointsToCentimeters
  • PointsToInches
  • PointsToLines
  • PointsToMillimeters
  • PointsToPicas
  • PointsToPixels
  • PrintOut
  • ProductCode
  • PutFocusInMailHeader
  • Quit
  • Repeat
  • ResetIgnoreAll
  • Resize
  • Run
  • ScreenRefresh
  • SetDefaultTheme
  • ShowClipboard
  • ShowMe
  • SubstituteFont
  • ToggleKeyboard

Properties

  • ActiveDocument
  • ActiveEncryptionSession
  • ActivePrinter
  • ActiveProtectedViewWindow
  • ActiveWindow
  • AddIns
  • Application
  • ArbitraryXMLSupportAvailable
  • Assistance
  • AutoCaptions
  • AutoCorrect
  • AutoCorrectEmail
  • AutomationSecurity
  • BackgroundPrintingStatus
  • BackgroundSavingStatus
  • Bibliography
  • BrowseExtraFileTypes
  • Browser
  • Build
  • CapsLock
  • Caption
  • CaptionLabels
  • ChartDataPointTrack
  • CheckLanguage
  • COMAddIns
  • CommandBars
  • Creator
  • CustomDictionaries
  • CustomizationContext
  • DefaultLegalBlackline
  • DefaultSaveFormat
  • DefaultTableSeparator
  • Dialogs
  • DisplayAlerts
  • DisplayAutoCompleteTips
  • DisplayDocumentInformationPanel
  • DisplayRecentFiles
  • DisplayScreenTips
  • DisplayScrollBars
  • Documents
  • DontResetInsertionPointProperties
  • EmailOptions
  • EmailTemplate
  • EnableCancelKey
  • FeatureInstall
  • FileConverters
  • FileDialog
  • FileValidation
  • FindKey
  • FocusInMailHeader
  • FontNames
  • HangulHanjaDictionaries
  • Height
  • International
  • IsObjectValid
  • IsSandboxed
  • KeyBindings
  • KeysBoundTo
  • LandscapeFontNames
  • Language
  • Languages
  • LanguageSettings
  • Left
  • ListGalleries
  • MacroContainer
  • MailingLabel
  • MailMessage
  • MailSystem
  • MAPIAvailable
  • MathCoprocessorAvailable
  • MouseAvailable
  • Name
  • NewDocument
  • NormalTemplate
  • NumLock
  • OMathAutoCorrect
  • OpenAttachmentsInFullScreen
  • Options
  • Parent
  • Path
  • PathSeparator
  • PickerDialog
  • PortraitFontNames
  • PrintPreview
  • ProtectedViewWindows
  • RecentFiles
  • RestrictLinkedStyles
  • ScreenUpdating
  • Selection
  • SensitivityLabelPolicy
  • ShowAnimation
  • ShowStartupDialog
  • ShowStylePreviews
  • ShowVisualBasicEditor
  • SmartArtColors
  • SmartArtLayouts
  • SmartArtQuickStyles
  • SpecialMode
  • StartupPath
  • StatusBar
  • SynonymInfo
  • System
  • TaskPanes
  • Tasks
  • Templates
  • Top
  • UndoRecord
  • UsableHeight
  • UsableWidth
  • UserAddress
  • UserControl
  • UserInitials
  • UserName
  • VBE
  • Version
  • Visible
  • Width
  • Windows
  • WindowState
  • WordBasic
  • XMLNamespaces

See also

  • Word Object Model Reference

[!includeSupport and feedback]

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

Сама по себе коллекция Documents хранит в себе набор всех объектов Document, которые в свою очередь позволяют работать с каждым экземпляром документа в отдельности. Я буду приводить примеры как в самом редакторе VBA, как и с помощью сценариев Windows Scrip Host.

Единственно свойство, которое позволяет узнать общее количество элементов коллекции является Count:

Count – содержит количество открытых в данный момент документов.

Для примера, откройте несколько word документов и в редакторе VBA пропишите следующий код (просто создайте новый модуль):

For Each objDoc In Documents
    DocName = DocName & objDoc.Name & vbCrLf
Next
MsgBox DocName
 
DocName = ""
 
For j = 1 To Documents.Count
    DocName = DocName & Documents.Item(j).Name & vbCrLf
Next
 
MsgBox DocName

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

  • Использовали цикл for each для обработки коллекции
  • Использовали свойство count для определения количества элементов в коллекции Documents.

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

Однако, если мы попробуем проделать аналогичный фокус в сценарии Windows script Host, то никакого результата не получим:

' -----------------------------------------------------
' Получение имени открытых документов
' documents-count.vbs
' -----------------------------------------------------
Option Explicit
 
dim objWord, objDoc, oDoc, DocName
 
Set objWord = CreateObject("Word.Application")
Set objDoc = objWord.Documents
 
For Each oDoc In objDoc
    DocName = DocName & oDoc.Name & vbCrLf
Next
 
MsgBox DocName
objWord.Quit
// ------------------------------------------------
// Получение имени открытых документов
// documents-count.js
// ------------------------------------------------
 
var objWord, objDoc, oDoc, DocName;
 
objWord = WScript.CreateObject("Word.Application");
objDoc = new Enumerator(objWord.Documents);
 
for (; !objDoc.atEnd(); objDoc.moveNext()){
    DocName += objDoc.item().Name+ "n";
}
 
WScript.Echo(DocName);
objWord.Quit();

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

Методы коллекции Word Documents

Хорошо, теперь давайте рассмотрим некоторые методы коллекции Word Documents, один из методов мы уже использовали выше (Item).

Add(Template, NewTemplate, DocumentType, Visible) – отвечает за создание нового документа, который сразу же открывается, можно выполнить метод без параметров. Параметры:

  • Template – задает шаблон для нового документа
  • NewTemplate – определяет, сделать ли новый документ шаблоном (TRUE) или нет (FALSE)
  • DocumentType – позволяет задать тип создаваемого документа, возможные значения: wdNewBlankDocument, wdNewEmailMessage, wdNewFrameset или wdNewWebPage (новый чистый документ, значение по умолчанию).
  • Visible – видимость нового документа (TRUE или FALSE).

При отсутствии параметров, будет создан чистый документ на основе шаблона Normal.dot.

Обратите внимание, что свойство Visible есть и у объекта Word Application, там оно позволяет показать или скрыть все экземпляры объекта Application.

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

' --------------------------------------------
' Создание документов word
' Application Documents Word
' documents-add-word.
' --------------------------------------------
Option Explicit
 
dim objWord, objDoc, i
 
' Создаем ссылку на объект Word.Application
Set objWord = CreateObject("Word.Application")
' Создаем ссылку на объект Documents
Set objDoc = objWord.Documents
' Делаем видимым приложение Word
objWord.Visible = True
 
' Создаем пять документов
for i=1 to 5
     objDoc.Add
Next
 
' Выводим количество созданных документов
MsgBox "Количество документов " & objDoc.Count
 
'Закрываем все документы Word
objWord.Quit
// --------------------------------------------
// Создание документов word
// Application Documents Word
// documents-add-word.js
// --------------------------------------------
 
var objWord, objDoc, i;
 
// Создаем ссылку на объект Word.Application
objWord = WScript.CreateObject("Word.Application");
// Создаем ссылку на объект Documents
objDoc = objWord.Documents;
// Делаем видимым приложение Word
objWord.Visible = true;
 
// Создаем пять документов
for (i=1; i<=5; i++){
     objDoc.Add();
}
 
// Выводим количество созданных документов
WScript.Echo ("Количество документов " + objDoc.Count);
 
//Закрываем все документы Word
objWord.Quit()

Item(index) переход к заданному элементу коллекции по его индексу. Значение индекса можно задавать как через метод, так и через коллекцию, так как метод Item используется по умолчанию. Следующие две строки кода являются эквивалентными:

Application.Documents(3)
Application.Documents.Item(3)
' -------------------------------------------
' Обработка коллекции документов
' Application Documents Word
' documents-count-word.vbs
' -------------------------------------------
Option Explicit
 
dim objWord, objDoc, i, j, objInfo
' вызываем процедуру CreateDoc
Call CreateDoc
 
objInfo = "Имя:" & vbCrLf
 
' Начинаем перебор коллекции Documents
for j=1 to objDoc.Count
     objInfo = objInfo & objDoc.Item(j).Name & vbCrLf
Next
 
' Выводим имена созданных документов
MsgBox objInfo
 
'Закрываем все документы Word
objWord.Quit
 
Sub CreateDoc
     Set objWord = CreateObject("Word.Application")
     Set objDoc = objWord.Documents
     objWord.Visible = True
 
     for i=1 to 5
                 objDoc.Add
     Next
End Sub
// -----------------------------------------
// Обработка коллекции документов
// Application Documents Word
// documents-count-word.js
// -----------------------------------------
 
var objWord, objDoc, i, j, objInfo
CreateDoc()
objInfo = "Имя:n";
 
// Начинаем перебор коллекции Documents
for (j=1; j<=objDoc.Count; j++){
     objInfo += objDoc.Item(j).Name + "n";
}
 
// Выводим имена созданных документов
WScript.Echo(objInfo);
 
//Закрываем все документы Word
objWord.Quit()
 
function CreateDoc(){
     objWord = WScript.CreateObject("Word.Application");
     objDoc = objWord.Documents;
     objWord.Visible = true;
 
     for (i=1; i<=5; i++){
                 objDoc.Add();
     }
}

Open(FileName, ConfirmConversions, ReadOnly, AddToRecentFiles, PasswordDocument, PasswordTemplate, Revert, WritePasswordDocument, WritePasswordTemplate, Format) – открыть заданный документ

  • FileName – только этот параметр является обязательным, содержит путь к файлу, если надо открыть несколько документов, то имена разделяются пробелами.
  • ConfirmConversions – содержит логическое значение, определяющее, надо ли отображать (TRUE) или нет (FALSE) отображать диалоговое окно Convert File, если документ записан не в формате Word.
  • ReadOnly – определяет, открывать ли документ только для чтения (значение TRUE).
  • AddToRecentFiles – если значение TRUE, то документ добавляется к списку файлов внизу меню Файл.
  • PasswordDocument, PasswordTemplate – пароль к документу или пароль к шаблону, соответственно. Application Documents Word.
  • Revert – если данный параметр содержит значение TRUE, то при попытке открыть уже открытый документ, сделанные в нем изменения не будут сохраняться. Если значение FALSE – произойдет простая активизация документа.
  • WritePasswordDocument – пароль, который запрашивается при сохранении документа.
  • WritePasswordTemplate — пароль, который запрашивается при сохранении шаблона.
  • Format – параметр содержит параметр для преобразования файла. Значения: wdOpenFormatAuto (по умолчанию), wdOpenFormatDocument, wdOpenFormatRTF, wdOpenFormatTemplate, wdOpenFormatText, wdOpenFormatUnicodeText.

Save() и Close() – сохранение и закрытие (соответственно) всех документов в заданной коллекции.

I have a code. It does not run in 2016.Is it a Office 16 problem

Dim objWordApp as Word.Application
Dim objWordDoc as Word.document
Set objWordApp = new Word.application

I get an error Error in loading DLL .I have already included the library Microsoft word 16.0 Object Library

regards
Anna

Community's user avatar

asked Nov 7, 2017 at 12:56

Anna Smith's user avatar

2

I am not sure what went wrong for you but if you just want to open a new word document with your default MS office then you can use this peace of code

Sub wordopener()
  Dim objWord
  Dim objDoc
  Set objWord = CreateObject("Word.Application")
  Set objDoc = objWord.Documents.Add
  objWord.Visible = True
End Sub

answered Nov 7, 2017 at 13:32

Harsh Dubey's user avatar

I generally have a BAS file containing the ‘CreateWord’ function which I drag into any workbook/database that needs it.

First it tests to see if Word is already open using GetObject. If that returns an error it creates an instance of Word using CreateObject.

The Word application can then be opened by simply using Set oWD_App = CreateWord.

Sub Test()

    Dim oWD_App As Object
    Dim oWD_Doc As Object

    Set oWD_App = CreateWord

    With oWD_App
        Set oWD_Doc = .Documents.Add
    End With

End Sub


Public Function CreateWord(Optional bVisible As Boolean = True) As Object

    Dim oTempWD As Object

    On Error Resume Next
    Set oTempWD = GetObject(, "Word.Application")

    If Err.Number <> 0 Then
        Err.Clear
        On Error GoTo ERROR_HANDLER
        Set oTempWD = CreateObject("Word.Application")
    End If

    oTempWD.Visible = bVisible
    Set CreateWord = oTempWD

    On Error GoTo 0
    Exit Function

ERROR_HANDLER:
    Select Case Err.Number

        Case Else
            MsgBox "Error " & Err.Number & vbCr & _
                " (" & Err.Description & ") in procedure CreateWord."
            Err.Clear
    End Select

End Function

answered Nov 7, 2017 at 16:00

Darren Bartrup-Cook's user avatar

You are trying to use early binding. It is advisable, because it is a bit faster and it gives you intellisense, which is nice. However, to use it, you should add the corresponding libraries.

However, if you use the slower late binding, you do not need to add any libraries. It does not have intellisense and it would be a bit slower (but probably not noticeable).

Try like this:

Option Explicit

Sub TestMe()

    Dim objWord As Object
    Dim objDoc  As Object

    Set objWord = CreateObject("Word.Application")
    Set objDoc = objWord.Documents.Add
    objWord.Visible = True

End Sub

Early binding vs. late binding: what are the comparative benefits and disadvantages?

answered Nov 7, 2017 at 13:39

Vityata's user avatar

VityataVityata

42.4k8 gold badges55 silver badges98 bronze badges

1

Понравилась статья? Поделить с друзьями:
  • Set width of a column in excel vba
  • Set vba excel что это
  • Set vba excel описание
  • Set vba excel rows
  • Set up one word or two