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

Вход

Регистрация

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

 

= Мир MS Excel/Проверка и сплитование строки на основе регулярног выражения - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Проверка и сплитование строки на основе регулярног выражения (Макросы/Sub)
Проверка и сплитование строки на основе регулярног выражения
Aligatro Дата: Суббота, 27.09.2014, 22:42 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Всем привет. Пожалуй перейду сразу в общем имеется скрипт (писал не я, помогли) который по определенному признаку (коды оператора, которые указаны в массиве) отделяет мобильные номера в таблице от городских. Скрипт работает отлично, но так как он опирается на скобки возле кода (050), иногда случаются ложные срабатывания. Я хотел бы попросить помощи у тех кто разбирается в VBA, помогите пожалуйста переделать скрипт так, что бы он детектировал номера не по скобочкам, а по следующему регулярному выражению:

Код
\b\(?(039|050|063|066|067|068|091|092|093|094|095|096|097|098|099)\)?\s?\-?\d{3}\s?\-?\d{2}\s?\-?\d{2}\b


Единственное, я не совсем уверен в верности регулярки, кажется я ошибся с окончанием строки (\b).

Сам скрипт:
[vba]
Код

Public Sub QWERT()
Dim R, C, i
Dim OD: Set OD = CreateObject("Scripting.Dictionary")
Dim T: Set T = CreateObject("Scripting.Dictionary")
Dim M(), RZ(), U() As String
Dim MB
M = Array(39, 50, 63, 66, 67, 68, 91, 92, 93, 94, 95, 96, 97, 98, 99)

'закидываем в словарь префиксы
For R = 0 To UBound(M)
      T("(0" & M(R) & ")") = 1
Next R

'считываем в маассив данные
With Ëèñò1
      M = .Range("A1:G" & .Cells(.Rows.Count, 1).End(xlUp).Row)
End With
      ReDim RZ(1 To UBound(M), 1 To UBound(M, 2) + 2)
        
'перебираем все строки массива
      For R = 1 To UBound(M)
'    отделяеем название фирмы
          If InStr(1, M(R, 1), ",") > 0 Then
              C = Split(M(R, 1), ",")(0)
              RZ(R, 1) = C
              RZ(R, 2) = Replace(M(R, 1), C & ",", "")
          Else
              RZ(R, 1) = M(R, 1)
          End If
              RZ(R, 3) = M(R, 2)
' ищем мобильные операторы

              U = Split(M(R, 3), ",")
              For i = 0 To UBound(U)
              Debug.Print i, UBound(U), U(i), R
                  If T.Exists(Left(U(i), 5)) Then
                      RZ(R, 4) = IIf(RZ(R, 4) = "", U(i), RZ(R, 4) & "," & U(i))
                  Else
                      RZ(R, 5) = IIf(RZ(R, 5) = "", U(i), RZ(R, 5) & "," & U(i))
                  End If
              Next i
              For i = 4 To UBound(M, 2)
                  RZ(R, i + 2) = M(R, i)
              Next i
      Next R
      Worksheets.Add
      Range("A1").Resize(UBound(RZ), UBound(RZ, 2)) = RZ
      Cells.Columns.AutoFit
      Cells.Rows.AutoFit

End Sub
[/vba]

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

Большое спасибо.
К сообщению приложен файл: example2.xls (79.0 Kb)


Сообщение отредактировал Aligatro - Суббота, 27.09.2014, 22:43
 
Ответить
СообщениеВсем привет. Пожалуй перейду сразу в общем имеется скрипт (писал не я, помогли) который по определенному признаку (коды оператора, которые указаны в массиве) отделяет мобильные номера в таблице от городских. Скрипт работает отлично, но так как он опирается на скобки возле кода (050), иногда случаются ложные срабатывания. Я хотел бы попросить помощи у тех кто разбирается в VBA, помогите пожалуйста переделать скрипт так, что бы он детектировал номера не по скобочкам, а по следующему регулярному выражению:

Код
\b\(?(039|050|063|066|067|068|091|092|093|094|095|096|097|098|099)\)?\s?\-?\d{3}\s?\-?\d{2}\s?\-?\d{2}\b


Единственное, я не совсем уверен в верности регулярки, кажется я ошибся с окончанием строки (\b).

Сам скрипт:
[vba]
Код

Public Sub QWERT()
Dim R, C, i
Dim OD: Set OD = CreateObject("Scripting.Dictionary")
Dim T: Set T = CreateObject("Scripting.Dictionary")
Dim M(), RZ(), U() As String
Dim MB
M = Array(39, 50, 63, 66, 67, 68, 91, 92, 93, 94, 95, 96, 97, 98, 99)

