На главную страницу На домашнюю страницу автора | |||||||||||||||||||
![]() ![]() |
|||||||||||||||||||
|
Поиск инициалов при фамилии и вставка неразравных пробеловДля того, чтобы инициалы не "отрывались" от фамилии, после них вставляются неразравные пробелы. В этом макросе используются вспомогательные функции isUpper - проверка на верхний регистр, IsDigit - проверка на арабскую цифру и isRimDig - проверка на римскую цифру. Sub ИнициалPlusSpace()' Инициал_Space Макрос ' Ищет Инициал с точкой и вставляет nbsp Const NBSP As Integer = 160 ' Костанта "неразрывный пробел" (none breakable space) Dim st$ Selection.Find.ClearFormatting ' Очистим контекст поиска Do While Selection.Find.Execute(FindText:=".") ' Будем искать все точки Selection.MoveLeft Count:=3 Selection.MoveRight Count:=3, Extend:=wdExtend If isUpper(Selection.Text, 1) = True And isUpper(Selection.Text, 2) = True Then ' Нашли две заглавные буквы, ничего не делаем GoTo obhod End If Selection.MoveRight Selection.MoveLeft Count:=2 Selection.MoveRight Count:=4, Extend:=wdExtend If isUpper(Selection.Text, 1) = True And _ Asc(Mid(Selection.Text, 3, 1)) <> NBSP Then ' Нашли первый заглавный символ и не NBSP If IsDigit(Mid(Selection.Text, 4, 1)) = True Then ' Последней оказалась цифра, тоже ничего не делаем GoTo obhod End If Selection.MoveRight Extend:=wdExtend ' Расширим выделение If ( isUpper(Selection.Text, 4) = True And _ isUpper(Selection.Text, 5) = True) Or _ ( isUpper(Selection.Text, 4) = True And _ Mid(Selection.Text, 5, 1) = " ") Then ' Если последние две буквы заглавние или предпоследняя заглавная, ' а последний символ - пробел, то опять ничего не делаем GoTo obhod End If Selection.MoveLeft Extend:=wdExtend ' Сузим выделение ' Есть подозрение, что это инициал ' Случай 1 - после точки стоит обычный пробел If Mid(Selection.Text, 3, 1) = " " Then If ( isUpper(Selection.Text, 4) = True) Then Selection.MoveLeft Selection.MoveRight Count:=2 Selection.MoveRight Extend:=wdExtend Selection.Text = chr(NBSP) ' Меняем пробел на NBSP Selection.MoveRight End If GoTo obhod End If ' Случай 2 - пробела нет If isUpper(Selection.Text, 3) = True Then Selection.MoveLeft Selection.MoveRight Count:=2 Selection.InsertSymbol CharacterNumber:=NBSP ' Вставляем NBSP Selection.MoveRight End If End If obhod: Selection.MoveRight Loop End Sub |