Страницы: 1
RSS
Vba Цикл Do while loop
 
Добрый день, уважаемые форумчане.  
Вопрос в следующем.  
Есть код, который ищет в Word циклом Do while loop все значения в скобках к примеру [01tr01] и заменяет их из файла Эксель на значения. При использовании цикла Do while loop если ошибся в значении к примеру [01tr00] и Excel не находит этого значения, то получется бесконечный цикл.
Подскажите пожалуйста как можно по другому реализовать цикл, или обработать ненайденные значения.  
Заранее спасибо.  
 
 
Sub Find2()  
Dim oFile, wsSh As Worksheet, Openbook, Book  
Set wsh = CreateObject("WScript.Shell")  
docs = wsh.SpecialFolders("Desktop") 'получение адреса рабочего стола  
CurrentPath = ThisWorkbook.Path ' получение адреса текущей папки  
Form = "Юр _форм _автозамена.doc"  
Set obook = Workbooks.Open(docs & "\" & "crm_ui_frame(1)") ' имя книги по умолчанию  
        Dim oWord As Word.Application  
           Dim oDoc As Word.Document  
           Set oWord = CreateObject("Word.Application")  
           Set oDoc = oWord.Documents.Add(CurrentPath & "\" & Form) 'запускаем форму  
           oWord.Visible = True  
           oWord.Tasks("Microsoft Word").Activate  
           'oWord.Application.ScreenUpdating = False  
          ' thisdocument.Activate  
Set myRange = oDoc.Content  
    myRange.Find.ClearFormatting  
   With myRange.Find  
       .Text = "[[]?*[]]"
       .Forward = True  
       .Wrap = wdFindContinue  
       .Format = False  
       .MatchWildcards = True  
       .Execute  
           Do While .Found = True ' проблемный участок  
               'MsgBox myRange  
               .Execute  
               Codes = Mid(myRange, 2, Len(myRange) - 2)  
    Set sRow = Cells.Find(What:=Codes, After:=ActiveCell, LookIn:=xlFormulas, LookAt _  
       :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _  
       False, SearchFormat:=False)  
If Not sRow Is Nothing Then  
       sRow = sRow.Row  
       Values = obook.Sheets(1).Range("B" & sRow).Value  
       oDoc.Content.Find.ClearFormatting  
  With oDoc.Content.Find  
       .Text = myRange  
       .Replacement.Text = Values  
       .Forward = True  
       .Format = False  
       .Execute Replace:=wdReplaceAll, Forward:=True  
   End With  
Else:  
myRange.HighlightColorIndex = wdRed  
Exit Sub  
End If  
 Loop  
End With  
End Sub
 
Судя по коду, ненайденное (одно) как раз обрабатываются:  
 
If Not sRow Is Nothing Then  
...  
Else:  
myRange.HighlightColorIndex = wdRed  
Exit Sub  
End If  
 
Вероятно, зацикливается что-то другое...  
По F8 тщательно отслеживали?
 
Hugo, я немного непарвильно написал.  
При текущем коде, если находит отсутствующий код, то Exit sub c его выделением красным.  
Так как кодов будет много в шаблоне и он может быть не последний, то сейчас получается при нахождении отсутствующего кода выкидывает из макроса.  
Если же убрать эту строчку, то произойдет зацикливание. Else. Из-за ненайденных кодов.  
Спасибо за быстрый ответ
 
Мне кажется, что если убрать Exit Sub, то зацикливания быть не должно.  
Хотя без файлов или спеца по ворду сказать сложно...
 
Если не трудно, посмотрите пожалуйста, прикладываю файл  
crm_ui_frame(1) - должен лежать на рабочем столе  
Книга с макросом и Юр _форм _автозамена - должны лежать в одной папке.
 
Так попробуйте:  
 
 
Sub Find2()  
   Dim oFile, wsSh As Worksheet, Openbook, Book  
   Set wsh = CreateObject("WScript.Shell")  
   docs = wsh.SpecialFolders("Desktop")    'получение адреса рабочего стола  
   CurrentPath = ThisWorkbook.Path    ' получение адреса текущей папки  
   Form = "Юр _форм _автозамена.doc"  
   Set obook = Workbooks.Open(docs & "\" & "crm_ui_frame(1)")    ' имя книги по умолчанию  
   Dim oWord As Word.Application  
   Dim oDoc As Word.Document  
   Set oWord = CreateObject("Word.Application")  
   Set oDoc = oWord.Documents.Add(CurrentPath & "\" & Form)    'запускаем форму  
   oWord.Visible = True  
   oWord.Tasks("Microsoft Word").Activate  
   'oWord.Application.ScreenUpdating = False  
   ' thisdocument.Activate  
   Set myRange = oDoc.Content  
   myRange.Find.ClearFormatting  
   With myRange.Find  
       .Text = "[[]?*[]]"
       .Forward = True  
       .Wrap = wdFindContinue  
       .Format = False  
       .MatchWildcards = True  
       .Execute  
       Do While .Found = True    ' проблемный участок  
           MsgBox myRange  
           .Execute  
           Codes = Mid(myRange, 2, Len(myRange) - 2)  
           Set sRow = Cells.Find(What:=Codes, After:=ActiveCell, LookIn:=xlFormulas, LookAt _  
                                                                                     :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _  
                                 False, SearchFormat:=False)  
           If Not sRow Is Nothing Then  
               sRow = sRow.Row  
               Values = obook.Sheets(1).Range("B" & sRow).Value  
               oDoc.Content.Find.ClearFormatting  
               With oDoc.Content.Find  
                   .Text = myRange  
                   .Replacement.Text = Values  
                   .Forward = True  
                   .Format = False  
                   .Execute Replace:=wdReplaceAll, Forward:=True  
               End With  
           Else:  
               myRange.HighlightColorIndex = wdRed  
               oDoc.Content.Find.ClearFormatting  
               With oDoc.Content.Find  
                   .Text = myRange  
                   .Replacement.Text = "not found!"  
                   .Forward = True  
                   .Format = False  
                   .Execute Replace:=wdReplaceAll, Forward:=True  
               End With  
 
               'Exit Sub  
           End If  
       Loop  
   End With  
End Sub
 
Понял, большое спасибо, сам чуть чуть не доразобрался до этого
 
Не нашёл, как в Ворде тормознуть поиск по кругу, поэтому просто заменяю все объекты поиска  - на найденное или на "not found!" :)
 
Я тоже не могу найти)  
Скажу, пусть внимательней проверяют коды)
 
В блоке Else решил таким способом меняем скобки на кавычки.  
Else:  
myRange.HighlightColorIndex = wdRed  
codes = Mid(myRange, 2, Len(myRange) - 2)  
With oDoc.Content.Find  
       .Text = myRange  
       .Replacement.Text = Chr(34) & codes & Chr(34)  
       .Forward = True  
       .Format = False  
       .Execute Replace:=wdReplaceAll, Forward:=True  
   End With
Страницы: 1
Читают тему
Loading...