Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Использование рег. выражений для поиска и замены текста - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Использование рег. выражений для поиска и замены текста (Макросы/Sub)
Использование рег. выражений для поиска и замены текста
aequit Дата: Суббота, 04.04.2015, 12:46 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 29
Репутация: 2 ±
Замечаний: 0% ±

Excel 2010
Здравствуйте! Периодически необходимо приводить в порядок телефонные справочники, в которых номера телефонов записаны как-попало.
Например, 89555555555 нужно заменить на 8-955-555-55-55. Да, есть Wildcard, но на сложные шаблоны он ругается.
Например, 8(9[0-9][0-9])([0-9][0-9][0-9])([0-9][0-9])([0-9][0-9]) для Wildcard непосильная задача.
Можно использовать 8(9[0-9][0-9])([0-9][0-9][0-9])([0-9][0-9]) и 8-\1-\2-\3-, в самых простых случаях работает, однако присылают порой такой зоопарк из телефонных номеров, что без использования регулярных выражений обойтись трудно.
Попытался сделать поиск и замену с использованием регулярных выражений, в обычном тексте с горем пополам работает, а вот таблицы после работы кода убиваются (а справочники обычно все в таблицах). Подскажите пожалуйста, в каком направлении дальше копать? :'(
[vba]
Код
Public Function regex$(strokain$, shablon$, sReplace$)
Dim Sout As String, RegExp As Object
Sout = strokain
     Set RegExp = CreateObject("VBScript.RegExp")
     RegExp.Global = True
     RegExp.Pattern = shablon
     Do
         If RegExp.Test(Sout) Then
             Sout = RegExp.Replace(Sout, sReplace)
         End If
     Loop While RegExp.Test(Sout)
     regex = Trim(Sout)
End Function

Sub findreplwregex()
Dim R As Object, tx As String
Set R = ActiveDocument.Range
R.Select
tx = Selection.Range
Dim strokain$, shablon$, sReplace$
  strokain = tx
  shablon = "(8)(9\d\d)(\d\d\d)(\d\d)(\d\d)"
  sReplace = "$1-$2-$3-$4-$5"
