Nano Hash - криптовалюты, майнинг, программирование

Как открыть файл, а затем активировать это окно в VBA (Microsoft Word)?

У меня уже открыт один документ 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"

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

21.12.2018

Ответы:


1

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

Причина ошибки в том, что этот код выполняется в 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
21.12.2018
  • Спасибо за ответ. Я работаю только с Word (вообще не использую Excel). Мне понравился последний раздел вашего ответа. Вы правы, мне действительно не нужно активировать окно. Я использую код, но он дает мне ошибку Bad File Name. Template1 = ActiveDocument.Name ‹код, вырезанный в вопросе› Dim objDoc As Object Set objDoc = objWord.Documents.Open(strPath) FileWithData = objDoc.Name objDoc.Documents(FileWithData).Bookmarks(Page1).Range.FormattedText = _ objWord .Documents(Template1).Bookmarks(Page1).Range.FormattedText 22.12.2018
  • @AyupovSukhrab В каком же приложении работает этот код? Вы включили тег excel-vba в исходный вопрос. Поскольку код использует CreateObject, у меня не было причин сомневаться в этом... 24.12.2018
  • код работает только в MS Word. Прошу прощения, я удалил тег excel-vba. 24.12.2018

  • 2

    Похоже, вы хотите скопировать данные из документа 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
    
    26.12.2018
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..