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
'programing' 카테고리의 다른 글
스트림을 문자열로 변환하고 되돌리는 중 (0) | 2023.05.07 |
---|---|
Postgre에서 타임스탬프를 자동으로 업데이트하려면 어떻게 합니까?SQL (0) | 2023.05.07 |
인수가 중간에 있는 PowerShell 별칭을 작성하려면 어떻게 해야 합니까? (0) | 2023.05.07 |
mongodb 인덱스 생성 작업 상태 (0) | 2023.05.07 |
에서 이름으로 워크시트를 가져오는 방법.NET? (0) | 2023.05.07 |