Excel VBA - проблема Word.Selection с ошибкой 462 - PullRequest
0 голосов
/ 24 октября 2018

Я создавал Excel vba для поиска ключевого слова в текстовом документе, а затем возвращал строку над ним.Вот код:

Sub TEST()

Dim s As Word.Selection
fileaddress = "C:\XXXXXX"

Set appWrd = New Word.Application
Set docWrd = appWrd.Documents.Open(fileaddress)
Set aRange = docWrd.Range

Do
    aRange.Find.Text = "keyword"
    aRange.Find.Execute Forward:=True
    If aRange.Find.Found Then
        aRange.Select
        Set s = Word.Selection
        s.MoveUp Unit:=wdLine, COUNT:=1
        MsgBox s.Paragraphs(1).Range.ListFormat.ListString
        Set s = Nothing
    End If
Loop While aRange.Find.Found

docWrd.Close
appWrd.Quit

End Sub

Код работает нормально в первый раз, затем во второй раз появляется ошибка 462.Я думаю, что проблема, вероятно, с этим Word.Selection вещь.Любая идея разветвляется?

PS: файл слова выглядит примерно так:

  1. Стиль заголовка 1

ключевое слово

1.1 Заголовокstyle 2

ключевое слово

Таким образом, код ищет ключевое слово, а затем перемещает курсор на одну строку вверх от местоположения ключевого слова, а затем msgbox возвращает «1» и «1.1».Однако, как я уже сказал, код работает отлично с первого раза.Я думаю, что это связано с тем, что определенный процесс не убит в диспетчере задач после предыдущего запуска Excel.

решено

Новый код:

Sub TEST()

Dim s As Word.Selection
fileaddress = "C:\XXXXXX"

Set appWrd = New Word.Application
Set docWrd = appWrd.Documents.Open(fileaddress)
Set aRange = docWrd.Range

Do
    aRange.Find.Text = "keyword"
    aRange.Find.Execute Forward:=True
    If aRange.Find.Found Then
        aRange.Select
        Set s = appWrd.Selection   '<------- This is the only change!
        s.MoveUp Unit:=wdLine, COUNT:=1
        MsgBox s.Paragraphs(1).Range.ListFormat.ListString
        Set s = Nothing
    End If
Loop While aRange.Find.Found

docWrd.Close
appWrd.Quit

End Sub

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Заменить строку

Set s = Word.Selection

на

Set s = appWrd.Selection

Объект «Слово» не любит повторного использования после смерти (даже если он воссоздан).

0 голосов
/ 25 октября 2018

Когда вы упомянули «строку над ним», я попытался проверить, было ли слово в таблице или же в предложении.Поэтому я сравниваю слова в документе с ключевым словом, затем читаю строку выше в таблице или предложение, к которому он принадлежит, и затем считаю в обратном порядке, пока не будет найдено предыдущее предложение.

Sub TEST_Line(fileaddress As String, Keyword As String)
   Set appWrd = CreateObject("Word.Application")
   Set docWrd = appWrd.Documents.Open(fileaddress)
   Set DWords = docWrd.Words
   For Counter = 1 To DWords.Count
      If UCase(Keyword) Like UCase(DWords.Item(Counter)) Then
         If DWords.Item(Counter).Tables.Count > 0 Then
            Row_Ref = DWords.Item(Counter).Rows(1).Index - 1
            Col_Ref = DWords.Item(Counter).Columns(1).Index
            If Row_Ref > 0 Then
               MsgBox DWords.Item(Counter).Tables(1).Columns(Col_Ref).Cells(Row_Ref).Range.Text
            End If
         Else
            aRange = DWords.Item(Counter).Sentences(1)
            Reverse_Counter = Counter - 1
            If Reverse_Counter < 1 Then
               'MsgBox "First Sentence"
            Else
               Do While DWords.Item(Reverse_Counter).Sentences(1) = DWords.Item(Counter).Sentences(1)
               Reverse_Counter = Reverse_Counter - 1
               Loop
               MsgBox DWords.Item(Reverse_Counter).Sentences(1)
            End If
         End If
      End If
   Next Counter
   docWrd.Close
   appWrd.Quit
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...