Как открыть файл, а затем активировать это окно в VBA (Microsoft Word)? - PullRequest
0 голосов
/ 21 декабря 2018

У меня уже открыт один документ Word ("Template1").Я пытаюсь написать код VBA, чтобы открыть файл документа Word («FileWithData») и скопировать информацию из «FileWithData» в «Template1».«FileWithData» может быть любым файлом, и именно поэтому я использую OpenDialog.

Все работает, но я застрял, когда дело доходит до активации окна «FileWithData» для запуска процесса «Копирование и вставка».

Dim intChoice As Integer
Dim strPath As String
Dim objWord As Object
Set objWord = CreateObject("Word.Application")
objWord.Visible = True

Application.FileDialog(msoFileDialogOpen).AllowMultiSelect = False
intChoice = Application.FileDialog(msoFileDialogOpen).Show
'if the user selects a file
If intChoice <> 0 Then
'get the path selected
strPath = Application.FileDialog( _
msoFileDialogOpen).SelectedItems(1)
'opens the document
objWord.Documents.Open (strPath)


 FileName = objWord.ActiveDocument.Name


и вот оно ломается :(

Windows(FileName).Activate
Selection.GoTo What:=wdGoToBookmark, Name:="Page1"
With ActiveDocument.Bookmarks
    .DefaultSorting = wdSortByName
    .ShowHidden = True
End With
Selection.Copy

Windows("Template1").Activate
Selection.GoTo What:=wdGoToBookmark, Name:="Page1"
With ActiveDocument.Bookmarks
    .DefaultSorting = wdSortByName
    .ShowHidden = True
End With
Selection.PasteAndFormat (wdFormatOriginalFormatting)
Selection.MoveLeft Unit:=wdCharacter, Count:=2

Я получаю следующую ошибку: Ошибка времени выполнения "5941"

Запрошенный членколлекции не существует.

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Похоже, вы хотите скопировать данные из документа Word в Excel.Это правильно?Код ниже сделает это за вас.Просто измените путь к файлу Word, на который вы ссылаетесь, и при необходимости измените диапазоны.

Sub Copy_From_Word()

    Application.DisplayAlerts = False 'Disable all the Alerts from excel
    Application.ScreenUpdating = False 'After opening Word Doc, Document will not be visible
    'Create a New Object for Microsoft Word Application
    Dim objWord As New Word.Application
    'Create a New Word Document Object
    Dim objDoc As New Word.Document
    'Open a Word Document and Set it to the newly created object above
    Set objDoc = objWord.documents.Open("C:\path_here\your_document.docx")
    'To Store all the content of that word Document in a variable
    strTemp = objDoc.Range(0, objDoc.Range.End)
    'Now store that variable value in to a cell range
    Range("A1").Value = strTemp
    str1 = objDoc.Range(0, 1)
    Range("A2").Value = str1
    Range("B2").Value = strTemp

    objDoc.Close SaveChanges:=wdDoNotSaveChanges
    objWord.Quit

End Sub
0 голосов
/ 21 декабря 2018

Существует ряд факторов, влияющих на этот код, которые могут или могут вызвать проблемы.

Причина ошибки заключается в том, что этот код работает в Excel, поэтому, если objWord не используется дляСинтаксис Word, и Word и Excel используют одно и то же имя для объекта, VBA попытается использовать объектную модель Excel.В этом случае, поскольку файл находится в Word, а не в Excel, использование objWord.Windows(Filename).Activate должно избежать этой конкретной ошибки.

Другие соображения:

Как и в Excel, с использованием Active, Activate или Selection в Word VBA ненадежен и не должен использоваться без крайней необходимости.Лучше работать с объектами приложения напрямую.Поэтому объявите и создайте экземпляр переменной для документа Word и используйте ее вместо ActiveDocument:

Dim objDoc as Object 'Word.Document
Set objDoc = objWord.Documents.Open(strPath)

FileName = objDoc.Name

Неясно, нужно ли вам действительно активировать это окно.Это не обязательно для манипулирования содержимым документа через VBA.Если это для того, чтобы показать его пользователю, для редактирования, то непременно.Я мог бы подождать до конца кода, но это будет личное предпочтение ... В любом случае, можно обратиться к окнам документа, а не к VBA-поиску:

objDoc.Windows(1).Activate

Чтобы перенести отформатированный контент из одного места (Range) в любом документе в другое место (Range) в том же или другом документе, использование закладок может быть выполнено за один шаг без какого-либо выбора или активации:

objDoc.Bookmarks("Page1").Range.FormattedText = _
       objWord.Documents("Template1").Bookmarks("Page1").Range.FormattedText
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...