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

Вход

Регистрация

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

 

= Мир MS Excel/извлечь число между двумя разными символами - Мир MS Excel

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

Доброго времени суток.

Никак не могу сообразить подобрать регулярку, прошу помощи

Нужно извлечь число, между двумя разными символами "_" и "С"

"RawData_LN14838_40C.csv" - извлечь 40
"RawData_LN14838_60.5C.csv" - извлечь 60.5
"RawData_LN14838_20C.csv" - извлечь 20

[vba]
Код
Sub test()
    arr = Array("RawData_LN14838_40C.csv", "RawData_LN14838_60.5C.csv", "RawData_LN14838_20C.csv")
    For i = 0 To 2
        Debug.Print RegExpExtract(CStr(arr(i)), "_(\S+)C")
    Next
End Sub

Public Function RegExpExtract(Text As String, Pattern As String, Optional Item As Integer = 1) As String
    On Error GoTo ErrHandl
    Set regex = CreateObject("VBScript.RegExp")
    regex.Pattern = Pattern
    regex.Global = True
    If regex.test(Text) Then
        Set matches = regex.Execute(Text)
        RegExpExtract = matches.Item(Item - 1)
        Exit Function
    End If
ErrHandl:
    RegExpExtract = CVErr(xlErrValue)
End Function
[/vba]
 
Ответить
СообщениеДоброго времени суток.

Никак не могу сообразить подобрать регулярку, прошу помощи

Нужно извлечь число, между двумя разными символами "_" и "С"

"RawData_LN14838_40C.csv" - извлечь 40
"RawData_LN14838_60.5C.csv" - извлечь 60.5
"RawData_LN14838_20C.csv" - извлечь 20

[vba]
Код
Sub test()
    arr = Array("RawData_LN14838_40C.csv", "RawData_LN14838_60.5C.csv", "RawData_LN14838_20C.csv")
    For i = 0 To 2
        Debug.Print RegExpExtract(CStr(arr(i)), "_(\S+)C")
    Next
End Sub

Public Function RegExpExtract(Text As String, Pattern As String, Optional Item As Integer = 1) As String
    On Error GoTo ErrHandl
    Set regex = CreateObject("VBScript.RegExp")
    regex.Pattern = Pattern
    regex.Global = True
    If regex.test(Text) Then
        Set matches = regex.Execute(Text)
        RegExpExtract = matches.Item(Item - 1)
        Exit Function
    End If
ErrHandl:
    RegExpExtract = CVErr(xlErrValue)
End Function
[/vba]

Автор - irabel
Дата добавления - 03.05.2024 в 11:52
Nic70y Дата: Пятница, 03.05.2024, 13:40 | Сообщение № 2
Группа: Друзья
Ранг: Экселист
Сообщений: 8791
Репутация: 2283 ±
Замечаний: 0% ±

Excel 2010
[vba]
Код
Sub test()
    arr = Array("RawData_LN14838_40C.csv", "RawData_LN14838_60.5C.csv", "RawData_LN14838_20C.csv")
    For i = 0 To 2
        Debug.Print RegExpExtract(arr(i))
    Next
End Sub
Function RegExpExtract(u)
    a = InStrRev(u, "C")
    b = InStrRev(u, "_")
    RegExpExtract = Mid(u, b + 1, a - b - 1)
End Function
[/vba]


ЮMoney 41001841029809
 
Ответить
Сообщение[vba]
Код
Sub test()
    arr = Array("RawData_LN14838_40C.csv", "RawData_LN14838_60.5C.csv", "RawData_LN14838_20C.csv")
    For i = 0 To 2
        Debug.Print RegExpExtract(arr(i))
    Next
End Sub
Function RegExpExtract(u)
    a = InStrRev(u, "C")
    b = InStrRev(u, "_")
    RegExpExtract = Mid(u, b + 1, a - b - 1)
End Function
[/vba]

Автор - Nic70y
Дата добавления - 03.05.2024 в 13:40
i691198 Дата: Пятница, 03.05.2024, 21:25 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 223
Репутация: 85 ±
Замечаний: 0% ±

irabel, Добрый вечер. А зачем макросы, да ещё и с регуляркой, это можно сделать и обычными формулами.
Код
=ПОДСТАВИТЬ(ПРАВСИМВ(A1;ДЛСТР(A1)-16);"C.csv";"")
, или
Код
=СЖПРОБЕЛЫ(ПРАВСИМВ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(A1;"_";ПОВТОР(" ";100));"C.csv";"");100))
, или
=ФИЛЬТР.XML("<t><s>"&ПОДСТАВИТЬ(ПОДСТАВИТЬ(A1;"_";"</s><s>");"C.csv";"")&"</s></t>";"//s[last()]")


Сообщение отредактировал i691198 - Пятница, 03.05.2024, 21:26
 
Ответить
Сообщениеirabel, Добрый вечер. А зачем макросы, да ещё и с регуляркой, это можно сделать и обычными формулами.
Код
=ПОДСТАВИТЬ(ПРАВСИМВ(A1;ДЛСТР(A1)-16);"C.csv";"")
, или
Код
=СЖПРОБЕЛЫ(ПРАВСИМВ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(A1;"_";ПОВТОР(" ";100));"C.csv";"");100))
, или
=ФИЛЬТР.XML("<t><s>"&ПОДСТАВИТЬ(ПОДСТАВИТЬ(A1;"_";"</s><s>");"C.csv";"")&"</s></t>";"//s[last()]")

