programing

VBA(excel)에서 정규식 일치 항목 반환

bestprogram 2023. 5. 7. 12:02

VBA(excel)에서 정규식 일치 항목 반환

저는 구조화되지 않은 텍스트의 셀을 가져다가 sdi 값이라는 것을 찾고 발견되면 그 번호를 반환하는 엑셀 2010의 함수를 작성하려고 합니다.sdi 값은 sdi ####으로 나타납니다.제가 원하는 것은 sdi와 그 뒤에 오는 특정 숫자를 반환하는 것입니다. 그래서 만약 셀에 "some text sdi 1234 some more text"가 포함되어 있다면 함수는 sdi 1234를 반환할 것입니다.

제 기능은 다음과 같습니다.

Function SdiTest(LookIn As String) As String
  Dim temp As String
  Dim STA As Object
  temp = ""

  Set SDI = CreateObject("VBScript.RegExp")
  SDI.IgnoreCase = True
  SDI.Pattern = "sdi [1-9]*"
  SDI.Global = True

  If SDI.Test(LookIn) Then
    temp = SDI.Execute(LookIn)
  End If

  SdiTest = temp
End Function

sdi 번호가 없으면 if 문을 입력하지 않고 빈 문자열을 의무적으로 반환합니다.SDI 번호가 있으면 #VALUE!

제가 무엇을 빠뜨리고 있나요?

예, VBScript가 사용됩니다.또한 VBA에서 정규식을 사용하는 것이 답답하고 온라인에서 유용한 정보를 찾기가 어렵습니다.좋은 온라인 리소스에 대한 링크를 주시면 감사하겠습니다.

감사해요.

SDI 번호를 얻으려면 일치하는 항목에 액세스해야 합니다.셀당 SDI 번호가 1개만 있다고 가정하면 이를 수행하는 기능이 있습니다.

정규식에는 "sdi 뒤에 공백과 하나 이상의 숫자가 있습니다"를 사용했습니다."sdi 뒤에 공백이 있고 0개 이상의 숫자가 있습니다."제 패턴에서 +를 *로 변경하여 이전 패턴으로 돌아갈 수 있습니다.

Function ExtractSDI(ByVal text As String) As String

Dim result As String
Dim allMatches As Object
Dim RE As Object
Set RE = CreateObject("vbscript.regexp")

RE.pattern = "(sdi \d+)"
RE.Global = True
RE.IgnoreCase = True
Set allMatches = RE.Execute(text)

If allMatches.count <> 0 Then
    result = allMatches.Item(0).submatches.Item(0)
End If

ExtractSDI = result

End Function

셀에 추출할 SDI 번호가 둘 이상 있을 수 있는 경우 여기에 정규식 추출 함수가 있습니다.세 번째 매개 변수를 전달하여 각 일치 항목을 쉼표로 구분하고 실제 함수 호출에 패턴을 수동으로 입력할 수 있습니다.

Ex) =RegexExtract(A1, "(sdi \d+)", ", ")

여기:

Function RegexExtract(ByVal text As String, _
                      ByVal extract_what As String, _
                      Optional seperator As String = "") As String

Dim i As Long, j As Long
Dim result As String
Dim allMatches As Object
Dim RE As Object
Set RE = CreateObject("vbscript.regexp")

RE.pattern = extract_what
RE.Global = True
Set allMatches = RE.Execute(text)

For i = 0 To allMatches.count - 1
    For j = 0 To allMatches.Item(i).submatches.count - 1
        result = result & seperator & allMatches.Item(i).submatches.Item(j)
    Next
Next

If Len(result) <> 0 Then
    result = Right(result, Len(result) - Len(seperator))
End If

RegexExtract = result

End Function

*"RE"를 수강했습니다.RegexExtract에서 케이스 = True를 무시하지만 원하는 경우 다시 추가하거나 4번째 매개 변수(선택 사항)로 추가할 수도 있습니다.

@aevanko의 "일반화된" 버전의 훌륭한 함수입니다.

Sub TestRegEx()
 Dim TextStr As String, PatternStr As String
 TextStr = "StartStr Ab12345678 EndStr"
 PatternStr = "(([a-z]{2})([0-9]{8}))"
 Debug.Print ExtractSubStrWRegEx(PatternStr, TextStr)
End Sub

Function ExtractSubStrWRegEx(ByVal PatternStr As String,ByVal TextStr As String) As String

 Dim RE As Object
 Set RE = CreateObject("vbscript.regexp")

 RE.Pattern = PatternStr
 RE.Global = True
 RE.IgnoreCase = True

 Dim allMatches As Object
 Set allMatches = RE.Execute(TextStr)

 If allMatches.Count <> 0 Then
  ExtractSubStrWRegEx = allMatches.Item(0).submatches.Item(0)
 Else
  ExtractSubStrWRegEx = ""
 End If

End Function

언급URL : https://stackoverflow.com/questions/8146485/returning-a-regex-match-in-vba-excel