2011-11-16 11 views
38

Excel 2010で、構造化されていないテキストのセルを取得し、sdiという値を探し、その値を返す関数を作成しようとしています。 sdiの値はsdi ####と表示されます。私が欲しいのは、SDIおよびそれに続くsepecific番号を返すことですので、セルが含まれている場合は、「いくつかのテキストSDI 1234いくつかのより多くのテキストが」機能は、SDI 1234VBAで正規表現を返す(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番号を取得するには、一致するものにアクセスする必要があります。ここにはそれを行う関数があります(1つのセルに1つのSDI番号しかないと仮定します)。

正規表現では、「スペースと1つ以上の数字が続くsdi」を使用しました。あなたは「スペースと0以上の数字が続く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関数を使用します。あなたは(それらをカンマで-区切るように)各試合を区切るために第三PARAMTERに渡すことができ、そして手動で実際の関数呼び出しのパターンを入力します。ここでは

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