Убирает многократные пробелы в выделенном тексте, а также пробелы перед знаками препинания. [vba]
Код
Sub УБРАТЬ_ЛИШНИЕ_ПРОБЕЛЫ() If Selection.Type <> wdSelectionNormal Then Exit Sub With Selection.Find .Execute "^w", , , 0, , , , , , " ", 2 ' заменить множественные пробелы на один .Execute "^p^w", , , 0, , , , , , "^p", 2 ' убрать пробелы в начале абзаца (после ^p) .Execute "^w^p", , , 0, , , , , , "^p", 2 ' убрать пробелы в конце абзаца (перед ^p) End With Dim i%, sPunkt$ sPunkt = ".,;:!?)" & Chr(133) ' список знаков пунктуации, перед которыми нужно убирать пробелы For i = 1 To Len(sPunkt) ' убрать пробелы перед знаками пунктуации Selection.Find.Execute _ " " & Mid(sPunkt, i, 1), , , 0, , , , , , Mid(sPunkt, i, 1) & " ", 2 Next End Sub
[/vba] Не пойму, почему после закрывающей круглой скобки добавляет лишний пробел?
Убирает многократные пробелы в выделенном тексте, а также пробелы перед знаками препинания. [vba]
Код
Sub УБРАТЬ_ЛИШНИЕ_ПРОБЕЛЫ() If Selection.Type <> wdSelectionNormal Then Exit Sub With Selection.Find .Execute "^w", , , 0, , , , , , " ", 2 ' заменить множественные пробелы на один .Execute "^p^w", , , 0, , , , , , "^p", 2 ' убрать пробелы в начале абзаца (после ^p) .Execute "^w^p", , , 0, , , , , , "^p", 2 ' убрать пробелы в конце абзаца (перед ^p) End With Dim i%, sPunkt$ sPunkt = ".,;:!?)" & Chr(133) ' список знаков пунктуации, перед которыми нужно убирать пробелы For i = 1 To Len(sPunkt) ' убрать пробелы перед знаками пунктуации Selection.Find.Execute _ " " & Mid(sPunkt, i, 1), , , 0, , , , , , Mid(sPunkt, i, 1) & " ", 2 Next End Sub
[/vba] Не пойму, почему после закрывающей круглой скобки добавляет лишний пробел?Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Вторник, 20.12.2011, 15:44
Да, Серёга, и в самом деле... Это я проглядел Но я же переставлял не просто так: у меня и до перестановки что-то глюкало (правда, не помню, что…) вот я и переставил: показалось, что так будет лучше. Да и ещё к стыду своему спешил выполнить обещание кинуть "затравку" в ветку и поэтому забыл указать твой копирайт... Завтра поправлю в остальных постах. Извини. Должно быть так:[vba]
Код
Sub УБРАТЬ_ЛИШНИЕ_ПРОБЕЛЫ() '--------------------------------------------------------------------------------------- ' Procedure : УБРАТЬ_ЛИШНИЕ_ПРОБЕЛЫ ' Author : KuklP ' Purpose : убрать многократные пробелы и пробелы перед некоторыми знаками пунктуации ' Notes : '--------------------------------------------------------------------------------------- If Selection.Type <> wdSelectionNormal Then Exit Sub Dim i%, sPunkt$ sPunkt = ".,;:!?)" & Chr(133) ' список знаков пунктуации, перед которыми нужно убирать пробелы With Selection.Find For i = 1 To Len(sPunkt) ' убрать пробелы перед знаками пунктуации .Execute "^w" & Mid(sPunkt, i, 1), , , 0, , , , , 0, Mid(sPunkt, i, 1) & " ", 2 Next .Execute "^w", , , 0, , , , , 0, " ", 2 ' заменить множественные пробелы на один .Execute "^p^w", , , 0, , , , , 0, "^p", 2 ' убрать пробелы в начале абзаца (после ^p) .Execute "^w^p", , , 0, , , , , 0, "^p", 2 ' убрать пробелы в конце абзаца (перед ^p) End With End Sub
[/vba]
Да, Серёга, и в самом деле... Это я проглядел Но я же переставлял не просто так: у меня и до перестановки что-то глюкало (правда, не помню, что…) вот я и переставил: показалось, что так будет лучше. Да и ещё к стыду своему спешил выполнить обещание кинуть "затравку" в ветку и поэтому забыл указать твой копирайт... Завтра поправлю в остальных постах. Извини. Должно быть так:[vba]
Код
Sub УБРАТЬ_ЛИШНИЕ_ПРОБЕЛЫ() '--------------------------------------------------------------------------------------- ' Procedure : УБРАТЬ_ЛИШНИЕ_ПРОБЕЛЫ ' Author : KuklP ' Purpose : убрать многократные пробелы и пробелы перед некоторыми знаками пунктуации ' Notes : '--------------------------------------------------------------------------------------- If Selection.Type <> wdSelectionNormal Then Exit Sub Dim i%, sPunkt$ sPunkt = ".,;:!?)" & Chr(133) ' список знаков пунктуации, перед которыми нужно убирать пробелы With Selection.Find For i = 1 To Len(sPunkt) ' убрать пробелы перед знаками пунктуации .Execute "^w" & Mid(sPunkt, i, 1), , , 0, , , , , 0, Mid(sPunkt, i, 1) & " ", 2 Next .Execute "^w", , , 0, , , , , 0, " ", 2 ' заменить множественные пробелы на один .Execute "^p^w", , , 0, , , , , 0, "^p", 2 ' убрать пробелы в начале абзаца (после ^p) .Execute "^w^p", , , 0, , , , , 0, "^p", 2 ' убрать пробелы в конце абзаца (перед ^p) End With End Sub
Насчет копирайта не парься, мне от него ни холодно ни жарко. Главное, чтоб от наших каракулей польза кому-нить была. А вот 0 на формат ты зря убрал. Мало ли, что юзер искал до нас: [vba]
Код
.Execute "^w", , , 0, , , , , 0, " ", 2
[/vba] И думаю, ты зря называешь макросы кириллицей. В нелокализованных версиях могут быть проблемы.
Насчет копирайта не парься, мне от него ни холодно ни жарко. Главное, чтоб от наших каракулей польза кому-нить была. А вот 0 на формат ты зря убрал. Мало ли, что юзер искал до нас: [vba]
Код
.Execute "^w", , , 0, , , , , 0, " ", 2
[/vba] И думаю, ты зря называешь макросы кириллицей. В нелокализованных версиях могут быть проблемы.KuklP
Ну с НДС и мы чего-то стoим! kuklp60@gmail.com WM Z206653985942, R334086032478, U238399322728
Сообщение отредактировал KuklP - Вторник, 20.12.2011, 19:46
На счёт формата ты, конечно, прав... Я совсем забыл, что условия поиска-замены запоминаются и перед использованием макроса юзверг мог что-то искать с применением формата... Ща поправлю во всех местах.
А по поводу кириллического названия макросов, так тут ведь я показываю принцип действия. Это же не "Готовые решения" (пока это там было бы оффтопом). И поэтому называю макросы как мне нравится. А кто сидит не на русской локали, вполне может и подправить "под себя". К стати, в названиях своих UDF Excel я как раз специально использую русские названия чтобы было так же как в обычных формулах листа.
На счёт формата ты, конечно, прав... Я совсем забыл, что условия поиска-замены запоминаются и перед использованием макроса юзверг мог что-то искать с применением формата... Ща поправлю во всех местах.
А по поводу кириллического названия макросов, так тут ведь я показываю принцип действия. Это же не "Готовые решения" (пока это там было бы оффтопом). И поэтому называю макросы как мне нравится. А кто сидит не на русской локали, вполне может и подправить "под себя". К стати, в названиях своих UDF Excel я как раз специально использую русские названия чтобы было так же как в обычных формулах листа.Alex_ST
Alex_ST, приветствую! Особо не проверял, но попробуй так:
[vba]
Code
Sub io() With CreateObject("VBScript.RegExp") .Global = True .MultiLine = True .Pattern = "^[\t ]+|[\t ](?=[\t ]|[(.,:;…!?)])|[\t ]$" Selection.Text = .Replace(Selection.Text, "") End With End Sub
[/vba]
Alex_ST, приветствую! Особо не проверял, но попробуй так:
[vba]
Code
Sub io() With CreateObject("VBScript.RegExp") .Global = True .MultiLine = True .Pattern = "^[\t ]+|[\t ](?=[\t ]|[(.,:;…!?)])|[\t ]$" Selection.Text = .Replace(Selection.Text, "") End With End Sub
Саша, привет! У Алексея применен диалект Regexp, используемый непосредственно в механизме поиска и замены Word, т.к. нет другого способа не нарушить форматирование абзацев.
Саша, привет! У Алексея применен диалект Regexp, используемый непосредственно в механизме поиска и замены Word, т.к. нет другого способа не нарушить форматирование абзацев.v__step
Это ещё мягко сказано: "Глупый"! Более тупого приложения Мелко-мягких из числа поддерживающих VBA-прграммирование я ещё не встречал! Ни свойств, ни методов, ни событий, … Я ТУТ попробовал помочь сделать на листе не выводимую на печать кнопку для вызова макроса. Думал, наивный, что по аналогии с Ёкселем всё будет просто Нет ни у кнопок, ни у фигур свойства "Выводить на печать"! Я у них даже .Visible не смог найти. И макрос к клику по фигурам не назначается... Додумался до того, чтобы разместить кнопку на форме, а перед печатью форму скрывать (UserForm.Show/Hide там всё-таки есть), но оказалось что невозможно отловить событие-аналог BeforePrint Ёкселя А когда недавно попытался реализовать автосохранение документа по таймеру, то выяснил, что метод SaveCopyAs хоть и существует, но не у ThisDocument, а только у HTMLProjectItem object … Ну, просто бред какой-то!
Quote (nerv)
Кто ж мог подумать, что Word такой глупый
Это ещё мягко сказано: "Глупый"! Более тупого приложения Мелко-мягких из числа поддерживающих VBA-прграммирование я ещё не встречал! Ни свойств, ни методов, ни событий, … Я ТУТ попробовал помочь сделать на листе не выводимую на печать кнопку для вызова макроса. Думал, наивный, что по аналогии с Ёкселем всё будет просто Нет ни у кнопок, ни у фигур свойства "Выводить на печать"! Я у них даже .Visible не смог найти. И макрос к клику по фигурам не назначается... Додумался до того, чтобы разместить кнопку на форме, а перед печатью форму скрывать (UserForm.Show/Hide там всё-таки есть), но оказалось что невозможно отловить событие-аналог BeforePrint Ёкселя А когда недавно попытался реализовать автосохранение документа по таймеру, то выяснил, что метод SaveCopyAs хоть и существует, но не у ThisDocument, а только у HTMLProjectItem object … Ну, просто бред какой-то! Alex_ST
Alex_ST, не то слово) Но все равно, та рега, кот. я написал как минимум пригодится мне в Excel. Только вместо [\t ] буду использовать \s Насчет ворда. Эксперимент показал, что если не трогать при замене переводы строк, то формат не рушиться. Вот только как его обойти с минимальными потерями
Alex_ST, не то слово) Но все равно, та рега, кот. я написал как минимум пригодится мне в Excel. Только вместо [\t ] буду использовать \s Насчет ворда. Эксперимент показал, что если не трогать при замене переводы строк, то формат не рушиться. Вот только как его обойти с минимальными потерями nerv
Чебурашка стал символом олимпийских игр. А чего достиг ты? Тишина - самый громкий звук
Это выше моего понимания, к сожалению... Даже если
Quote (nerv)
вместо [\t ] ... использовать \s
всё равно яснее не становится... Надо читать Бена Форту, а некогда: утром в метро ещё не проснулся, вечером засыпается, на работе и дома не получается никак
Это выше моего понимания, к сожалению... Даже если
Quote (nerv)
вместо [\t ] ... использовать \s
всё равно яснее не становится... Надо читать Бена Форту, а некогда: утром в метро ещё не проснулся, вечером засыпается, на работе и дома не получается никак Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Среда, 18.01.2012, 14:40
[/vba] Весь паттерн можно разбить на три части (кот. "связаны" или): 1. ^[\t ]+ - все знаки пробела или табуляции в начале строки 2. [\t ](?=[\t ]|[(.,:;…!?)]) - знако пробела или табуляции за котором следует еще один знак пробела или табуляции или одни из символов, перечисленных в символьном классе. Тут можно быть записать проще. Например, так [\t ](?=[(\t .,:;…!?)]) (не проверял, но по идее должно работать) 3. [\t ]$ - знак пробела или табуляции в конце "строки". Опять-таки, как сейчас мне кажется, можно было записать так [\t ]+$.
Т.е. все регулярное выражение выглядело бы примерно так var z = /^\s+|\s+$|\s(?=[\s(.,:;…!?)])/gm; и удаляло бы любые пробельные символы, включая пробел, табуляцию, переводы строк и другие юникодные пробельные символы.
[/vba] Весь паттерн можно разбить на три части (кот. "связаны" или): 1. ^[\t ]+ - все знаки пробела или табуляции в начале строки 2. [\t ](?=[\t ]|[(.,:;…!?)]) - знако пробела или табуляции за котором следует еще один знак пробела или табуляции или одни из символов, перечисленных в символьном классе. Тут можно быть записать проще. Например, так [\t ](?=[(\t .,:;…!?)]) (не проверял, но по идее должно работать) 3. [\t ]$ - знак пробела или табуляции в конце "строки". Опять-таки, как сейчас мне кажется, можно было записать так [\t ]+$.
Т.е. все регулярное выражение выглядело бы примерно так var z = /^\s+|\s+$|\s(?=[\s(.,:;…!?)])/gm; и удаляло бы любые пробельные символы, включая пробел, табуляцию, переводы строк и другие юникодные пробельные символы.
Ой, ребятушки, вы уж извините, совсем меня Чернобыль одолел. Потом, все потом - уже немножко осталось. Вчера дома долбанулся ногой - обо что не важно, но испугался, что не доплетусь до работы - считать некому... В общем, выживаем как можем. Но я все-таки надеюсь, что выползу. Первым делом буду добивать чистилку - это мой должок
Quote (nerv)
Володя придет поправит
Ой, ребятушки, вы уж извините, совсем меня Чернобыль одолел. Потом, все потом - уже немножко осталось. Вчера дома долбанулся ногой - обо что не важно, но испугался, что не доплетусь до работы - считать некому... В общем, выживаем как можем. Но я все-таки надеюсь, что выползу. Первым делом буду добивать чистилку - это мой должокv__step
Рушится. Попробуем так: напишем одно слово и выделим через одну буквы жирным шрифтом. Потом запустим такую процедуру: [vba]
Код
Sub ПрощайФормат() Dim s As String s = Selection.Text Selection.Text = Left(s, Len(s) - 1) End Sub
[/vba]Иначе и быть не может (иначе бедный Word должен выполнить очень сложный анализ - как что было отформатировано "до" и что с этим делать "после"). Лёша&Сережа спасли ситуацию выходом на Word-RegExp. Это был сильный ход. Кстати, не исключено, что и в этом случае форматирование когда-то может слететь (трудно протестировать все возможные ситуации)
Привет, мужики! С Крещением!
Цитата (nerv)
формат не рушиться
Рушится. Попробуем так: напишем одно слово и выделим через одну буквы жирным шрифтом. Потом запустим такую процедуру: [vba]
Код
Sub ПрощайФормат() Dim s As String s = Selection.Text Selection.Text = Left(s, Len(s) - 1) End Sub
[/vba]Иначе и быть не может (иначе бедный Word должен выполнить очень сложный анализ - как что было отформатировано "до" и что с этим делать "после"). Лёша&Сережа спасли ситуацию выходом на Word-RegExp. Это был сильный ход. Кстати, не исключено, что и в этом случае форматирование когда-то может слететь (трудно протестировать все возможные ситуации)v__step
С уважением, Владимир
Сообщение отредактировал v__step - Четверг, 19.01.2012, 10:59
Пожалуй, Володя прав) Насчет Excel, для себя я остановился на таком решении с ненужными пробельными символами [vba]
Code
Sub io() Dim x As String x = ActiveCell.Value With CreateObject("VBScript.RegExp") .Global = True .MultiLine = True .Pattern = "\n+|\t+" x = .Replace(x, " ") .Pattern = "^\s+|\s+$|\s+(?=[\s.,:;…!?)])" ActiveCell.Value = .Replace(x, "") End With End Sub
[/vba]
Пожалуй, Володя прав) Насчет Excel, для себя я остановился на таком решении с ненужными пробельными символами [vba]
Code
Sub io() Dim x As String x = ActiveCell.Value With CreateObject("VBScript.RegExp") .Global = True .MultiLine = True .Pattern = "\n+|\t+" x = .Replace(x, " ") .Pattern = "^\s+|\s+$|\s+(?=[\s.,:;…!?)])" ActiveCell.Value = .Replace(x, "") End With End Sub
Ну да, а ещё сделать так чтобы не одну ячейку обрабатывала, а выделенный диапазон. Надо ей аргументы как ParamAppay передавать и цикл по ним организовать... Саня, а не оффтопим ли мы? Ведь топик-то про Word!
Ну да, а ещё сделать так чтобы не одну ячейку обрабатывала, а выделенный диапазон. Надо ей аргументы как ParamAppay передавать и цикл по ним организовать... Саня, а не оффтопим ли мы? Ведь топик-то про Word!Alex_ST