Найти и заменить однозначные номера в MS Word - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь найти однозначные числа в MS Word (1-9) и заменить его словом т.е. (1 = один, 2 = два). Текущий код заменяет двузначные числа и выше. На данный момент единственное решение, которое я могу придумать, это добавить пробелы до и после определенного числа, но это не так точно.

Вот код, который я использую. TIA

Sub Single_Number()

Dim myDict: Set myDict = CreateObject("Scripting.Dictionary")

myDict("[1]{1}") = "one"
myDict("[2]{1}") = "two"
myDict("[3]{1}") = "three"
myDict("[4]{1}") = "four"
myDict("[5]{1}") = "five"
myDict("[6]{1}") = "six"
myDict("[7]{1}") = "seven"
myDict("[8]{1}") = "eight"
myDict("[9]{1}") = "nine"
Dim msword As Document, xWarp As Integer
For Each msword In Documents
msword.Activate
For myLoop = 0 To myDict.Count - 1
    change_words myDict.Keys()(myLoop), myDict.Items()(myLoop)
Next
Next msword
End Sub

Function change_words(ByVal findWord, ByVal replaceWord)
    If Selection.Type = wdSelectionIP Then
        ActiveDocument.Range(0, 0).Select
        xWarp = wdFindContinue
    Else
        xWarp = wdFindStop
    End If
    With Selection.Find
        .ClearFormatting
        .Text = findWord
        .Replacement.Text = replaceWord
        .Forward = True
        .Forward = True
        .Wrap = xWarp
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
        .Execute Replace:=wdReplaceAll
    End With
End Function

1 Ответ

0 голосов
/ 01 октября 2019

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

Приведенный ниже код был протестирован с

This 1 is 2 some 8 text 9. This is some7 more6 5 text

, который правильно преобразован в

This One is Two some Eight text Nine. This is some7 more6 Five text

Это код

Sub ReplaceSingleNumbersWithText()

' Set up a search term for a single digit where the single digit is preceded
' by a space and followed by a character that is not a number or a letter
Const DIGIT_SEARCH                      As String = "( )([XXX]{1})([!0-9a-zA-Z])"

Dim myDigitAsWord                       As Variant
Dim mySearchDoc                         As Word.Document
Dim myIndex                             As Long
Dim myFindText                          As String
Dim myReplaceText                       As String

    myDigitAsWord = Split("Zero,One,Two,Three,Four,Five,Six,Seven,Eight,Nine", ",")

    For Each mySearchDoc In Word.Application.Documents

        With mySearchDoc.StoryRanges(wdMainTextStory)

            With .Find

                .ClearFormatting
                .Forward = True
                .Wrap = wdFindContinue
                .Format = False
                .MatchCase = False
                .MatchWholeWord = False
                .MatchAllWordForms = False
                .MatchSoundsLike = False
                .MatchWildcards = True

            End With

            For myIndex = 0 To UBound(myDigitAsWord)

                myFindText = Replace(DIGIT_SEARCH, "XXX", CStr(myIndex))
                myReplaceText = "\1" & myDigitAsWord(myIndex) & "\3"
                .Find.Execute FindText:=myFindText, replacewith:=myReplaceText, Replace:=wdReplaceAll

            Next

        End With

    Next

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...