WWW.TEKCT.RU

Разбиение текста на абзацы

Многие сталкиваются с испорченными текстами, когда, к примеру, копируют в Word неправильно форматированный текст с сайтов. Проблема здесь в том, что каждая строка текста находится в отдельном абзаце, что неправильно по смыслу. Такой текст можно исправить на 99% с помощью макроса.

Sub Преобразовать_абзацы()
z = "!.?…:"
Do
Selection.EndKey Unit:=wdLine
Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
 If InStr(Selection.Style, "Заголовок") = 0 And Asc(Selection.Text) = 13 Then
 Selection.MoveLeft Unit:=wdCharacter, Count:=1
 Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
  If InStr(z, Selection.Text) = 0 Then ' удаляем знак абзаца
  Selection.EndKey Unit:=wdLine
  Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
  Selection.Delete Unit:=wdCharacter, Count:=1
  Selection.TypeText Text:=" "
  Selection.MoveLeft Unit:=wdCharacter, Count:=2
  End If
 Else
 Selection.MoveDown Unit:=wdLine, Count:=1
 End If
 If Selection.MoveDown(Unit:=wdLine, Count:=1) <> 1 Then Exit Do
Loop
End Sub

Будем считать, что абзац в правильном тексте должен заканчиваться одним из знаков препинания (которые собраны в строке z). Есть, правда, вероятность, что конец предложения внутри абзаца придется на конец строки, но эта вероятность невелика. В любом случае, если требования к качеству текста жесткие, придется просмотреть его и исправить, где нужно. Кроме того, не будем учитывать случаи, когда абзац заканчивается точкой с запятой или кавычками (но, при желании, в строку z можно добавить другие символы).

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

Зато, если заголовки в тексте отформатированы стилем «Заголовок», макрос это учитывает и пропускает их (как известно, заголовки не заканчиваются знаком пунктуации). Конечно, можно добавить и другие названия стилей, но это усложнит код.

Итак, принцип работы макроса таков: если в конце строки стоит символ абзаца, а перед ним нет знака препинания из указанного набора, этот символ абзаца подлежит удалению. На его место записывается пробел, чтобы не «склеились» стоящие рядом слова. Иными словами, мы автоматически соединяем несколько неправильных абзацев в один правильный.

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

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

26.05.2011

Алексей Гончаров

Рейтинг@Mail.ru Rambler's Top100