Форум программистов, компьютерный форум, киберфорум
MS Office Word
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 18.02.2020
Сообщений: 2
1

Нужен макрос для замены обычного пробела на неразрывный

22.02.2020, 10:34. Показов 2920. Ответов 4
Метки нет (Все метки)

Доброго времени суток!
Ребят, я долгое время давал советы и помогал студентам, осваивающим word, но теперь помощь нужна мне, и я очень надеюсь, что круговорот добра в природе все же сработает))
Помогите, пожалуйста, с макросами разобраться. Или другой вариант решения ситуации.

Дано: огромный текст страниц на 300. В этом тексте периодически встречаются фамилии и инициалы. Типа "Иванов А.Б. говорил, что..." или "Тема встречается в трудах Л.С. Петрова". Суть в том, что нужен макрос, который заменит обычный пробел между инициалами и фамилией на неразрывный пробел. Я пробовал что-то писать, но у меня заменялся пробел еще местами по тексту.

Заранее спасибо) Всем добра и печенек)
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.02.2020, 10:34
Ответы с готовыми решениями:

Нужен макрос для автоматической замены переменных в формулах
Доброго дня всем! Пожалуйста, помогите написать макрос. В прикрепленном файле Пример макрос...

Нужен Wi-Fi для обычного ПК
Есть роутер, есть комп с матплатой GigaByte GA-P41-ES3G Вопрос: есть ли на ней разъем куда...

Макрос для выделения таблицы после пробела
Есть две таблицы разделенные несколькими строками. Нужно выделить нижнию таблицу. Пробывала этот...

Макрос для замены значения
Добрый день! Имеется таблица с критериями и их значениями. Нужно заменить значения в таблице...

4
8237 / 4476 / 1756
Регистрация: 11.02.2013
Сообщений: 9,512
22.02.2020, 16:07 2
Лучший ответ Сообщение было отмечено Debero как решение

Решение

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub ReplaceSpaceWithUnbreakableSpace()
    With ActiveDocument.Range.Find
        'Фамилия, инициалы
        .Text = "([А-ЯЁ]{1}[а-яё]@) ([А-ЯЁ]{1}.[А-ЯЁ]{1}.)"
        .Replacement.Text = "\1^0160\2"
        .MatchWildcards = True
        .Execute Replace:=wdReplaceAll
        'Инициалы, фамилия
        .Text = "([А-ЯЁ]{1}.[А-ЯЁ]{1}.) ([А-ЯЁ]{1}[а-яё]@)"
        .Execute Replace:=wdReplaceAll
    End With
End Sub
1
0 / 0 / 0
Регистрация: 18.02.2020
Сообщений: 2
22.02.2020, 19:26  [ТС] 3
ViterAlex, огромное спасибо! Все работает..
Если вам несложно, можно еще вопрос..
Что нужно добавить в код, чтобы между инициалами появился пробел обычный или неразрывный? Например, вместо "Иванов А.Б." или "А.Б. Иванов" должно получиться "Иванов А. Б."? или "А. Б. Иванов"?
Я не писал макросы, но основы программирования понимаю, но все равно ловлю затуп на вашем коде. Как вы показали, что именно пробел меняться должен?
В 4 строке, очевидно, текст для поиска, где буквы в скобках показывают, что любая сойдет из диапазона.
В 5 строке - заменяющий текст, 0160 - это альт-код неразрывного пробела, а \1 и \2? И зачем {1}?
Интересен сам принцип...
0
8237 / 4476 / 1756
Регистрация: 11.02.2013
Сообщений: 9,512
23.02.2020, 17:04 4
Лучший ответ Сообщение было отмечено Debero как решение

Решение

Цитата Сообщение от Debero Посмотреть сообщение
В 5 строке - заменяющий текст, 0160 - это альт-код неразрывного пробела, а \1 и \2? И зачем {1}?
В строке поиска в круглых скобках находятся группы: первая группа ([А-ЯЁ]{1}[а-яё]@), вторая группа ([А-ЯЁ]{1}.[А-ЯЁ]{1}.). А в строке замены номера этих групп: \1, \2 и т.д. Число в фигурных скобках указывает сколько раз может встречаться предыдущее выражение. Т.е. [А-ЯЁ]{1} означает, что нужно найти только одну прописную букву
Цитата Сообщение от Debero Посмотреть сообщение
Как вы показали, что именно пробел меняться должен?
Никак. В выражении поиска вся строка разбита на группы: инициалы ([А-ЯЁ]{1}.[А-ЯЁ]{1}.) и фамилия ([А-ЯЁ]{1}[а-яё]@), а между ними пробел. В выражении замены мы разделяем первую и вторую группы нужным символом.
Имея эту информацию, ты можешь попробовать решить задачу с разделением инициалов.
0
0 / 0 / 0
Регистрация: 13.05.2019
Сообщений: 1
24.05.2021, 12:50 5
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Attribute VB_Name = "NewMacros"
Sub FIO()
 
    With ActiveDocument.Range.Find
        'Фамилия, инициалы без пробела
        .Text = "([А-ЯЁ]{1}[а-яё]@) ([А-ЯЁ]{1}.)([А-ЯЁ]{1}.)"
        .Replacement.Text = "\1^0160\2^0160\3"
        .MatchWildcards = True
        .Execute Replace:=wdReplaceAll
        'Фамилия, инициалы с пробелом
        .Text = "([А-ЯЁ]{1}[а-яё]@) ([А-ЯЁ]{1}.) ([А-ЯЁ]{1}.)"
        .Execute Replace:=wdReplaceAll
        'Инициалы, фамилия без пробела
        .Text = "([А-ЯЁ]{1}.)([А-ЯЁ]{1}.) ([А-ЯЁ]{1}[а-яё]@)"
        .Execute Replace:=wdReplaceAll
        'Инициалы, фамилия с пробелом
        .Text = "([А-ЯЁ]{1}.) ([А-ЯЁ]{1}.) ([А-ЯЁ]{1}[а-яё]@)"
        .Execute Replace:=wdReplaceAll
    End With
End Sub
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.05.2021, 12:50

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Макрос для замены текста
Доброго дня, всем) Необходима помощь в создании макроса, который будет заменять текст в одном...

Макрос для замены фигур на пользовательские
Доброго времени суток! Ребят появилась такая задача, при создании организационной диаграммы нужен...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.