2014-11-27 2 views
0

Я пытался изменить блестящий пример с here с небольшим успехом. В документе MSWord мне нужно найти текст, например <<TEST>>, и восстановить строку, найденную между << и >>, которая вернет TEST. В конечном итоге я намереваюсь использовать это, чтобы найти значение против TEST и вернуть строку, которая будет заменена в документе Word. то есть. <<TEST>> будет FRED например.Найти/заменить текст, используя строку, найденную в документе Word

Sub Sample() 
    Dim c As Range 
    Dim StartWord As String, EndWord As String, TheWord As String 

    StartWord = "<<": EndWord = ">>" 

    Set c = ActiveDocument.Content 
    c.Find.ClearFormatting 
    c.Find.Replacement.ClearFormatting 
    With c.Find 
     .Text = "[\<]{2}*[\>]{2}" 
     '.Replacement.Text = TheWord 
     .Forward = True 
     .Wrap = wdFindStop 
     .Format = False 
     .MatchCase = False 
     .MatchWholeWord = False 
     .MatchWildcards = True 
     .MatchSoundsLike = False 
     .MatchAllWordForms = False 
    End With 

    c.Find.Execute 
    While c.Find.Found 
     Debug.Print c.Text 
     TheWord = Replace(Replace(c.Text, StartWord, ""), EndWord, "") 
     Debug.Print TheWord 
     c.Find.Replacement.Text = TheWord 
     ' Future something here to lookup value based on 'TheWord' 
     c.Find.Execute Replace:=wdReplaceOne 
    Wend 
End Sub 

На данный момент, я просто пытаюсь заменить эти слова, как <<TEST>>, которые встречаются с строки, найденной внутри. Хотя он найдет и заменит первый экземпляр текста, соответствующего шаблону, он не найдет других, подобных example.

Спасибо.

ответ

0

Даже если иногда не рекомендуется использовать Selection в вашем коде, я предпочитаю использовать его при запуске find >> replace действий.

В следующем коде вы найдете два первого Solutions-, чтобы заменить текст с один внутри <<>> скобкой, второго должен заменить любой текст. Не запускайте оба сразу, прокомментируйте один, чтобы запустить другой.

Sub Sample() 
    Dim c As Range 
    Dim StartWord As String, EndWord As String, TheWord As String 

    StartWord = "<<": EndWord = ">>" 

    ActiveDocument.Range(0, 0).Select 
    Selection.Find.ClearFormatting 
    Selection.Find.Replacement.ClearFormatting 

    With Selection.Find 
     .Text = "[\<]{2}(*)[\>]{2}" 
     .Replacement.Text = "\1" 
     .Forward = True 
     .Wrap = wdFindStop 
     .Format = False 
     .MatchCase = False 
     .MatchWholeWord = False 
     .MatchWildcards = True 
     .MatchSoundsLike = False 
     .MatchAllWordForms = False 
    End With 

    'DO NOT RUN BOTH OPTIONS TOGETHER, CHOOSE ONE 

    'OPTION 1. replace to inside text 
    'Selection.Find.Execute Replace:=wdReplaceAll 


    'OPTION 2. replace to any text, here- inside text found with replace function 
    Do While Selection.Find.Execute 

     Debug.Print Selection.Text 
     TheWord = Replace(Replace(Selection.Text, StartWord, ""), EndWord, "") 
     Debug.Print TheWord 
     Selection.Text = TheWord 
     Selection.Collapse WdCollapseDirection.wdCollapseEnd 

    Loop 
End Sub 
Смежные вопросы