Функция VBA Regex

У вас есть представление, что не так в этом коде? Он должен извлечь все заглавные буквы и образец «1WO», если таковой имеется. Например, в «Пользователь: 399595: Учетная запись: ETH: баланс» у меня должен быть «UAETH», а в «Пользователь: 197755: Учетная запись: 1WO: баланс» у меня должен быть «UA1WO».

Спасибо

Option Explicit

Function ExtractCap(Txt As String) As String

    Application.Volatile
    Dim xRegEx As Object
    Set xRegEx = CreateObject("VBSCRIPT.REGEXP")

    If xRegEx.Pattern = "[^A-Z]" Then
    xRegEx.Global = True
    xRegEx.MultiLine = False
    ExtractCap = xRegEx.Replace(Txt, "")
    Set xRegEx = Nothing

    Else: xRegEx.Pattern = "1WO"
    ExtractCap = xRegEx.Execute(Txt)

    End If

End Function

Зачем использовать If xRegEx.Pattern = "[^A-Z]"? Просто установите шаблон, не нужно использовать If.

Wiktor Stribiżew 03.04.2018 08:57

WO также капитализируется

QHarr 03.04.2018 09:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
68
3

Ответы 3

Я не эксперт по RegEx, так что вы можете попробовать альтернативу:

Function ExtractCap(Txt As String) As String
    Application.Volatile
    Dim i As Long

    For i = 1 To Len(Txt)
        Select Case Asc(Mid(Txt, i, 1))
            Case 65 To 90
               ExtractCap = ExtractCap & Mid(Txt, i, 1)
        End Select
    Next
End Function

в то время как, если структура ваших данных будет строго такой, как вы показали, вы также можете рассмотреть:

Function ExtractCap(Txt As String) As String
    Application.Volatile
    ExtractCap = "UA" & Split(Txt, ":")(3)
End Function

Ваш RegEx работает так:

Function ExtractCap(Txt As String) As String

    Application.Volatile
    Dim xRegEx As Object
    Set xRegEx = CreateObject("VBScript.RegExp")

    With xRegEx
        .Pattern = "[^A-Z]"
        .Global = True
        .MultiLine = False
        ExtractCap = .Replace(Txt, vbNullString)
    End With

    If Txt = ExtractCap Then ExtractCap = "1WO"

End Function

Public Sub TestMe()
    Debug.Print ExtractCap("User:399595:Account:ETH:balance")
End Sub

В вашем коде было 2 ошибки, остановившие выполнение:

  • xRegEx был установлен на Nothing, а затем его попросили предоставить значение;
  • чек If xRegEx.Pattern = "[^A-Z]" на самом деле мало что значит для VBA. Например, вы устанавливаете Pattern и делаете из него условие. Если вы хотите узнать, существует ли шаблон в RegEx, вам следует сравнить две строки - до и после выполнения шаблона.

Ваша проблема решается легко.

Во-первых, я предположил, что 1WO может появляться в вашей строке не более одного раза.

Исходя из этого предположения, логика следующая:

Определите функцию, которая извлекает все заглавные буквы из строк.

Теперь в функции main вы сначала разделяете строку, используя 1WO в качестве разделителя. Теперь передайте каждую строку (после разделения) функции, получите все заглавные буквы из этих строк и снова объедините их с 1WO на своем месте.

Option Explicit

Public Function Extract(str As String) As String
Dim s As Variant
For Each s In Split(str, "1WO")
    'append extracted caps with 1WO at the end
    Extract = Extract & ExtractCaps(s) & "1WO"
Next
'delete lest 1WO from result
Extract = Left(Extract, Len(Extract) - 3)

End Function

Function ExtractCaps(str As Variant) As String
Dim i As Long, char As String
For i = 1 To Len(str)
    char = Mid(str, i, 1)
    If Asc(char) > 64 And Asc(char) < 91 And char = UCase(char) Then
        ExtractCaps = ExtractCaps & char
    End If
Next
End Function

Если вы поместите этот код во вставленный Module, вы можете использовать его на листе в формуле: =Extract(A1).

Другие вопросы по теме