Получить имя открытого документа Word в Excel - PullRequest
1 голос
/ 22 января 2020

У меня есть одна рабочая книга .xlsm и один открытый документ .docx.
Код - Excel VBA.

Я хочу отобразить имя файла Word в MsgBox.
Как мне ссылаться на документ Word в Excel VBA?

Я нашел код здесь https://excel-macro.tutorialhorizon.com/vba-excel-get-the-instance-of-already-opened-word-document/

После того, как я переписал его, он дает мне эту ошибку:

компонент activex не может создать объект 429.

Sub Get_Opened_Doc_Instance()
    'Variables declaration
    'Dim WordApp As Object
    Dim WordApp As Word.Application
    'Dim WordDoc As Object
    Dim WordDoc As Word.Document
    'Dim Text As String             
    'this variable is here because later I'm going to search this file.
    Set WordApp = GetObject(, Word.Application)
    'Set WordDoc = GetObject(, Word.Document)
    WordApp.Visible = True          'this line or the next one returns the error
                                    'activex component can't create object 429
    MsgBox WordApp.ActiveDocument.Name
End Sub

Инструменты редактора My Excel VBA -> скриншот ссылок.
enter image description here

Ответы [ 2 ]

2 голосов
/ 22 января 2020

GetObject и CreateObject оба принимают параметр String, представляющий ProgID - это буквальное строковое значение, присутствующее в реестре Windows, связывающее класс с указанной c библиотекой типов.

Следовательно, вы хотите, чтобы этот аргумент был заключен в двойные кавычки, которые разделяют строковый литерал:

Set WordApp = GetObject(, "Word.Application")

Причина, по которой вы получаете ошибку, заключается в том, что неявный вызов члена по умолчанию в Word.Application, который возвращает значение Word.Application.Name, то есть строковое значение "Microsoft Word", а «Microsoft Word» не является допустимым, зарегистрированным ProgID.

Имеет ссылку на объектную модель Word в вашем проекте означает, что вы можете сделать это:

Dim WordApp As Word.Application
Set WordApp = GetObject(, "Word.Application")

И тогда каждый вызов члена, сделанный для этой WordApp объектной переменной, будет проверяться во время компиляции (вот что означает early-bound ). Это также означает, что вы можете сделать это:

Dim WordApp As Word.Application
Set WordApp = New Word.Application

Вместо этого:

Dim WordApp As Word.Application
Set WordApp = CreateObject("Word.Application")

Со ссылкой на библиотеку объектов Word все константы wdXxxxx определены и могут использоваться. С другой стороны, ваши пользователи должны иметь точно такую ​​же версию библиотеки, на которую они ссылаются, на своих компьютерах.

Если ваши пользователи используют версии Word / Office, отличные от вас, подумайте поздняя привязка вместо.

Вы потеряете возможность напрямую использовать wdXxxxx константы (вам нужно будет использовать их базовые значения или определить их как Const идентификаторы или Enum участников самостоятельно). Вы также потеряете проверку во время компиляции, intellisense / autocompletion, возможность New поднять любой класс из библиотеки Word, и Option Explicit не сможет защитить вас от опечатки в любом из членов с поздней привязкой звонки, которые вы делаете (ожидайте ошибку времени выполнения 438, если вы делаете что-то не так), но вы также потеряете зависимость от указанной c версии Word / Office.

Чтобы использовать позднюю привязку, вам нужно объявить вещи As Object, например:

Dim WordApp As Object
Set WordApp = GetObject(, "Word.Application")

Обратите внимание, что это не может работать, даже с двойными кавычками:

'Set WordDoc = GetObject(, "Word.Document")

Поскольку вы не можете создать Word.Document - только Word может сделать это, по той же причине, по которой вы не можете создать Excel.Worksheet, только Excel может сделать это. Чтобы создать Word.Document, вам нужно вызвать элемент WordApp, который создаст новый документ (и вернуть ссылку на него, которую вы можете записать в локальной переменной):

Dim WordDoc As Object 'early-bound: As Word.Document
'Set WordDoc = WordApp.ActiveDocument
Set WordDoc = WordApp.Documents.Add

MsgBox WordDoc.Name
1 голос
/ 22 января 2020

Вам не нужны первые две строки в приведенном выше макросе - вы можете получить то, что ищете, просто с помощью этих 3 строк:

Set objWord = GetObject(, "Word.Application")

objWord.Visible = True

MsgBox objWord.ActiveDocument.Name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...