'закидываем в словарь префиксы
For R = 0 To UBound(M)
      T("(0" & M(R) & ")") = 1
Next R

'считываем в маассив данные
With Ëèñò1
      M = .Range("A1:G" & .Cells(.Rows.Count, 1).End(xlUp).Row)
End With
      ReDim RZ(1 To UBound(M), 1 To UBound(M, 2) + 2)
        
'перебираем все строки массива
      For R = 1 To UBound(M)
'    отделяеем название фирмы
          If InStr(1, M(R, 1), ",") > 0 Then
              C = Split(M(R, 1), ",")(0)
              RZ(R, 1) = C
              RZ(R, 2) = Replace(M(R, 1), C & ",", "")
          Else
              RZ(R, 1) = M(R, 1)
          End If
              RZ(R, 3) = M(R, 2)
' ищем мобильные операторы

              U = Split(M(R, 3), ",")
              For i = 0 To UBound(U)
              Debug.Print i, UBound(U), U(i), R
                  If T.Exists(Left(U(i), 5)) Then
                      RZ(R, 4) = IIf(RZ(R, 4) = "", U(i), RZ(R, 4) & "," & U(i))
                  Else
                      RZ(R, 5) = IIf(RZ(R, 5) = "", U(i), RZ(R, 5) & "," & U(i))
                  End If
              Next i
              For i = 4 To UBound(M, 2)
                  RZ(R, i + 2) = M(R, i)
              Next i
      Next R
      Worksheets.Add
      Range("A1").Resize(UBound(RZ), UBound(RZ, 2)) = RZ
      Cells.Columns.AutoFit
      Cells.Rows.AutoFit

End Sub
[/vba]

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

Большое спасибо.

Автор - Aligatro
Дата добавления - 27.09.2014 в 22:42
Aligatro Дата: Воскресенье, 28.09.2014, 06:08 | Сообщение № 2
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Я тут подшаманил немного и переработал исходный код (пару мануалов + помощь) и получилось вполне сносно и полностью подходит под мои нужды. Но возникла небольшая проблема. Вместо того, что-бы таблица расширялась на еще один доп. столбец, наоборот, замещает данные в ячейках соседнего, так как в синтасисе vba я не особо силен, то не смог детектировать проблему. Если не затруднит, посмотрите пожалуйста.

 
Ответить
СообщениеЯ тут подшаманил немного и переработал исходный код (пару мануалов + помощь) и получилось вполне сносно и полностью подходит под мои нужды. Но возникла небольшая проблема. Вместо того, что-бы таблица расширялась на еще один доп. столбец, наоборот, замещает данные в ячейках соседнего, так как в синтасисе vba я не особо силен, то не смог детектировать проблему. Если не затруднит, посмотрите пожалуйста.


Автор - Aligatro
Дата добавления - 28.09.2014 в 06:08
AndreTM Дата: Воскресенье, 28.09.2014, 06:31 | Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
Ну, то есть о чём я и говорил. "Всё работает отлично, но как-то не так, как нужно" :)
По идее, вам продемонстрировали пример без регулярок - зачем вы будете влезать с ними? И с "последней запятой" тоже - можно было просто в хелпе посмотреть, что есть InStrRev...
Код я вам поправил на основе исходного, а не вашего, попробуйте хоть в этом варианте разобраться...
И да, "вид предприятия" тоже неплохо бы повесить на словарь, чтобы в него не отбирались всякие филиалы и пр.

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


И да, номера телефонов можно тоже переделать под шаблон. Допишем код:
К сообщению приложен файл: 10-13213-1-1.xls (90.0 Kb) · 10-13213-1-2.xls (98.0 Kb)


Skype: andre.tm.007
Donate: Qiwi: 9517375010


Сообщение отредактировал AndreTM - Воскресенье, 28.09.2014, 07:26
 
Ответить
СообщениеНу, то есть о чём я и говорил. "Всё работает отлично, но как-то не так, как нужно" :)
По идее, вам продемонстрировали пример без регулярок - зачем вы будете влезать с ними? И с "последней запятой" тоже - можно было просто в хелпе посмотреть, что есть InStrRev...
Код я вам поправил на основе исходного, а не вашего, попробуйте хоть в этом варианте разобраться...
И да, "вид предприятия" тоже неплохо бы повесить на словарь, чтобы в него не отбирались всякие филиалы и пр.

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


И да, номера телефонов можно тоже переделать под шаблон. Допишем код:

Автор - AndreTM
Дата добавления - 28.09.2014 в 06:31
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Проверка и сплитование строки на основе регулярног выражения (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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