Автор - i691198
Дата добавления - 03.05.2024 в 21:25
Kuzmich Дата: Суббота, 04.05.2024, 14:45 | Сообщение № 4
Группа: Проверенные
Ранг: Ветеран
Сообщений: 712
Репутация: 156 ±
Замечаний: 0% ±

Excel 2003
Цитата
Нужно извлечь число, между двумя разными символами "_" и "С"

UDF
[vba]
Код
Function iChislo(cell$)
With CreateObject("VBScript.RegExp")
     .Global = True
     .MultiLine = True
     .Pattern = "\d_(.+)(?:C)"
   If .test(cell) Then
     iChislo = .Execute(cell)(0).SubMatches(0)
   Else
     iChislo = ""
   End If
End With
End Function
[/vba]
 
Ответить
Сообщение
Цитата
Нужно извлечь число, между двумя разными символами "_" и "С"

UDF
[vba]
Код
Function iChislo(cell$)
With CreateObject("VBScript.RegExp")
     .Global = True
     .MultiLine = True
     .Pattern = "\d_(.+)(?:C)"
   If .test(cell) Then
     iChislo = .Execute(cell)(0).SubMatches(0)
   Else
     iChislo = ""
   End If
End With
End Function
[/vba]

Автор - Kuzmich
Дата добавления - 04.05.2024 в 14:45
i691198 Дата: Воскресенье, 05.05.2024, 11:33 | Сообщение № 5
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 223
Репутация: 85 ±
Замечаний: 0% ±

Ешё можно сделать так, использовать паттерн [vba]
Код
.Pattern = "[^\_]+$"
[/vba] он извлечет текст после последнего подчеркивания. А потом какой то текстовой функцией, например Replase, обрезать символы "C.csv".
 
Ответить
СообщениеЕшё можно сделать так, использовать паттерн [vba]
Код
.Pattern = "[^\_]+$"
[/vba] он извлечет текст после последнего подчеркивания. А потом какой то текстовой функцией, например Replase, обрезать символы "C.csv".

Автор - i691198
Дата добавления - 05.05.2024 в 11:33
jun Дата: Воскресенье, 05.05.2024, 12:21 | Сообщение № 6
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 142
Репутация: 42 ±
Замечаний: 0% ±

Можно в регулярных выражениях использовать захватывающие группы в круглых скобках, например так:
[vba]
Код
Private Function execute_numbers(what As Range, pattern As String) As Double
With CreateObject("Vbscript.Regexp")
    .Global = False: .MultiLine = False: .Ignorecase = False: .pattern = pattern
    If .test(what) Then execute_numbers = CDbl(Replace(.Execute(what).Item(0).submatches.Item(0), ".", ",")): Exit Function
End With
execute_numbers = -1
End Function
Sub test()
Dim i As Range
For Each i In [A1:A3]
    i.Offset(0, 1) = execute_numbers(i, "\_([0-9.]+)[CС]")
Next i
End Sub
[/vba]
паттерн:
[vba]
Код
"\_([0-9.]+)[CС]"
[/vba]
К сообщению приложен файл: extract_between.xlsb (16.3 Kb)
 
Ответить
СообщениеМожно в регулярных выражениях использовать захватывающие группы в круглых скобках, например так:
[vba]
Код
Private Function execute_numbers(what As Range, pattern As String) As Double
With CreateObject("Vbscript.Regexp")
    .Global = False: .MultiLine = False: .Ignorecase = False: .pattern = pattern
    If .test(what) Then execute_numbers = CDbl(Replace(.Execute(what).Item(0).submatches.Item(0), ".", ",")): Exit Function
End With
execute_numbers = -1
End Function
Sub test()
Dim i As Range
For Each i In [A1:A3]
    i.Offset(0, 1) = execute_numbers(i, "\_([0-9.]+)[CС]")
Next i
End Sub
[/vba]
паттерн:
[vba]
Код
"\_([0-9.]+)[CС]"
[/vba]

Автор - jun
Дата добавления - 05.05.2024 в 12:21
baxtiyor1916 Дата: Среда, 08.05.2024, 10:27 | Сообщение № 7
Группа: Пользователи
Ранг: Прохожий
Сообщений: 8
Репутация: 0 ±
Замечаний: 0% ±

365
Формулами, для Excel 365:
Код
=--ВЗЯТЬ(ТЕКСТРАЗД(A1;"C";"_");-1;1)
 
Ответить
СообщениеФормулами, для Excel 365:
Код
=--ВЗЯТЬ(ТЕКСТРАЗД(A1;"C";"_");-1;1)

Автор - baxtiyor1916
Дата добавления - 08.05.2024 в 10:27
irabel Дата: Понедельник, 13.05.2024, 10:38 | Сообщение № 8
Группа: Пользователи
Ранг: Прохожий
Сообщений: 3
Репутация: 0 ±
Замечаний: 0% ±

Всем большое спасибо!
Был в отпуске, не смог сразу ответить.
Формулы не подходили, потому что это используется в большом макросе, поэтому и UDF
 
Ответить
СообщениеВсем большое спасибо!
Был в отпуске, не смог сразу ответить.
Формулы не подходили, потому что это используется в большом макросе, поэтому и UDF

Автор - irabel
Дата добавления - 13.05.2024 в 10:38
Мир MS Excel » Вопросы и решения » Вопросы по VBA » извлечь число между двумя разными символами (Функции/Function)
  • Страница 1 из 1
  • 1
Поиск:

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