2011-11-16 106 views
38

我想爲excel 2010編寫一個函數,它將採用非結構化文本的單元格,查找稱爲sdi值的東西,如果找到,則返回該編號。 sdi值將顯示爲sdi ####。我要的是回到SDI和它後面的數字sepecific,因此,如果單元格中包含「一些文本SDI 1234一些文字」功能將返回SDI 1234在VBA中返回一個正則表達式匹配(excel)

這是我的函數:

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中使用正則表達式令人沮喪,並且很難在網上找到有用的信息。鏈接到良好的在線資源將不勝感激。

謝謝

回答

61

您需要訪問匹配以獲得SDI編號。這是一個可以實現的功能(假設每個單元只有一個SDI數字)。

對於正則表達式,我使用了「sdi後跟空格和一個或多個數字」。你有「sdi跟着一個空格和零個或更多的號碼」。你可以簡單地將+改成我的模式,以回到你的所有狀態。

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編號,這裏是我的RegexExtract函數。您可以在第三放慢參數傳遞到單獨的每場比賽(如逗號它們分開),並且您在實際的函數調用手動輸入模式:

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 

*請請注意,我從RegexExtract中取出了「RE.IgnoreCase = True」,但可以將其重新添加,或者如果您願意,可以將其添加爲可選的第4個參數。

+0

很好的答案,謝謝你的功能! –

+0

謝謝Issun - 你的功能奇妙地工作 – TheoRose

+0

+1很好做Issun – brettdj

相關問題