Код VBA Excel Выдает ошибку, если документ Word еще не открыт

#excel #vba

Вопрос:

Извините, если это очевидный вопрос, но у меня проблема с некоторым кодом VBA, который пытается импортировать некоторые данные из файла Word в электронную таблицу Excel. В документах Word есть несколько основных таблиц, которые хороши, но одна из них также находится в текстовом поле. Я могу заставить импорт работать в этом случае, но только в том случае, если файл word уже открыт. Я не совсем понимаю, почему это так.

Если это помогает, ошибка: Ошибка во время выполнения, ошибка автоматизации, Неопределенная ошибка.

     wdFileName = Application.GetOpenFilename("Word files (*.doc*),*.doc*", , _
         "Browse for file containing table to be imported")
         
   If wdFileName = False Then Exit Sub '(user cancelled import file browser)
   
   Set wdDoc = GetObject(wdFileName)   'open Word file
   
   excelRow = Range("A" amp; Rows.Count).End(xlUp).Row   1 ' find next blank row in excel spreadsheet based on column A
   
    With wdDoc
      
        TableNo = wdDoc.Tables.Count 'find total number of tables in the document
        
        'This is the line that triggers the error if the word document is not already open, there are 7 shapes in the document for reference.
        shpTableCount = .Shapes(4).TextFrame.TextRange.Tables.Count
 

Спасибо за любую помощь, которую вы можете оказать.

Ответ №1:

GetOpenFilename указывает только имя файла GetObject , выбирает только экземпляр Word этого файла, если он уже открыт. Если он закрыт (означает, что вы получаете сообщение об GetObject(wdFileName) ошибке, вам нужно открыть его с помощью

 Set wdDoc = Documents.Open(wdFileName) 
 

Так что вы можете сделать

 'check if it is already open
On Error Resume Next 'hide all error messages
Set wdDoc = GetObject(wdFileName)
On Error Goto 0 're-enable error messages

'if it is not open, then open it
If wdDoc Is Nothing Then
    Set wdDoc = Documents.Open(wdFileName)
End If
 

Комментарии:

1. Привет, спасибо. Поэтому я попытался заменить исходную строку Set wdDoc = GetObject(wdFileName) в этом разделе и получить ту же ошибку, предположительно, потому что строка Set wdDoc = GetObject(wdFileName) означает, что wdDoc-это не что иное, и поэтому она не входит в оператор If? Если я просто использую набор wdDoc = Документы. Откройте код(wdFileName), он работает — нужно ли мне убедиться, что я также закрою документ в конце вложенного файла?

2. Вам всегда нужно закрыть свой документ, если вы хотите открыть его с Documents.Open помощью . Если вы не закроете ее, она останется открытой.

3. Ах, извините, я имел в виду, что в конце кода vba мне было интересно, нужно ли мне использовать что-то другое, открыв документ, но небольшое исследование показывает, что я все равно должен быть в порядке с Set wdDoc = Ничего.

4. Да, но вы должны закрыть документ, wdDoc.Close прежде чем вы Set wdDoc = Nothing