Вам не нужен VBA для этого. Это можно сделать с помощью простого подстановочного поиска и замены.
В диалоговом окне поиска и замены убедитесь, что установлен флажок подстановочного знака.
В поле «найти что» введите
'([0-9] {4,4}) ([0-9])' без ''
В поле «заменить на» введите
'\ 1 \ 2' снова без ''
Нажимайте «Заменить все», пока не получите ноль замен.
Что происходит?
[0-9] означает найти любой отдельный символ в диапазоне 0-9. Диапазон символов должен быть в порядке Ascii.
{,} означает найти количество символов, непосредственно предшествующих {}, поэтому
[0-9] {4,4} означает найти не менее 4 символов в диапазоне [0-9]
() означает помнить, что вы нашли.
в поле замены \ 1 говорит, что используйте первое «найти то», которое запомнилось (\ 2 второе «найти что» и т. Д.)
так
([0-9] {4,4}) ([0-9]) применяется к 1234567890
найдет и запомнит 1234 как \ 1 и 5 как \ 2
'заменить на' из \ 1 \ 2 даст нам
1234 56789
НО, потому что за 6789 не следует число, оно не будет найдено, поэтому вам нужно повторить замену всех.
Подробнее о поиске по шаблону можно прочитать здесь
https://wordmvp.com/FAQs/General/UsingWildcards.htm
Эквивалент VBA - запускать поиск / замену в цикле, пока условие поиска больше не будет найдено.
Sub test()
splitBigNumbers 3
End Sub
Public Sub splitBigNumbers(Optional splitAt As Long = 4)
replaceText_ReplaceAllWithWildcardOption ActiveDocument, Replace("([0-9]{###,###})([0-9])", "###", CStr(splitAt)), "\1 \2", True
End Sub
Sub replaceText_ReplaceAllWithWildcardOption(this_document As Word.Document, findText As String, replaceText As String, Optional useWildcard = False)
Dim my_continue As Boolean
Do
With this_document.StoryRanges(wdMainTextStory).Find
.ClearFormatting
.Format = False
.Wrap = wdFindContinue
.Text = findText
.Replacement.Text = replaceText
.Forward = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = useWildcard
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute Replace:=wdReplaceAll
my_continue = .Found
End With
Loop While my_continue
End Sub