делаю генератор PCRE на основе excel. Созданные регэкспы используются в поисковике для поиска телефонных номеров в базе данных. На листе1 в ячейки B1:B200 вносятся телефонные номера, а при нажатии на кнопку, готовый "регэксп" копируется в буфер обмена. Вносимые номера содержат 7,10 или 11 цифр. На листе1 в ячейках M2 и M3 для сравнения даны коды: желаемый и который сейчас получается Нужно в каждом телефонном номере между цифрами разместить код «[^[:digit:]]*», а между телефонными номерами символ «|». Никаких других символов, включая пробелы, быть не должно Можно ли вообще эту задачу формулами решить?
Perl-совместимые регулярные выражения. Поисковик, как выяснилось, может обрабатывать код длинной 71000 символов (т.е. на 500 телефонных номеров, длинной 11 цифр каждый). Только при помощи формул мне не удалось такой код создать, поэтому 200 номеров.
вот честное слово - на такой вопрос так и подмывает ответить: 1. написать соответствующий макрос 2. запустить его.
почему просто нельзя честно попросить: "напишите мне такой макрос"? держите:
Код
Sub t()
Dim lr&, a, i&, j&, s$
With ActiveSheet
lr = .Cells(.Rows.Count, 2).End(xlUp).Row
a = .[b1].Resize(lr).Value
For i = 1 To UBound(a)
s = s & Left(a(i, 1), 1)
For j = 2 To Len(a(i, 1)): s = s & "[^[:digit:]]*" & Mid(a(i, 1), j, 1): Next
s = s & "|"
Next
s = Left(s, Len(s) - 1)
.[m4].Value = s
End With
End Sub
кстати,
Цитата
Chinno пишет: Поисковик, как выяснилось, может обрабатывать код длинной 71000 символов
учтите - в ячейку Excel столько буковок не влезет.
фрилансер Excel, VBA - контакты в профиле "Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
Sub qq()
Dim s As String, ra As Range, i As Long, k As Integer
Set ra = Range("B1:B5")
ReDim arr(1 To ra.Rows.Count) As String
For i = 1 To ra.Rows.Count
s = Mid(ra(i, 1), 1, 1)
For k = 2 To Len(ra(i, 1))
s = s & "[^[:digit:]]*" & Mid(ra(i, 1), k, 1)
Next k
arr(i) = s
Next i
s = Join(arr, "|")
'Range("M4") = s
End Sub
Огромно спасибо, работает как часы. В ячейку влезает код на 230 11-значных номеров. У меня вопрос по этому макросу: если результат помещать не в ячейку M4, а копировать в буфер обмена, то возможно ли сгенерировать код большей длинны, номеров на 500?
Sub t()
Dim str$, strc$, c As Range
With CreateObject("vbscript.regexp")
.ignorecase = False: .Global = True: .MultiLine = True: .Pattern = "(\d)"
For Each c In [b1:b5]
str = .Replace(c.Value, "[^[:digit:]]*$1")
strc = strc & "|" & Mid$(str, 14)
Next
End With
Range("M5") = Mid$(strc, 2)
End Sub
ну тогда уж без циклов и прочих лишних телодвижений
Код
Sub t()
Set r = CreateObject("vbscript.regexp"): r.Global = True: r.Pattern = "(?=\d)(\d)(?=\d)"
With ActiveSheet
.[m6] = r.Replace(Join(Application.Transpose(.[b1].Resize(.Cells(.Rows.Count, 2).End(xlUp).Row).Value), "|"), "$1[^[:digit:]]*")
End With
End Sub
Спасибо за несколько вариантов решения, хотя мне и первого хватило за глаза. Только подскажите пожалуйста ещё одну вещь, что нужно изменить в коде, чтобы результат копировался не в ячейку, а только в буфер обмена. Заранее спасибо.
Chinno, из правил форума (которые Вы, очевидно, не читали):
Цитата
Прежде чем задать вопрос - поищите на него ответ поиском по форуму и посмотрите статьи в Приемах. Здесь уже обсуждалось более 45 000 вопросов - вполне возможно (и даже скорее всего!), кто-то уже нашел решение.
Что и как именно Вы пытались искать?
фрилансер Excel, VBA - контакты в профиле "Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг