Статьи из блога

Удаление лишних пробелов в Word

Если вы в силу специфики своей работы часто получаете документы Word, подготовленные кем-то другим, то наверняка встречали в текстах помимо орфографических ошибок, проблемы иного рода - лишние пробелы между словами или перед знаками препинания. Удалять их вручную утомительно и требует много времени.

 

Но можно значительно облегчить себе жизнь, если создать два макроса, которые самостоятельно и в мгновение ока избавят документ от этой напасти.

Макросы не оригинальны и созданы по мотивам советов авторов книги "Microsoft Word: комфортная работа с помощью макросов".

 

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

  1. Зайдите в меню Сервис (Tools), выберите команду Макрос (Macro) и из открывшегося списка выберите команду Начать запись (Record New Macro). Появится диалоговое окно, в котором следует назначить макросу имя (пусть будет DeleteSpace) и щелкнуть на кнопке с изображением молотка. Если вы не хотите выводить кнопку макроса на панель инструментов, а желаете пользоваться сочетаниями клавиш, то можете кликнуть на кнопке с изображением клавиатуры:

     

    Запись макроса
  2.  

  3. Откроется диалоговое окно, в котором вам следует перейти на среднюю вкладку Команды (Commands) и из правого поля перетащить на панель инструментов ваш новый макрос с названием Normal.NewMacros.DeleteSpace. Кстати, позже или прямо сейчас вы можете изменить стиль кнопки, отредактировав ее текст или назначив для кнопки какое-нибудь подходящее изображение.
  4. Закройте окно. После этого на рабочем окне документа появится панелька с управляющими кнопками для записи макроса:

     

    Панель записи макросов с управляющими кнопками
  5.  

  6. Теперь будьте аккуратны, так как макрос уже пишется. Нажмите сочетание клавиш CTRL+H. Откроется диалоговое окно Найти и Заменить. Для доступа к параметрам поиска нажмите кнопку Больше, если диалоговое окно представлено в краткой форме.
  7. Удалите всё, что находится в поле Найти и в поле Заменить на. Нажмите кнопку Снять форматирование, если эта кнопка активна. Снимите все галочки с режимов в группе Параметры поиска, но оставьте или поставьте галочку Подстановочные знаки. Выберите в открывающемся списке направление Везде.
  8. Выделите весь текст документа, нажав сочетание клавиш CTRL+A.
  9. Введите в поле Найти пробел, а потом введите следующее выражение:

     

    {2;}

     

    Здесь в фигурных скобках введена цифра 2, а сразу за ней точка с запятой. Это выражение означает, что будет произведен поиск двух и более расположенных подряд вхождений того знака, который стоит перед открывающейся фигурной скобкой. В нашем случае будет произведен поиск двух и более пробелов.

  10. Перейдите в поле Заменить на и введите один пробел.
  11. Нажмите кнопку Заменить все. Таким образом, если будет найдено несколько подряд стоящих пробелов, то все они заменятся на один пробел.
  12. После окончания поиска и замены закройте диалоговое окно Найти и Заменить. Снимите выделение текста, нажав на клавиатуре клавишу стрелки.
  13. Нажмите на кнопку с квадратиком в управляющей панели, чтобы остановить запись.

Для тех читателей, которые знают, как работать со встроенным в 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;}([.,:;\!\?])

     

    Это выражение буквально означает, что будет произведен поиск одного и более расположенных подряд пробелов, стоящих перед любым перечисленным в квадратных скобках знаком препинания.

  2. Перейдите в поле Заменить на и введите \1 (здесь единица означает порядковый номер выражения, заключенного в круглые скобки).
  3. Нажмите кнопку Заменить все.
  4. После окончания поиска и замены закройте диалоговое окно Найти и заменить. Снимите выделение текста, нажав на клавиатуре на клавишу стрелки.
  5. Нажмите на кнопку с квадратиком в управляющей панели, чтобы остановить запись.

Для знатоков 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, особенно при поиске лишних пробелов в тексте.

 

Ссылки по теме:

Удаление лишних пробелов в тексте документа

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru rutvit.ru myspace.com technorati.com digg.com friendfeed.com pikabu.ru blogger.com liveinternet.ru livejournal.ru memori.ru google.com bobrdobr.ru mister-wong.ru yahoo.com yandex.ru del.icio.us

Еще записи по вопросам использования Microsoft Word:

