一個可以使用多個正則表達式進行多次嘗試匹配、替換或提取的Excel VBA自定義函數(UFD)


該自定義函數可使用多個正則表達式對目標單元格進行多次匹配嘗試,如匹配成功,將停止嘗試匹配其他正則表達式,並且使用該正則表達式相對應的替換表達式進行替換,返回替換結果。

您可以直接下載包含該函數代碼的XLSM文件,打開並啟用宏之后,就可以直接使用該函數:http://url.cn/5WVPvgT

使用方法為:

Text參數:需要進行處理的原始文字或單元格。

MatchPatternRange參數:正則表達式組所在的單元格范圍。請將多個正則表達式存放在表格中的一行或一列內,作為MatchPatternRange參數傳入。

ReplacePattern參數:每個正則表達式相對應的替換字串符所在的單元格范圍。請將用來作替換的文字放在正則表達式隔壁的行或列內,作為ReplacePatternRange參數傳入。

IgnoreCase參數:在查找時是否忽略大小寫,默認值為True,即忽略大小寫區別。

 

如需在輸入函數時獲取參數提示,可以按Shift+F3,打開插入函數對話框,並在函數類別(category)中找到用戶自定義(User Defined),在下方文本框中找到RangeRegexReplace,再點擊OK,就會彈出參數輸入輔助界面。

 

 

如果您想學習一下如何自己插入VBA源代碼,可以按照以下方法將下文中的VBA代碼插入Excel工作簿:

先在Excel中按Alt+F11,進入VBE編輯器。然后在左側找到需要插入代碼的工作簿(Workbook)的名稱。如果VBE編輯器左側看不到這一塊Project小窗口,可以試試看按Ctrl+R。

在下圖中,我希望在工作簿Book1中插入代碼,所以就選中了VBAProject (Book1)這一層。

右鍵單擊該工作簿名稱,依次點擊Insert -- Module。

這時VBE左側就會多出一個Module1,雙擊該Module1,在右側代碼輸入界面中,將本文下面的代碼復制粘貼進去。

 

本自定義函數由於使用了第三方庫,使用前需要做Early Binding:即在VBE編輯器中,選擇菜單欄中的Tool — Reference:

彈出如下圖的對話框后,選擇Microsoft VBSscript Regular Expression 5.5,打鈎,點OK。

 

最后按Ctrl+S保存文件,注意在保存對話框中,文件類型需要選擇“Excel啟動宏的工作簿(*.xlsm)”,如下圖

Function RangeRegexReplace(ByVal Text As String, ByVal MatchPatternRange As Range, _
    ByVal ReplacePatternRange As Range, Optional ByVal IngoreCase As Boolean = True) As String

'By Jing He 2017-9-1
'Last update 2017-9-2

Dim count As Integer, x As Integer, i As Integer, j As Integer
Dim pattern() As String, replace() As String

If MatchPatternRange.count <> ReplacePatternRange.count Then
    RangeRegexReplace = "Numbers of cells in MatchPatternRange and ReplacePatternRange are not equal."
    Exit Function
End If

count = MatchPatternRange.count
ReDim pattern(0 To count - 1) As String
ReDim replace(0 To count - 1) As String

i = 0
For Each c In MatchPatternRange
    pattern(i) = c.Value
    i = i + 1
Next c

j = 0
For Each c In ReplacePatternRange
    replace(j) = c.Value
    j = j + 1
Next c


'Give no match value
RangeRegexReplace = "-"

Dim regex As New RegExp
With regex
    .Global = True
    .MultiLine = True
    .IgnoreCase = IngoreCase
End With

For x = 0 To count - 1 Step 1
    regex.pattern = pattern(x)
    If regex.Test(Text) Then
        RangeRegexReplace = regex.replace(Text, replace(x))
        Exit For
    End If
Next x

End Function

 

 順便附帶一個使用單個正則表達式進行查找替換的自定義函數,使用這個函數時,正則表達式可以直接寫入公式的參數內,不需要放在單元格內再去引用。

Function RegexReplace(ByVal Text As String, ByVal MatchPattern As String, _
  ByVal ReplacePattern As String, Optional ByVal IngoreCase As Boolean = True) As String

'By Jing He 2017-9-1

Dim regex As New RegExp

With regex
    .Global = True
    .MultiLine = True
    .IgnoreCase = IngoreCase
    .pattern = MatchPattern
End With

If regex.Test(Text) Then
    RegexReplace = regex.replace(Text, ReplacePattern)
Else
    RegexReplace = "-"
End If

End Function

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM