2016-05-12 4 views
0

Для моей работы я должен найти все экземпляры стиля в 40-словных документах (.doc). Когда я получу текст, я хочу записать его в ячейке на моем листе excel (.xls).VBA получить все вхождения стиля в документ Word из Excel

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

Не могли бы вы рассказать мне, где я ошибаюсь?

Я хочу от: Before running the macro к тому, что: After running the macro

Вот мой код:

'================================================================== 
' Declarations 
'================================================================== 

Dim ObjWord As Object ' Word application object 

'================================================================== 
' Macro 
'================================================================== 

Public Sub Macro() 

Dim row As Integer 
row = 9 'first available row 

Set ObjWord = CreateObject("word.application") 

Worksheets("Sheet 2").Activate 

While (Cells(row, 2).Value <> "End of file list") 

    Set file = ObjWord.documents.Open(ThisWorkbook.path & ".\" & Cells(row, 1).Hyperlinks(1).Address) 


    Set currentRange = file.Range 

    currentRange.Find.ClearFormatting 
    currentRange.Find.Forward = True 
    currentRange.Find.Text = "" 
    currentRange.Find.Style = "MyStyle" 
    bFind = currentRange.Find.Execute 

    Do While bFind 'here is the endless loop 
     row = row + 1 
     StyleValue= currentRange.Text 'I get stuck with the first value :-(
     Rows(row).EntireRow.Insert 
     Cells(row, 2).Value = StyleValue 
     bFind = currentRange.Find.Execute 
    Loop 

    file.Close 

    row = row + 1 ' next File 
Wend 

ObjWord.Quit 
End Sub 
+0

Как 'find' реагирует зависит в определенной степени от того, где найденный текст расположен по отношению к определенным структурам документов. Особенно важно, когда задействованы ячейки таблицы. Другая потенциальная проблема, которую я вижу в вашем коде, - это VBA (и мы), не будучи уверенным, когда она имеет дело с объектами Excel и когда с объектами Word. «Диапазон» используется в обоих, например, как «rows» и «columns». Вам нужно дать некоторые разъяснения, чтобы они могли четко ответить на этот вопрос. –

ответ

0

Мне пришлось внести ряд изменений, чтобы заставить его работать для меня, главным образом потому, что у меня есть Option Explicit и объявить все переменные.

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

Do While bFind 'here is the endless loop 
    row = row + 1 
    StyleValue= currentRange.Text 'I get stuck with the first value :-(
    Rows(row).EntireRow.Insert 
    Cells(row, 2).Value = StyleValue 

    currentRange.SetRange currentRange.End, currentRange.End 

    bFind = currentRange.Find.Execute 
Loop 

Если это не работает, я могу выскочить полную замену позже

+0

Спасибо большое! Он отлично работает. Я пробовал что-то подобное раньше, но я думаю, я сделал это неправильно. – Pierre

0

Я думаю, что это должно быть так:

Do While currentRange.Find.Found 
    currentRange.Find.Execute 
Loop 
+0

Спасибо, Чарли, но это не сработает, проблема все та же :( – Pierre

+0

ОК, чем я думаю, проблема в Excel - попробуйте удалить все строки Excel, например, строки (строки) .EntireRow.Insert. Если это работает, я могу предоставить Обходной путь – Charlie

+0

Это немного не изменилось. – Pierre

Смежные вопросы