Selection.Range.Text = regex(strokain, shablon, sReplace)
End Sub
[/vba]
p.s. Что-то заглючило, никак не получается сохранить модуль с кодом в файле (
К сообщению приложен файл: telsprav.docm (17.0 Kb)


Сообщение отредактировал aequit - Суббота, 04.04.2015, 15:55
 
Ответить
СообщениеЗдравствуйте! Периодически необходимо приводить в порядок телефонные справочники, в которых номера телефонов записаны как-попало.
Например, 89555555555 нужно заменить на 8-955-555-55-55. Да, есть Wildcard, но на сложные шаблоны он ругается.
Например, 8(9[0-9][0-9])([0-9][0-9][0-9])([0-9][0-9])([0-9][0-9]) для Wildcard непосильная задача.
Можно использовать 8(9[0-9][0-9])([0-9][0-9][0-9])([0-9][0-9]) и 8-\1-\2-\3-, в самых простых случаях работает, однако присылают порой такой зоопарк из телефонных номеров, что без использования регулярных выражений обойтись трудно.
Попытался сделать поиск и замену с использованием регулярных выражений, в обычном тексте с горем пополам работает, а вот таблицы после работы кода убиваются (а справочники обычно все в таблицах). Подскажите пожалуйста, в каком направлении дальше копать? :'(
[vba]
Код
Public Function regex$(strokain$, shablon$, sReplace$)
Dim Sout As String, RegExp As Object
Sout = strokain
     Set RegExp = CreateObject("VBScript.RegExp")
     RegExp.Global = True
     RegExp.Pattern = shablon
     Do
         If RegExp.Test(Sout) Then
             Sout = RegExp.Replace(Sout, sReplace)
         End If
     Loop While RegExp.Test(Sout)
     regex = Trim(Sout)
End Function

Sub findreplwregex()
Dim R As Object, tx As String
Set R = ActiveDocument.Range
R.Select
tx = Selection.Range
Dim strokain$, shablon$, sReplace$
  strokain = tx
  shablon = "(8)(9\d\d)(\d\d\d)(\d\d)(\d\d)"
  sReplace = "$1-$2-$3-$4-$5"
Selection.Range.Text = regex(strokain, shablon, sReplace)
End Sub
[/vba]
p.s. Что-то заглючило, никак не получается сохранить модуль с кодом в файле (

Автор - aequit
Дата добавления - 04.04.2015 в 12:46
Kuzmich Дата: Суббота, 04.04.2015, 14:16 | Сообщение № 2
Группа: Проверенные
Ранг: Ветеран
Сообщений: 712
Репутация: 156 ±
Замечаний: 0% ±

Excel 2003
По вопросу применения регулярных выражений для телефонных номеров посмотрите здесь
http://vdasus.com/2011/11/03/regulyarnye-vyrazheniya-v-excel/
 
Ответить
СообщениеПо вопросу применения регулярных выражений для телефонных номеров посмотрите здесь
http://vdasus.com/2011/11/03/regulyarnye-vyrazheniya-v-excel/

Автор - Kuzmich
Дата добавления - 04.04.2015 в 14:16
aequit Дата: Суббота, 04.04.2015, 14:54 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 29
Репутация: 2 ±
Замечаний: 0% ±

Excel 2010
посмотрите здесь

Хорошая статья, много примеров для правки телефонных номеров. В Excelе как-то легче регэкспы можно использовать - прикрутил циклом перебор текста в диапазоне ячеек и там всё, что нужно ищется и меняется. А вот похожие функции к Word прикрутить не выходит. Кроме телефонных номеров может возникнуть необходимость использования сложных масок, с которыми Wildcard не справляется...
 
Ответить
Сообщение
посмотрите здесь

Хорошая статья, много примеров для правки телефонных номеров. В Excelе как-то легче регэкспы можно использовать - прикрутил циклом перебор текста в диапазоне ячеек и там всё, что нужно ищется и меняется. А вот похожие функции к Word прикрутить не выходит. Кроме телефонных номеров может возникнуть необходимость использования сложных масок, с которыми Wildcard не справляется...

Автор - aequit
Дата добавления - 04.04.2015 в 14:54
RAN Дата: Суббота, 04.04.2015, 18:02 | Сообщение № 4
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Копайте тута https://www.regex101.com/#javascript


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеКопайте тута https://www.regex101.com/#javascript

Автор - RAN
Дата добавления - 04.04.2015 в 18:02
aequit Дата: Воскресенье, 05.04.2015, 10:55 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 29
Репутация: 2 ±
Замечаний: 0% ±

Excel 2010
Да проблема не в том, как написать шаблон с использованием регулярных выражений, с этим всё понятно. Пусть в тексте нужно найти и обработать не телефонные номера, а что-либо посложнее, с чем не справляется Wildcard.
Есть функция, в неё передаётся 3 аргумента - текст для поиска, шаблон поиска и шаблон для замены. При использовании Find вместе с Wildcard проблем нет... Но если требуется использовать регулярные выражения, то в качестве аргумента в функцию приходится передавать весь текст в документе, как я могу выделить нужную часть текста для обработки, когда Find не поймет шаблон с синтаксисом регулярных выражений?
С обычным текстом код из первого сообщения работает, но если есть в документе таблица, то она удаляется. Здесь нужен какой-то иной подход, но даже направление, в каком двигаться дальше, не могу найти (
 
Ответить
СообщениеДа проблема не в том, как написать шаблон с использованием регулярных выражений, с этим всё понятно. Пусть в тексте нужно найти и обработать не телефонные номера, а что-либо посложнее, с чем не справляется Wildcard.
Есть функция, в неё передаётся 3 аргумента - текст для поиска, шаблон поиска и шаблон для замены. При использовании Find вместе с Wildcard проблем нет... Но если требуется использовать регулярные выражения, то в качестве аргумента в функцию приходится передавать весь текст в документе, как я могу выделить нужную часть текста для обработки, когда Find не поймет шаблон с синтаксисом регулярных выражений?
С обычным текстом код из первого сообщения работает, но если есть в документе таблица, то она удаляется. Здесь нужен какой-то иной подход, но даже направление, в каком двигаться дальше, не могу найти (

Автор - aequit
Дата добавления - 05.04.2015 в 10:55
anvg Дата: Воскресенье, 05.04.2015, 11:20 | Сообщение № 6
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
Доброе время суток
Используя RegExp - регулярные выражения получаете коллекцию Matches вхождений текста удовлетворяющих шаблону. Передаёте Find очередное найденное вхождение и текст для замены для всех найденных. Так как-то.
 
Ответить
СообщениеДоброе время суток
Используя RegExp - регулярные выражения получаете коллекцию Matches вхождений текста удовлетворяющих шаблону. Передаёте Find очередное найденное вхождение и текст для замены для всех найденных. Так как-то.

Автор - anvg
Дата добавления - 05.04.2015 в 11:20
aequit Дата: Воскресенье, 05.04.2015, 16:39 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 29
Репутация: 2 ±
Замечаний: 0% ±

Excel 2010
anvg, К сожалению, Find не умеет работать с шаблонами регулярных выражений, ему только Wildcard подавай, иногда этого мало (
Спасибо, кто откликнулся. Сначала не мог догадаться, как обрабатывать содержимое каждой ячейки. Долго стучал по клавишам и методом научного тыка решил проблему поиска и замены с использованием регулярных выражений внутри таблицы с помощью этого кода:
[vba]
Код
Dim A As Byte, B As Integer, LC As Byte, LR As Integer
Dim strokain$, shablon$, sReplace$
LC = ActiveDocument.Tables(1).Columns.Last.Index 'Получаем номер последнего столбца
LR = ActiveDocument.Tables(1).Rows.Last.Index 'Получаем номер последней строки
  For A = 1 To LC 'Циклом перебираем все столбцы
    For B = 1 To LR 'Для каждого столбца циклом перебираем все строки
      strokain = ActiveDocument.Tables(1).Cell(B, A).Range.Text
      strokain = Left$(strokain, VBA.Len(strokain) - 2) 'Удаляем лишние 2 символа
      shablon = "(8)(9\d\d)(\d\d\d)(\d\d)(\d\d)"
      sReplace = "$1-$2-$3-$4-$5"
      ActiveDocument.Tables(1).Cell(B, A).Range.Text = _
      regex(strokain, shablon, sReplace) 'передаём аргумента в функцию regex
      Next B
  Next A
[/vba]

Так таблица остаётся целой, что и желалось. :)
 
Ответить
Сообщениеanvg, К сожалению, Find не умеет работать с шаблонами регулярных выражений, ему только Wildcard подавай, иногда этого мало (
Спасибо, кто откликнулся. Сначала не мог догадаться, как обрабатывать содержимое каждой ячейки. Долго стучал по клавишам и методом научного тыка решил проблему поиска и замены с использованием регулярных выражений внутри таблицы с помощью этого кода:
[vba]
Код
Dim A As Byte, B As Integer, LC As Byte, LR As Integer
Dim strokain$, shablon$, sReplace$
LC = ActiveDocument.Tables(1).Columns.Last.Index 'Получаем номер последнего столбца
LR = ActiveDocument.Tables(1).Rows.Last.Index 'Получаем номер последней строки
  For A = 1 To LC 'Циклом перебираем все столбцы
    For B = 1 To LR 'Для каждого столбца циклом перебираем все строки
      strokain = ActiveDocument.Tables(1).Cell(B, A).Range.Text
      strokain = Left$(strokain, VBA.Len(strokain) - 2) 'Удаляем лишние 2 символа
      shablon = "(8)(9\d\d)(\d\d\d)(\d\d)(\d\d)"
      sReplace = "$1-$2-$3-$4-$5"
      ActiveDocument.Tables(1).Cell(B, A).Range.Text = _
      regex(strokain, shablon, sReplace) 'передаём аргумента в функцию regex
      Next B
  Next A
[/vba]

Так таблица остаётся целой, что и желалось. :)

Автор - aequit
Дата добавления - 05.04.2015 в 16:39
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Использование рег. выражений для поиска и замены текста (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!