Комментариев: 21

  1. Леонид Бродский
    22.01.2007 в 11:01 | #1

    Выделение всего текста перед заменой лишнее, так как всё равно делаем \"Заменить все\". Я бы добавил ещё сюда удаление пробелов в начале абзаца. Уже без галочки перед \"Подстановочные знаки\" заменить ^p^w на ^p. Неплохо бы также удалить пробелы в конце абзаца (перед переводом строки) - заменить ^w^p на ^p. Можно удалить лишние переводы строк (чтобы заменить их на разрыв страницы) - заменить ^p^p на ^p и повторить несколько раз.

  2. Дмитрий
    24.01.2007 в 23:00 | #2

    Удобно, здорово, научно. Я до Вашей полезности делал кондово. Примерно так:выделить всё (Ctrl+A), найти (Ctrl+F), заменить (Alt+з), два пробела (spacebar+spacebar), табулятор (Tab), один пробел ((spacebar), заменить все (Alt+в). Повторял эту процедуру пару-тройку раз.

  3. Сергей
    13.02.2010 в 01:26 | #3

    Автор, в коде ошибка во втором.

    .Text = " {1;}([.,:;\!\?])"

    А должно быть:

    .Text = "{1;}([.,:;\!\?])"

    В описании для записи пошаговых действий всё правильно. Также в первом коде стоит ".Wrap = wdFindAsk" , хотя "спрашивать" не обязательно, ведь макрос должен сразу выдать результат с минимумом вопросов. Можно и в первом коде вставить тоже, что и во втором, т.е. ".Wrap = wdFindContinue"

  4. Сергей
    13.02.2010 в 01:31 | #4

    А, это у вас в форме автоматически срезается мой копипаст из символов smile Короче, во втором скрипте ошибка в строке

    With Selection.Find

    .Text =

    Вместо имеющегося там значения в кавычках должно быть " {1;}([.,:;\!\?])" (как указано в описании пошаговой записи макроса).

    Иначе скрипт не будет ничего находить.

  5. 13.02.2010 в 08:41 | #5

    Сергей, спасибо за поправки. Проверим.

    А для корректного размещения кода в комментариях нужно использовать теги

     и закрывающий тег pre.

    П.С. Добавил кнопки форматирования для комментариев. Позже подправлю вывод для кнопки "Код".

  6. Алексей
    03.07.2010 в 09:07 | #6

    Круть. спасибо ребята.

    Для второго правильный все-таки этот коммент был smile

    Вместо имеющегося там значения в кавычках должно быть " {1;}([.,:;\!\?])" (как указано в описании пошаговой записи макроса).

    тогда и правда все пашет

  7. Виктор
    18.10.2010 в 14:14 | #7

    Ребята, вы мне только что сэкономили 5 часов личного времени!!! СПАСИБО!!!

  8. Karritsa
    18.10.2010 в 16:12 | #8

    Ага! Это все замечательно... лишние пробелы, но, а как же недостающие?

    Например, часто пишут здравствуйте ,дорогие...

    Вот, лишний пробел уберем, а кто его поставит после запятой?

    Я делаю макрос со всеми знаками препинания отдельно.

    Думаю можно как-то оптимизировать этот процесс?

  9. 18.10.2010 в 18:28 | #9

    Надо делать проверку на присутствие пробела после запятой и, если это не число, например, то добавлять пробел.

  10. iasmer
    22.12.2010 в 14:44 | #10

    Антон, простите, не нашел похожего - не подскажите, как организовать поиск и замену с подставновками (.MatchWildcards = True) самого вопросительного знака "?"

    Ситуация: в тексте полно "жертв юникода" - конструкций типа:

    "...Это в общем?то реакция живущего и даже как?то..."

    пытаюсь заменить "?" на "-" путем

    QM = Chr(63)
    With Selection.Find
       .MatchWildcards = True
       .Text = "[а-я]" & QM & "[а-я]"
       .MatchCase = False
        While .Execute
            tmp = Selection.Text
            Selection.TypeText Text:=Replace(tmp, QM, "-", 1, 1, vbTextCompare)
            Selection.Collapse Direction:=wdCollapseEnd
        Wend
    End With

    однако, перебираются (т.е. "находятся") все тройки, где по краям буквы, и соответственно Replace и TypeText исполняются для каждой из них. Процесс уходит в бесконечность (текст на 630 стр.) iasmer( )nxt.ru

  11. 22.12.2010 в 19:11 | #11

    Можно и без макроса.

    В поле Найти:

    ([а-я])(\?)([а-я])

    В поле Заменить:

    \1-\3

  12. iasmer
    23.12.2010 в 12:24 | #12

    СПАСИБО!

    И подскажите, где посмотреть про подстановочные знаки, желательно с примерами - в хелпах о них более чем сдержано упомянуто.

  13. 23.12.2010 в 12:31 | #13

    Почитайте мою заметку: Найти и заменить: освойте поиск в редакторе Word

    В конце заметки приведена ссылка и на статью Сергея Хозяинова по подстановочным знакам.

  14. 24.12.2010 в 09:21 | #14

    Спасибоньки!

  15. Аноним
    25.12.2010 в 17:14 | #15

    А не подскажите, как сделать замену всех многочисленных пробелов на один в цикле 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

    Как сделать, чтобы он повторялся до тех пор, пока в тексте не останутся только одиночные пробелы?

    И раз уже спршивать, то сразу все =))

    Подскажите с кодом, когда нужно сделать, чтобы пробелы стояли с внешней стороны скобок (исключения, знаки препинания).

    Например: Исходник: один ( два ) , три. Результат: один (два), три.

    Спасибо=)

  16. 12.12.2011 в 09:37 | #16

    Здравствуйте, подскажите, макрос, удаляющий пробелы:

    1. В конце предложения после точки.

    2. В начале нового абзаца. Сначала идет пробел, затем само предложение.

    Желательно изменить/добавить в макрос №2 этой статьи или написать новый. Выручайте. Спасибо.

  17. 12.12.2011 в 10:52 | #17

    Простите, некорректно отобразились мои обозначения пробелов. Повторяю то же самое еще раз с другим обозначением:

    Здравствуйте, подскажите, макрос, удаляющий пробелы:
    1. В конце предложения после точки.

    В конце предложения после точки пробел нужен. Если Вы хотите удалить два пробела после точки и преобразовать их в один, то нужно сделать замену:

    [пробел]^p

    на

    ^p

    (где вместо выражения [пробел] нужно поставить пробел)

    Если Вы хотите удалить пробел в конце абзаца, то нужно сделать замену:

    .[пробел][пробел]

    на

    .[пробел]

    (где вместо выражения [пробел] нужно поставить пробел)

    2. В начале нового абзаца. Сначала идет пробел, затем само предложение.

    Можно сделать замену:

    ^p[пробел]

    на

    ^p

    (где вместо выражения [пробел] нужно поставить пробел)

  18. 12.12.2011 в 14:07 | #18

    Alex_Gur, большое спасибо.

  19. Аркадий
    14.12.2011 в 18:05 | #19

    Для лучшего отображения пробелов в диалоговом окне лучше всего использовать коды ASCII. Впечатываем ^0032 и получаем пробел. Впечатываем ^0013 и получаем знак абзаца. Работает как в режиме подстановочных символов, так и при простом поиске и замене. И еще. Поскольку коды можно использовать в режиме подстановки символов, то впечатываем в поле "Найти" ^0013^0032{1;} в поле "Заменить на" ^0013 и в результате удаляется любое количество пробелов в начале абзаца. Но есть одна проблема: если к абзацам применены разные стили, то стиль предшествующего абзаца заменяется на стиль последующего. И еще у меня исчезает во втором абзаце отступ. Работаю в Word 2010. Есть идеи, как избежать потери форматирования?

  20. Аноним
    20.01.2014 в 17:52 | #20

    А я, уважаемые господа, позвольте представиться - просто Чайник Самоварович. И многочисленным представителям моего дикого племени хочется просто включить комп, открыть Ворд, раз уж другого ничего нет, и просто работать, как на пишущей машинке. Сделайте уже простую программу, соответствующую стандартным условиям наиболее часто востребованных параметров текста, назовите её "программа-минимум" или "мини-меню"(шорт)- и чтобы там и шрифт был всеобщий, и положенные отступы автоматом, и интервал такой, какой требуется во всех редакциях - полуторный,скажем, и чтобы нужда сделать что-то если и возникала, то лишь в самых простых, незамысловатых действиях, типа размер штифта выбрать. И пусть на верхнем меню будет всего три-четыре кнопочки.) Всё остальное, раз оно тоже кому-то нужно, пусть подключается лишь после специальной команды, например: после нажатия в меню кнопочки "полное меню" или "лонг", или как-то вроде... - ибо сие уже от Лукавого...)))

    С уважением.))

  21. павел
    02.04.2015 в 21:29 | #21

    по мотивам статьи, ссылки и комментариев:

    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

Оставьте комментарий!

(обязательно)

^ Наверх