2011-11-16 21 views
38

में एक रेगेक्स मैच लौट रहा है मैं एक्सेल 2010 के लिए एक फ़ंक्शन लिखने की कोशिश कर रहा हूं जो असंगठित पाठ का एक सेल लेगा, एसडीआई मूल्य कहलाता है और यदि पाया जाता है, तो उस नंबर को वापस कर दें। एसडीआई मान एसडीआई #### के रूप में दिखाई देगा। क्या मैं चाहता हूँ SDI और sepecific संख्या है कि यह पालन वापस जाने के लिए है, इसलिए सेल शामिल करता है, तो "कुछ पाठ SDI 1234 कुछ और पाठ" समारोह 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 

यदि कोई एसडीआई नंबर नहीं है तो यह कभी भी कथन में प्रवेश नहीं करता है और कर्तव्यपूर्वक खाली स्ट्रिंग देता है। यदि कोई एसडीआई नंबर है तो मुझे #VALUE मिल जाएगा!

मुझे क्या याद आ रही है?

हां, वीबीस्क्रिप्ट सक्षम है। इसके अतिरिक्त, मुझे वीबीए में रेगेक्स का उपयोग करने में निराशा होती है, और ऑनलाइन उपयोगी जानकारी ढूंढना मुश्किल होता है। अच्छे ऑनलाइन संसाधनों के लिंक की सराहना की जाएगी।

धन्यवाद

उत्तर

61

आपको एसडीआई नंबर प्राप्त करने के लिए मैचों तक पहुंचने की आवश्यकता है। यहां एक ऐसा कार्य है जो यह करेगा (माना जाता है कि प्रति सेल केवल 1 एसडीआई संख्या है)।

रेगेक्स के लिए, मैंने "एसडीआई के बाद एक स्थान और एक या अधिक संख्याओं का उपयोग किया"। आपके पास "एसडीआई एक स्थान और शून्य या अधिक संख्या के बाद था"। आप जो भी था उसके पीछे जाने के लिए आप बस मेरे पैटर्न में + से * बदल सकते हैं।

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 

यदि किसी सेल में एक से अधिक एसडीआई संख्या हो सकती है जिसे आप निकालना चाहते हैं, तो मेरा 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

धन्यवाद इशुन - आपका फ़ंक्शन अद्भुत काम करता है – TheoRose

+0

+1 अच्छी तरह से किया गया Issun – brettdj