Статьи из блога
Удаление лишних пробелов в Word
Если вы в силу специфики своей работы часто получаете документы Word, подготовленные кем-то другим, то наверняка встречали в текстах помимо орфографических ошибок, проблемы иного рода - лишние пробелы между словами или перед знаками препинания. Удалять их вручную утомительно и требует много времени.
Но можно значительно облегчить себе жизнь, если создать два макроса, которые самостоятельно и в мгновение ока избавят документ от этой напасти.
Макросы не оригинальны и созданы по мотивам советов авторов книги "Microsoft Word: комфортная работа с помощью макросов".
Для начала откройте какой-нибудь документ, который вы предполагаете проверить, или же сами создайте такой документ, намеренно добавив в текст лишние пробелы между словами и перед знаками препинания. Первым мы создадим макрос, который будет удалять лишние пробелы между словами.
- Зайдите в меню Сервис (Tools), выберите команду Макрос (Macro) и из открывшегося списка выберите команду Начать запись (Record New Macro). Появится диалоговое окно, в котором следует назначить макросу имя (пусть будет DeleteSpace) и щелкнуть на кнопке с изображением молотка. Если вы не хотите выводить кнопку макроса на панель инструментов, а желаете пользоваться сочетаниями клавиш, то можете кликнуть на кнопке с изображением клавиатуры:
- Откроется диалоговое окно, в котором вам следует перейти на среднюю вкладку Команды (Commands) и из правого поля перетащить на панель инструментов ваш новый макрос с названием Normal.NewMacros.DeleteSpace. Кстати, позже или прямо сейчас вы можете изменить стиль кнопки, отредактировав ее текст или назначив для кнопки какое-нибудь подходящее изображение.
- Закройте окно. После этого на рабочем окне документа появится панелька с управляющими кнопками для записи макроса:
- Теперь будьте аккуратны, так как макрос уже пишется. Нажмите сочетание клавиш CTRL+H. Откроется диалоговое окно Найти и Заменить. Для доступа к параметрам поиска нажмите кнопку Больше, если диалоговое окно представлено в краткой форме.
- Удалите всё, что находится в поле Найти и в поле Заменить на. Нажмите кнопку Снять форматирование, если эта кнопка активна. Снимите все галочки с режимов в группе Параметры поиска, но оставьте или поставьте галочку Подстановочные знаки. Выберите в открывающемся списке направление Везде.
- Выделите весь текст документа, нажав сочетание клавиш CTRL+A.
- Введите в поле Найти пробел, а потом введите следующее выражение:
{2;}
Здесь в фигурных скобках введена цифра 2, а сразу за ней точка с запятой. Это выражение означает, что будет произведен поиск двух и более расположенных подряд вхождений того знака, который стоит перед открывающейся фигурной скобкой. В нашем случае будет произведен поиск двух и более пробелов.
- Перейдите в поле Заменить на и введите один пробел.
- Нажмите кнопку Заменить все. Таким образом, если будет найдено несколько подряд стоящих пробелов, то все они заменятся на один пробел.
- После окончания поиска и замены закройте диалоговое окно Найти и Заменить. Снимите выделение текста, нажав на клавиатуре клавишу стрелки.
- Нажмите на кнопку с квадратиком в управляющей панели, чтобы остановить запись.
Для тех читателей, которые знают, как работать со встроенным в Microsoft Word редактором Visual Basic, я просто приведу готовый код макроса:
Sub DeleteSpace() Selection.WholeStory Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = " {2;}" .Replacement.Text = " " .Forward = True .Wrap = wdFindAsk .Format = False .MatchCase = False .MatchWholeWord = False .MatchAllWordForms = False .MatchWildcards = True End With Selection.Find.Execute Replace:=wdReplaceAll Selection.MoveRight Unit:=wdCharacter, Count:=1 End Sub
Второй созданный нами макрос будет находить и удалять все лишние пробелы перед знаками препинания. Повторите шаги с 1 по 6 включительно. Назовите макрос как DeleteSpacePunctuationMark.
Дальнейшие шаги:
- Введите в поле Найти сначала пробел, а потом введите следующее выражение:
{1;}([.,:;\!\?])
Это выражение буквально означает, что будет произведен поиск одного и более расположенных подряд пробелов, стоящих перед любым перечисленным в квадратных скобках знаком препинания.
- Перейдите в поле Заменить на и введите \1 (здесь единица означает порядковый номер выражения, заключенного в круглые скобки).
- Нажмите кнопку Заменить все.
- После окончания поиска и замены закройте диалоговое окно Найти и заменить. Снимите выделение текста, нажав на клавиатуре на клавишу стрелки.
- Нажмите на кнопку с квадратиком в управляющей панели, чтобы остановить запись.
Для знатоков VB - код для вставки в редактор VisualBasic:
Sub DelSpacePunktMark() Selection.WholeStory Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = " {1;}([.,:;\!\?])" .Replacement.Text = "\1" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = True End With Selection.Find.Execute Replace:=wdReplaceAll Selection.MoveLeft Unit:=wdCharacter, Count:=1 End Sub
Так вы избавитесь от рутины ручных действий, которые, увы, неизбежны при редактировании любых документов Word, особенно при поиске лишних пробелов в тексте.
Ссылки по теме:
Удаление лишних пробелов в тексте документа
Метки: лишние пробелы | макросы | поиск и замена | форматирование
Просмотров: 75964
Подписаться на комментарии по RSS
Версия для печати
Еще записи по вопросам использования Microsoft Word:
- 3 способа очистки списка недавно открытых документов
- Word 2007: полотно, рисунки, линии
- Word 97. Слияние документов как один из способов упростить свою работу
- Абзац с цветным фоном
- Автозаполняемые колонтитулы
- Автоматическая запись макроса
- Автоматическая нумерация билетов
- Автоматическая расстановка переносов
- Автоматическое обновление полей при открытии документа
- Автоматическое сохранение документа при его закрытии
- Автотекст с последовательной нумерацией
- Автоформат документов
- Буквица
- Быстрая смена ориентации страниц документа
- Быстрое изменение стиля форматирования текста
- Быстрое перемещение между открытыми документами Word
- Быстрое создание нового документа на основе шаблона
- Быстрое удаление границ у таблицы
- Быстрый ввод текста с помощью команды =rand()
- Быстрый поиск форматированного текста
- В чем различие между Автозаменой и Автотекстом
- В чем различие между стилями Обычный (Normal) и Основной текст (Body Text)?
- Ввод повторяющихся фрагментов текста в Word 2007
- Ввод часто повторяющихся фрагментов текста
- Вставка будущей даты
Комментариев: 21
Выделение всего текста перед заменой лишнее, так как всё равно делаем \"Заменить все\". Я бы добавил ещё сюда удаление пробелов в начале абзаца. Уже без галочки перед \"Подстановочные знаки\" заменить ^p^w на ^p. Неплохо бы также удалить пробелы в конце абзаца (перед переводом строки) - заменить ^w^p на ^p. Можно удалить лишние переводы строк (чтобы заменить их на разрыв страницы) - заменить ^p^p на ^p и повторить несколько раз.
Удобно, здорово, научно. Я до Вашей полезности делал кондово. Примерно так:выделить всё (Ctrl+A), найти (Ctrl+F), заменить (Alt+з), два пробела (spacebar+spacebar), табулятор (Tab), один пробел ((spacebar), заменить все (Alt+в). Повторял эту процедуру пару-тройку раз.
Автор, в коде ошибка во втором.
А должно быть:
В описании для записи пошаговых действий всё правильно. Также в первом коде стоит ".Wrap = wdFindAsk" , хотя "спрашивать" не обязательно, ведь макрос должен сразу выдать результат с минимумом вопросов. Можно и в первом коде вставить тоже, что и во втором, т.е. ".Wrap = wdFindContinue"
А, это у вас в форме автоматически срезается мой копипаст из символов Короче, во втором скрипте ошибка в строке
With Selection.Find
.Text =
Вместо имеющегося там значения в кавычках должно быть " {1;}([.,:;\!\?])" (как указано в описании пошаговой записи макроса).
Иначе скрипт не будет ничего находить.
Сергей, спасибо за поправки. Проверим.
А для корректного размещения кода в комментариях нужно использовать теги
Круть. спасибо ребята.
Для второго правильный все-таки этот коммент был
Вместо имеющегося там значения в кавычках должно быть " {1;}([.,:;\!\?])" (как указано в описании пошаговой записи макроса).
тогда и правда все пашет
Ребята, вы мне только что сэкономили 5 часов личного времени!!! СПАСИБО!!!
Ага! Это все замечательно... лишние пробелы, но, а как же недостающие?
Например, часто пишут здравствуйте ,дорогие...
Вот, лишний пробел уберем, а кто его поставит после запятой?
Я делаю макрос со всеми знаками препинания отдельно.
Думаю можно как-то оптимизировать этот процесс?
Надо делать проверку на присутствие пробела после запятой и, если это не число, например, то добавлять пробел.
Антон, простите, не нашел похожего - не подскажите, как организовать поиск и замену с подставновками (.MatchWildcards = True) самого вопросительного знака "?"
Ситуация: в тексте полно "жертв юникода" - конструкций типа:
"...Это в общем?то реакция живущего и даже как?то..."
пытаюсь заменить "?" на "-" путем
однако, перебираются (т.е. "находятся") все тройки, где по краям буквы, и соответственно Replace и TypeText исполняются для каждой из них. Процесс уходит в бесконечность (текст на 630 стр.) iasmer( )nxt.ru
Можно и без макроса.
В поле Найти:
В поле Заменить:
СПАСИБО!
И подскажите, где посмотреть про подстановочные знаки, желательно с примерами - в хелпах о них более чем сдержано упомянуто.
Почитайте мою заметку: Найти и заменить: освойте поиск в редакторе Word
В конце заметки приведена ссылка и на статью Сергея Хозяинова по подстановочным знакам.
Спасибоньки!
А не подскажите, как сделать замену всех многочисленных пробелов на один в цикле While?
То есть вот код
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = " "
.Replacement.Text = " "
.Forward = True
.Wrap = wdFindAsk
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchWildcards = True
End With
Selection.Find.Execute Replace:=wdReplaceAll
Как сделать, чтобы он повторялся до тех пор, пока в тексте не останутся только одиночные пробелы?
И раз уже спршивать, то сразу все =))
Подскажите с кодом, когда нужно сделать, чтобы пробелы стояли с внешней стороны скобок (исключения, знаки препинания).
Например: Исходник: один ( два ) , три. Результат: один (два), три.
Спасибо=)
Здравствуйте, подскажите, макрос, удаляющий пробелы:
1. В конце предложения после точки.
2. В начале нового абзаца. Сначала идет пробел, затем само предложение.
Желательно изменить/добавить в макрос №2 этой статьи или написать новый. Выручайте. Спасибо.
Простите, некорректно отобразились мои обозначения пробелов. Повторяю то же самое еще раз с другим обозначением:
В конце предложения после точки пробел нужен. Если Вы хотите удалить два пробела после точки и преобразовать их в один, то нужно сделать замену:
[пробел]^p
на
^p
(где вместо выражения [пробел] нужно поставить пробел)
Если Вы хотите удалить пробел в конце абзаца, то нужно сделать замену:
.[пробел][пробел]
на
.[пробел]
(где вместо выражения [пробел] нужно поставить пробел)
Можно сделать замену:
^p[пробел]
на
^p
(где вместо выражения [пробел] нужно поставить пробел)
Alex_Gur, большое спасибо.
Для лучшего отображения пробелов в диалоговом окне лучше всего использовать коды ASCII. Впечатываем ^0032 и получаем пробел. Впечатываем ^0013 и получаем знак абзаца. Работает как в режиме подстановочных символов, так и при простом поиске и замене. И еще. Поскольку коды можно использовать в режиме подстановки символов, то впечатываем в поле "Найти" ^0013^0032{1;} в поле "Заменить на" ^0013 и в результате удаляется любое количество пробелов в начале абзаца. Но есть одна проблема: если к абзацам применены разные стили, то стиль предшествующего абзаца заменяется на стиль последующего. И еще у меня исчезает во втором абзаце отступ. Работаю в Word 2010. Есть идеи, как избежать потери форматирования?
А я, уважаемые господа, позвольте представиться - просто Чайник Самоварович. И многочисленным представителям моего дикого племени хочется просто включить комп, открыть Ворд, раз уж другого ничего нет, и просто работать, как на пишущей машинке. Сделайте уже простую программу, соответствующую стандартным условиям наиболее часто востребованных параметров текста, назовите её "программа-минимум" или "мини-меню"(шорт)- и чтобы там и шрифт был всеобщий, и положенные отступы автоматом, и интервал такой, какой требуется во всех редакциях - полуторный,скажем, и чтобы нужда сделать что-то если и возникала, то лишь в самых простых, незамысловатых действиях, типа размер штифта выбрать. И пусть на верхнем меню будет всего три-четыре кнопочки.) Всё остальное, раз оно тоже кому-то нужно, пусть подключается лишь после специальной команды, например: после нажатия в меню кнопочки "полное меню" или "лонг", или как-то вроде... - ибо сие уже от Лукавого...)))
С уважением.))
по мотивам статьи, ссылки и комментариев:
Sub DelSpace()
' DelSpace Макрос
'
' УДАЛЯЕМ лишние пробелы (заменяем 2 и более пробелов одним)
'
Selection.WholeStory
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = " {2;}"
.Replacement.Text = " "
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchWildcards = True
End With
Selection.Find.Execute Replace:=wdReplaceAll
Selection.MoveRight Unit:=wdCharacter, Count:=1
'
'УДАЛЯЕМ пробел ПЕРЕД знаками пунктуации, ), % и концом абзаца
'
Selection.WholeStory
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = " {1;}([.,:;\!\?\%)\^0013])"
.Replacement.Text = "\1"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
End With
Selection.Find.Execute Replace:=wdReplaceAll
Selection.MoveLeft Unit:=wdCharacter, Count:=1
'
'УДАЛЯЕМ пробел ПОСЛЕ "(" и в начале абзаца (кроме первого)
'
Selection.WholeStory
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "([\(^0013])^0032"
.Replacement.Text = "\1"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
End With
Selection.Find.Execute Replace:=wdReplaceAll
Selection.MoveLeft Unit:=wdCharacter, Count:=1
'
'ВСТАВЛЯЕМ пробел ПОСЛЕ знаков пунктуации, % и ), если после них нет пробела, цифры или конца абзаца
'
Selection.WholeStory
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "([.,:;\!\?\)%])([!^0032^00130123456789])"
.Replacement.Text = "\1^0032\2"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
End With
Selection.Find.Execute Replace:=wdReplaceAll
Selection.MoveLeft Unit:=wdCharacter, Count:=1
'
'ВСТАВЛЯЕМ пробел ПЕРЕД "(", если это не начало абзаца
'
Selection.WholeStory
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "([!^0032^0013])\("
.Replacement.Text = "\1 ("
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
End With
Selection.Find.Execute Replace:=wdReplaceAll
Selection.MoveLeft Unit:=wdCharacter, Count:=1
End Sub