Страницы: 1
RSS
Как вытащить последовательность цифр из ячейки?
 
Доброе время суток.
У меня есть ячейки, в которых есть текстовая строка. Из строки нужно вытащить номер(8 цифр) если он есть. Если он есть, то он только один. Номер может быть в произволном месте в тексте ячейки. Вот пример ячейки:
1/AWD UKRAINA LTD 1/ID 33077342 2/OBIZNA 12/6G 3/UA/PETRUKIV C. TERNOPILJCJKUU H
Буду очень благодарен за помощь.
 
Т.е. этот номер всегда восьмизначный и начинается не меньше чем с 10000000? Т.е. первых нулей там быть не может, или могут?
Если автоматизировать бардак, то получится автоматизированный бардак.
 
wowick,нет, не может быть нулей. Ну если и потом могут возникнуть, то я смогу уже адаптировать алгоритм для 8-мизначного числа.
 
Код
Function Chislo(ячейка As Range)
Dim R, s
R = Split(ячейка, " ")
For Each s In R
 If Len(s) = 8 Then
    If IsNumeric(s) Then Chislo = s: Exit For
 End If
Next
End Function
 
Только так придумывается... regexp думаю тут как из пушки...
Код
Function vosem(s) As String
    Dim el
    For Each el In Split(s)
        If el Like "########" Then vosem = el: Exit Function
    Next
End Function

 
8-значный номер из строки:
Код
=0+ПСТР("|"&A1&"|";1+ПОИСКПОЗ(26;МУМНОЖ(Ч(ЕОШ(0+ПСТР(ПСТР("|"&A1&"|";СТРОКА(ИНДЕКС(A:A;1):ИНДЕКС(A:A;ДЛСТР(A1)-7));10);{1;2;3;4;5;6;7;8;9;10};1)));{13:1:1:1:1:1:1:1:1:13});0);8)

ну или более корректно:
Код
=0+ПСТР("|"&A1&"|";1+ПОИСКПОЗ(513;МУМНОЖ(Ч(ЕОШ(0+ПСТР(ПСТР("|"&A1&"|";СТРОКА(ИНДЕКС(A:A;1):ИНДЕКС(A:A;ДЛСТР(A1)-7));10);{1;2;3;4;5;6;7;8;9;10};1)));{1:2:4:8:16:32:64:128:256:512});0);8)

слева-справа от номера - пробелы или буквы или конец строки.
В формуле вместо "|" можно поставить любой отсутствующий в строке символ.
ЗЫ идея не моя, но честно адаптирована :)
F1 творит чудеса
 
первая функция(chislo) проходит цикл за 2,1с
вторая за 1,865

а если сначала проверять наличие номера, то за 0,156с
Код
Function number(s)
Dim el
If s Like "########" Then
    For Each el In Split(s)
        If el Like "########" Then number = el: Exit Function
    Next el
End If
End Function
это при равном количестве данных с номером и без в строке
Код
Sub q()
Dim s1$, s2$, i&, t!, x
s1 = "1/AWD UKRAINA LTD 1/ID 33077342 2/OBIZNA 12/6G 3/UA/PETRUKIV C. TERNOPILJCJKUU H"
s2 = "1/AWD UKRAINA LTD 1/ID  2/OBIZNA 12/6G 3/UA/PETRUKIV C. TERNOPILJCJKUU H"
t = Timer
For i = 1 To 99999
'    x = Chislo(s1)
'    x = Chislo(s2)
'    x = vosem(s1)
'    x = vosem(s2)
    x = number(s1)
    x = number(s2)
Next i
Debug.Print Timer - t
End Sub
Живи и дай жить..
 
Всем спасибо за помощь. Использовал функцию Hugo, и допилил макрос до коньца.
Правда не хотело работать коректно, просто иногда это число ишло сразу после "/", и даже замена простого Split'a на Split(s, " /") не помогла. Тогда я просто заменил все "/" на "/ ". Но главное, что дело было сделано.
Страницы: 1
Наверх