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 Алексей Гончаров |