2017-07-07 76 views
0

我需要幫助才能讓我的Excel函數正常工作。我們的目標是運行一個內嵌函數,它將從另一個單元格輸入的正則表達式函數的所有模式匹配提取到一個單元格中,而不是單元格數組。Excel VBA正則表達式函數將多個匹配返回到單個單元格中

我已經嘗試過使用數組,它返回函數對話框預覽中的兩個匹配,但只輸出單元格中的第一個匹配項。我也試過使用一個集合,但沒有運氣。

這裏是我當前的代碼,並且將被用來作爲函數的字符串輸入文本的樣本:

Function RegexMatches(strInput As String) As Variant 

Dim rMatch As Match 
Dim arrayMatches 
Dim i As Long 

arrayMatches = Array() 

With New RegExp 
    .Global = True 
    .MultiLine = True 
    .IgnoreCase = True 
    .Pattern = "(Code)[\s][\d]{2,4}" 
     For Each rMatch In .Execute(strInput) 
     ReDim Preserve arrayMatches(i) 
     arrayMatches(i) = rMatch.Value 
     i = i + 1 
    Next 
End With 

    RegexMatches = arrayMatches 
End Function 


樣品strInput從Excel單元格:

碼123一些隨機文本
轉到此處並繼續到下一行
代碼4567後跟更多文本
包括新的線不只是換行的文本



從該函數的期望的輸出將是兩個(2)從匹配正則表達式的函數值成單細胞(例如「Code 123 Code 4567」)。

任何幫助,非常感謝!

+1

Concat匹配值,然後返回此修剪過的字符串。 –

+0

@ Mat'sMug看看這[屏幕截圖](http://i.imgur.com/CugeElc.png?1) – BoogieMan2718

+0

@WiktorStribiżew這就是我在想概念,但我不知道如何去做該函數使用VBA代碼。 – BoogieMan2718

回答

2

看起來你錯過了你的功能的結束(按照馬克杯的評論)?試試這個(這是根據Wiktor的評論)。

編輯:根據馬特杯的建議修改。

Function RegexMatches(strInput As String) As String 

Dim rMatch As Object 
Dim s As String 
Dim arrayMatches() 
Dim i As Long 

With New RegExp 
    .Global = True 
    .MultiLine = True 
    .IgnoreCase = True 
    .Pattern = "(Code)[\s][\d]{2,4}" 
    If .test(strInput) Then 
     For Each rMatch In .Execute(strInput) 
      ReDim Preserve arrayMatches(i) 
      arrayMatches(i) = rMatch.Value 
      i = i + 1 
      's = s & " " & rMatch 
     Next 
    End If 
End With 

RegexMatches = Join(arrayMatches, " ") 

End Function 
+1

我想使函數返回一個匹配數組,如名稱所暗示的('Variant'很好,然後),並在調用站點使用'Join'加入一個'vbNewLine'的值以便將字符串轉儲到細胞。 –

+0

@ Mat'sMug - 謝謝,已修改。我同意這是一個更優雅的方法。 – SJR

+0

除了現在正在執行函數中的'Join' *(返回'String'); 'RegexMatches = arrayMatches',並讓調用者處理字符串表示;-) –

相關問題