слово vba: если то найти и заменить

в этом коде я хочу сделать следующее:

  • Если слово заканчивается на букву М, замените на букву Н.
  • Если слово заканчивается на букву Н, заменить на букву М.
  • Я плохо разбираюсь в использовании оператора IF - Then. Любая помощь будет принята с благодарностью.

    Sub find_end()   
        Selection.Find.ClearFormatting
        Selection.Find.Replacement.ClearFormatting
        With Selection.Find
            .Text = "[nm]>"
            .Replacement.Text = ""
            .Forward = True
            .Wrap = wdFindContinue
            .MatchWildcards = True
            Selection.Find.Execute
            With Selection
            If Selection.Find.Found = n Then
                Selection.TypeText Text:=m
            ElseIf Selection.Find.Found = m Then
                Selection.TypeText Text:=n
            End If
    End Sub
    

person asad41163    schedule 12.10.2017    source источник
comment
Ваш код нуждается в нескольких исправлениях (отсутствуют две кавычки «End With» вокруг = m и = n и т. д. Однако ваш код не перебирает все вхождения. Взгляните на следующий пример того, как найти все вхождения. Ваш if будет работать, если вы измените его на If Selection.Text = n, но у вас есть Selection.Find.Found, который возвращает true/false.   -  person Wayne G. Dunn    schedule 12.10.2017


Ответы (1)


Я изменил код, найденный по адресу: Повторение Microsoft Word VBA до тех пор, пока не закончится поиск результаты найдены, и он прокрутит документ и заменит последнюю букву (если это «m» или «n») каждого слова. ПРИМЕЧАНИЕ. В этом коде есть проверка цикла, которую вы можете удалить, если это возможно, вы можете найти более 2000 м или n.

Option Explicit

' The following code adapted from: https://stackoverflow.com/questions/13465709/repeating-microsoft-word-vba-until-no-search-results-found
Sub SearchFN()
    Dim iCount  As Integer
    Dim lStart  As Long
    'Always start at the top of the document
    Selection.HomeKey Unit:=wdStory

    'find a footnote to kick it off
    With Selection.Find
        .ClearFormatting
        .Text = "[nm]>"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchKashida = False
        .MatchDiacritics = False
        .MatchAlefHamza = False
        .MatchControl = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchFuzzy = False
        .MatchWildcards = True
        .Execute
    End With

    'Jump back to the start of the document.
    Selection.HomeKey Unit:=wdStory

    'If we find one then we can set off a loop to keep checking
    'I always put a counter in to avoid endless loops for one reason or another
    Do While Selection.Find.Found = True And iCount < 2000
        iCount = iCount + 1

        Selection.Find.Execute

        'On the last loop you'll not find a result so check here
        If Selection.Find.Found Then
            ' Exit if we start back at the beginning
            If Selection.Start < lStart Then
                Exit Do
            End If

            'Reset the find parameters
            With Selection.Find
                .ClearFormatting
                .Text = "[nm]>"
                If Selection.Text = "m" Then
                    Debug.Print "found 'm' at position: " & Selection.Start
                    Selection.Text = "n"
                ElseIf Selection.Text = "n" Then
                    Debug.Print "found 'n' at position: " & Selection.Start
                    Selection.Text = "m"
                End If
                lStart = Selection.Start
'                .Replacement.Text = ""
                .Forward = True
                .Wrap = wdFindContinue
                .Format = False
                .MatchCase = False
                .MatchWholeWord = False
                .MatchKashida = False
                .MatchDiacritics = False
                .MatchAlefHamza = False
                .MatchControl = False
                .MatchByte = False
                .MatchAllWordForms = False
                .MatchSoundsLike = False
                .MatchFuzzy = False
                .MatchWildcards = True
            End With
        End If
    Loop
End Sub
person Wayne G. Dunn    schedule 12.10.2017
comment
Большое спасибо, ваша помощь очень ценится. - person asad41163; 12.10.2017