Разобрать файл Word DOCX, чтобы скопировать определенный абзац заголовка в файл Excel XLSX - PullRequest
1 голос
/ 19 сентября 2019

Не могли бы вы помочь мне выделить весь абзац под заданным заголовком в файле слова и импортировать его содержимое в файл excel через VBA?Заголовок всегда называется «Примечания» в файле слов и является заголовком 4, когда я использую команду Перейти к нему, чтобы достичь его.

  • Я пытался использовать свойство content.find собъект word.application, но он копирует весь документ.

  • Я также пытался достичь запрошенного заголовка с помощью метода GoTo со следующими параметрами: what: = wdGoToHeading, который: = wdGoToAbsolute, Count: = 4, но метод не принимается и выдает сообщение об ошибке при компиляции.

    Sub ImportWordTables()
   'Imports a table from Word document

   Dim applWord                 As Object
   Dim notes                    As String

   Dim wdDoc                    As Object
   Dim wdDocName                As String
   Dim wdFileName               As Variant

...

   Set applWord = CreateObject("Word.Application")
   applWord.Visible = True
   applWord.WindowState = 1

   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)
   Application.Goto (ActiveWorkbook.Sheets("Sheet1").Range("A1"))

   Set wdDoc = applWord.Documents.Open(wdFileName)

Iпробовал:

   applWord.ActiveDocument.Range.Selection.Goto what:=wdGoToHeading, which:=wdGoToAbsolute, Count:=4

И:

With applWord.ActiveDocument.Content.Find
        .ClearFormatting
        .Text = "Notes"
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
        With .Parent
           .Select
           .Copy
        End With

       applWord.ActiveDocument.Range.Selection.Copy

Большое спасибо за помощь и хорошего дня!

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

Вы на правильном пути с Content.Find ...

  1. Когда вы используете Find, не забудьте также использовать .Execute, иначе ничего не произойдет.Это похоже на нажатие кнопки ОК в диалоговом окне после установки свойств.
  2. Обычно лучше использовать выделенный объект Range с Find, которым можно манипулировать.При запуске Find диапазон или выбор, для которого он выполняется, изменится на «найденный» контент.Так что Selection.Find работал бы для вас (до тех пор, пока вы выполняете).Но ActiveDocument.Content не может, потому что не может измениться.Вот почему требуется выделенный объект Range.
  3. Расширение найденного содержимого: Word имеет несколько Move методов для диапазонов и выборок.Для этого я бы использовал MoveEnd (подробности см. В справочнике по языкам).

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

Dim rngFind As Object

Set wdDoc = applWord.Documents.Open(wdFileName)
Set rngFind = wdDoc.content

With rngFind.Find
    .ClearFormatting
    .Text = "Notes"
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
    .Format = True
    If .Execute Then
       rngFind.MoveEnd wdParagraph, 2
       rngFind.Copy
    End If
End With
0 голосов
/ 20 сентября 2019

Еще раз спасибо за вашу помощь.Я добился того, чтобы вставить что-то в буфер обмена с помощью следующего:

   Dim applWord                 As Object
   Dim rngFind                  As Word.Range

   Set rngFind = ActiveDocument.Content
   With rngFind.Find
        .ClearFormatting
        .Text = "Notes"
        .MatchCase = False
        .MatchWholeWord = True
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
        .Execute
    End With

    rngFind.MoveEnd wdParagraph, 2
    rngFind.Select
    rngFind.Copy

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

Итак, это работает!

Следующая трудность связана с

   rngFind.MoveEnd wdParagraph, 2

На самом деле содержимое заголовка «Заметки» в моем файле слов представляет собой список нумерации., так это как:

Примечания
1) первая точка
2) ...
3) ...
4) ...

С неопределенным числом элементов.

Есть ли какая-нибудь команда, которую я могу использовать, чтобы быть уверенным, что перехватывается весь абзац?Вчера я попытался найти команду VBA, которая позволила бы свернуть заголовок перед его копированием.Эквивалент щелчка правой кнопкой мыши рядом с ним: «Развернуть / свернуть», затем «Заголовок свернуть».Я не нашел ничего подобного, и я не уверен, что это лучший способ добиться того, чего я хотел бы.

Так что, если у вас еще есть немного времени, чтобы посоветовать мне, вы были бы тепло приветствованы:-)

Спасибо и хорошего дня!

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