【问题标题】:How to use Regular Expressions (Regex) in Microsoft Excel both in-cell and loops如何在 Microsoft Excel 中在单元格内和循环中使用正则表达式 (Regex)
【发布时间】:2014-04-27 21:07:41
【问题描述】:

如何在 Excel 中使用正则表达式并利用 Excel 强大的类似网格的设置进行数据操作?

  • 单元格内函数返回匹配的模式或字符串中的替换值。
  • 子循环遍历一列数据并提取与相邻单元格的匹配项。
  • 需要什么设置?
  • Excel 的正则表达式有哪些特殊字符?

我知道 Regex 在许多情况下并不理想 (To use or not to use regular expressions?),因为 excel 可以使用 LeftMidRightInstr 键入命令进行类似操作。

【问题讨论】:

标签: regex excel vba


【解决方案1】:

Regular expressions 用于模式匹配。

要在 Excel 中使用,请按以下步骤操作:

第 1 步:将 VBA 引用添加到“Microsoft VBScript 正则表达式 5.5”

  • 选择“开发者”标签 (I don't have this tab what do I do?)
  • 从“代码”功能区部分选择“Visual Basic”图标
  • 在“Microsoft Visual Basic for Applications”窗口的顶部菜单中选择“工具”。
  • 选择“参考”
  • 选中“Microsoft VBScript 正则表达式 5.5”旁边的框以包含在您的工作簿中。
  • 点击“确定”

第 2 步:定义您的模式

基本定义:

- 范围。

  • 例如a-z 匹配从 a 到 z 的小写字母
  • 例如0-5 匹配从 0 到 5 的任意数字

[] 恰好匹配这些括号内的对象之一。

  • 例如[a] 匹配字母 a
  • 例如[abc] 匹配单个字母,可以是 a、b 或 c
  • 例如[a-z] 匹配字母表中的任何单个小写字母。

() 为返回目的对不同的匹配进行分组。请参阅下面的示例。

{} 之前定义的模式的重复副本的乘数。

  • 例如[a]{2} 匹配两个连续的小写字母 a:aa
  • 例如[a]{1,3} 匹配至少一个到三个小写字母 aaaaaa

+至少匹配一个或多个在它之前定义的模式。

  • 例如a+ 将匹配连续的 a 的 aaaaaa 等等

? 匹配零个或一个之前定义的模式。

  • 例如模式可能存在也可能不存在,但只能匹配一次。
  • 例如[a-z]? 匹配空字符串或任何单个小写字母。

*匹配零个或多个在它之前定义的模式。

  • 例如可能存在或不存在的模式的通配符。
  • 例如[a-z]* 匹配空字符串或小写字母字符串。

. 匹配除换行符\n以外的任何字符

  • 例如a. 匹配以 a 开头并以除 \n 之外的任何内容结尾的两个字符串

|OR 运算符

  • 例如a|b 表示ab 可以匹配。
  • 例如red|white|orange 与其中一种颜色完全匹配。

^NOT 运算符

  • 例如[^0-9] 字符不能包含数字
  • 例如[^aA] 字符不能为小写a 或大写A

\ 转义后面的特殊字符(覆盖上述行为)

  • 例如\., \\, \(, \?, \$, \^

锚定模式:

^ 匹配必须出现在字符串的开头

  • 例如^a 第一个字符必须是小写字母 a
  • 例如^[0-9] 第一个字符必须是数字。

$匹配必须出现在字符串的末尾

  • 例如a$ 最后一个字符必须是小写字母 a

优先级表:

Order  Name                Representation
1      Parentheses         ( )
2      Multipliers         ? + * {m,n} {m, n}?
3      Sequence & Anchors  abc ^ $
4      Alternation         |

预定义的字符缩写:

abr    same as       meaning
\d     [0-9]         Any single digit
\D     [^0-9]        Any single character that's not a digit
\w     [a-zA-Z0-9_]  Any word character
\W     [^a-zA-Z0-9_] Any non-word character
\s     [ \r\t\n\f]   Any space character
\S     [^ \r\t\n\f]  Any non-space character
\n     [\n]          New line

示例 1作为宏运行

以下示例宏查看单元格A1 中的值,以查看前1 个或2 个字符是否为数字。如果是这样,它们将被删除并显示字符串的其余部分。如果没有,则会出现一个框,告诉您未找到匹配项。单元格A1 的值12abc 将返回abc1abc 的值将返回abcabc123 的值将返回“不匹配”,因为数字不在字符串的开头。

Private Sub simpleRegex()
    Dim strPattern As String: strPattern = "^[0-9]{1,2}"
    Dim strReplace As String: strReplace = ""
    Dim regEx As New RegExp
    Dim strInput As String
    Dim Myrange As Range
    
    Set Myrange = ActiveSheet.Range("A1")
    
    If strPattern <> "" Then
        strInput = Myrange.Value
        
        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = strPattern
        End With
        
        If regEx.Test(strInput) Then
            MsgBox (regEx.Replace(strInput, strReplace))
        Else
            MsgBox ("Not matched")
        End If
    End If
End Sub

示例 2作为内嵌函数运行

此示例与示例 1 相同,但设置为作为单元内函数运行。要使用,请将代码更改为:

Function simpleCellRegex(Myrange As Range) As String
    Dim regEx As New RegExp
    Dim strPattern As String
    Dim strInput As String
    Dim strReplace As String
    Dim strOutput As String
    
    
    strPattern = "^[0-9]{1,3}"
    
    If strPattern <> "" Then
        strInput = Myrange.Value
        strReplace = ""
        
        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = strPattern
        End With
        
        If regEx.test(strInput) Then
            simpleCellRegex = regEx.Replace(strInput, strReplace)
        Else
            simpleCellRegex = "Not matched"
        End If
    End If
End Function

将您的字符串 ("12abc") 放在单元格 A1 中。在单元格B1 中输入此公式=simpleCellRegex(A1),结果将为“abc”。


示例 3循环范围

此示例与示例 1 相同,但循环遍历一系列单元格。

Private Sub simpleRegex()
    Dim strPattern As String: strPattern = "^[0-9]{1,2}"
    Dim strReplace As String: strReplace = ""
    Dim regEx As New RegExp
    Dim strInput As String
    Dim Myrange As Range
    
    Set Myrange = ActiveSheet.Range("A1:A5")
    
    For Each cell In Myrange
        If strPattern <> "" Then
            strInput = cell.Value
            
            With regEx
                .Global = True
                .MultiLine = True
                .IgnoreCase = False
                .Pattern = strPattern
            End With
            
            If regEx.Test(strInput) Then
                MsgBox (regEx.Replace(strInput, strReplace))
            Else
                MsgBox ("Not matched")
            End If
        End If
    Next
End Sub

示例 4:拆分不同的模式

此示例循环遍历一个范围(A1A2A3)并查找以三个数字开头、后跟一个字母字符、然后是 4 个数字的字符串。输出使用() 将模式匹配拆分为相邻的单元格。 $1 表示在第一组() 中匹配的第一个模式。

Private Sub splitUpRegexPattern()
    Dim regEx As New RegExp
    Dim strPattern As String
    Dim strInput As String
    Dim Myrange As Range
    
    Set Myrange = ActiveSheet.Range("A1:A3")
    
    For Each C In Myrange
        strPattern = "(^[0-9]{3})([a-zA-Z])([0-9]{4})"
        
        If strPattern <> "" Then
            strInput = C.Value
            
            With regEx
                .Global = True
                .MultiLine = True
                .IgnoreCase = False
                .Pattern = strPattern
            End With
            
            If regEx.test(strInput) Then
                C.Offset(0, 1) = regEx.Replace(strInput, "$1")
                C.Offset(0, 2) = regEx.Replace(strInput, "$2")
                C.Offset(0, 3) = regEx.Replace(strInput, "$3")
            Else
                C.Offset(0, 1) = "(Not matched)"
            End If
        End If
    Next
End Sub

结果:


其他模式示例

String   Regex Pattern                  Explanation
a1aaa    [a-zA-Z][0-9][a-zA-Z]{3}       Single alpha, single digit, three alpha characters
a1aaa    [a-zA-Z]?[0-9][a-zA-Z]{3}      May or may not have preceding alpha character
a1aaa    [a-zA-Z][0-9][a-zA-Z]{0,3}     Single alpha, single digit, 0 to 3 alpha characters
a1aaa    [a-zA-Z][0-9][a-zA-Z]*         Single alpha, single digit, followed by any number of alpha characters

</i8>    \<\/[a-zA-Z][0-9]\>            Exact non-word character except any single alpha followed by any single digit

【讨论】:

  • 你不应该忘记Set regEx = Nothing。当 Sub 被频繁执行时,您将得到 Out Of Memory 异常。
  • 后期装订线:Set regEx = CreateObject("VBScript.RegExp")
  • 好的,我很确定这是因为代码在ThisWorkbook 中。尝试将代码移至单独的Module
  • @PortlandRunner 在“项目资源管理器”(?)这个 excel 文件缺少一个“模块”子文件夹,尽管另一个文件显示了一个。右键单击该文件并选择“插入模块”,然后双击“模块 1”并粘贴代码。已保存。返回工作簿并再次键入该功能-它起作用了。为了像我这样没有经验的人,答案可能值得注意?感谢您的帮助。
  • Unreal... Notepad++ 等简单的独立工具在其查找和替换中有一个“正则表达式”选项...但在 Excel 这样的世界级工具中,您必须是程序员才能做到这一点,并且以最模糊和最复杂的方式..
【解决方案2】:

要在 Excel 公式中直接使用正则表达式,以下 UDF(用户定义函数)可能会有所帮助。它或多或少直接将正则表达式功能暴露为 excel 函数。

工作原理

需要2-3个参数。

  1. 要使用正则表达式的文本。
  2. 正则表达式。
  3. 一个格式字符串,指定结果的外观。它可以包含$0$1$2 等。 $0 是整个匹配,$1 及以上对应于正则表达式中的各个匹配组。默认为$0

一些例子

提取电子邮件地址:

=regex("Peter Gordon: some@email.com, 47", "\w+@\w+\.\w+")
=regex("Peter Gordon: some@email.com, 47", "\w+@\w+\.\w+", "$0")

结果:some@email.com

提取几个子字符串:

=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "E-Mail: $2, Name: $1")

结果:E-Mail: some@email.com, Name: Peter Gordon

将单个单元格中的组合字符串分解为多个单元格中的组件:

=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "$" & 1)
=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "$" & 2)

结果:Peter Gordon some@email.com ...

如何使用

要使用此 UDF,请执行以下操作(大致基于 this Microsoft page。他们在那里有一些很好的附加信息!):

  1. 在 Excel 中,在启用宏的文件 ('.xlsm') 中按 ALT+F11 以打开 Microsoft Visual Basic for Applications 编辑器。
  2. 添加对正则表达式库的 VBA 引用(无耻地从 Portland Runners++ answer 复制):
    1. 点击Tools -> References(请原谅德语截图)
    2. 在列表中找到Microsoft VBScript Regular Expressions 5.5,然后勾选旁边的复选框。
    3. 点击确定
  3. 点击插入模块。如果你给你的模块一个不同的名字,确保模块与下面的UDF有相同的名字(例如命名模块Regex和函数regex导致#NAME! 错误)。

  4. 在中间的大文本窗口中插入以下内容:

    Function regex(strInput As String, matchPattern As String, Optional ByVal outputPattern As String = "$0") As Variant
        Dim inputRegexObj As New VBScript_RegExp_55.RegExp, outputRegexObj As New VBScript_RegExp_55.RegExp, outReplaceRegexObj As New VBScript_RegExp_55.RegExp
        Dim inputMatches As Object, replaceMatches As Object, replaceMatch As Object
        Dim replaceNumber As Integer
    
        With inputRegexObj
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = matchPattern
        End With
        With outputRegexObj
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = "\$(\d+)"
        End With
        With outReplaceRegexObj
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
        End With
    
        Set inputMatches = inputRegexObj.Execute(strInput)
        If inputMatches.Count = 0 Then
            regex = False
        Else
            Set replaceMatches = outputRegexObj.Execute(outputPattern)
            For Each replaceMatch In replaceMatches
                replaceNumber = replaceMatch.SubMatches(0)
                outReplaceRegexObj.Pattern = "\$" & replaceNumber
    
                If replaceNumber = 0 Then
                    outputPattern = outReplaceRegexObj.Replace(outputPattern, inputMatches(0).Value)
                Else
                    If replaceNumber > inputMatches(0).SubMatches.Count Then
                        'regex = "A to high $ tag found. Largest allowed is $" & inputMatches(0).SubMatches.Count & "."
                        regex = CVErr(xlErrValue)
                        Exit Function
                    Else
                        outputPattern = outReplaceRegexObj.Replace(outputPattern, inputMatches(0).SubMatches(replaceNumber - 1))
                    End If
                End If
            Next
            regex = outputPattern
        End If
    End Function
    
  5. 保存并关闭 Microsoft Visual Basic for Applications 编辑器窗口。

【讨论】:

  • 这个答案与here 创建插件的步骤相结合,非常有帮助。谢谢你。确保你没有给你的模块和函数起相同的名字!
  • 只是重申上面 Chris Hunt 的评论。也不要将您的模块称为“正则表达式”。以为我要疯了一段时间,因为由于#NAME错误,该功能无法正常工作
  • 好吧,我已经疯了,因为我尝试了一切(包括更改模块/名称),但仍然收到 #NAME 错误 >_> i.imgur.com/UUQ6eCi.png
  • @Enissay:尝试创建一个最小的Function foo() As Variant \n foo="Hello World" \n End Function UDF,看看是否可行。如果是,请按照上面的全部内容进行操作,如果没有破坏任何基本内容(禁用宏?)。
【解决方案3】:

扩展 patszimanswer 以供赶时间的人使用。

  1. 打开 Excel 工作簿。
  2. Alt+F11 打开 VBA/宏窗口。
  3. Tools 下添加对正则表达式的引用,然后在 References
  4. 并选择Microsoft VBScript Regular Expression 5.5
  5. 插入一个新模块(代码需要驻留在模块中,否则它不起作用)。
  6. 在新插入的模块中,
  7. 添加以下代码:

    Function RegxFunc(strInput As String, regexPattern As String) As String
        Dim regEx As New RegExp
        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .pattern = regexPattern
        End With
    
        If regEx.Test(strInput) Then
            Set matches = regEx.Execute(strInput)
            RegxFunc = matches(0).Value
        Else
            RegxFunc = "not matched"
        End If
    End Function
    
  8. 正则表达式模式放置在其中一个单元格中,并在其上使用了 绝对引用 函数将与其创建的工作簿绑定。
    如果需要在不同的工作簿中使用,请将函数存储在 Personal.XLSB

【讨论】:

  • 感谢您提到它需要在 Personal.xlsb 中才能在您处理的所有 Excel 文档中可用。大多数(?)其他答案并不清楚。 Personal.XLSB 将进入文件夹(可能需要创建文件夹)C:\Users\用户名\AppData\Local\Microsoft\Excel\XLStart 文件夹
  • 我选择了这种方法。但是,Office 365 对我来说存在问题。我注意到,如果我前几天打开 xlsm 文件,带有 RegxFunc 的公式会变成 #NAME。实际上,要解决此问题,我需要重新创建文件。有什么建议吗?
  • @HoRn #Name?你可能想试试这个答案,stackoverflow.com/a/18841575/1699071。它指出函数名称和模块名称是相同的。修复是重命名模块名称或函数名称。同一页面上的其他帖子也可能有所帮助。
  • 我放弃了尝试让 personal.xlsb 正常工作。相反,我将此函数放在剪贴板缓冲区的永久集合(arsclip)中,并在需要时创建一个新模块。对于一个到 2021 年应该原生于 Excel 的函数来说,这是多么困难,这是可笑的。 PS:就在这中间,Stack让我支付粘贴。大家,现在是 4 月 2 日。^april\x20?0?1$' 今天失败了。你抓住了我。
  • 对于来自非英语国家的一些人来说,这可能很有趣:您必须使用分号“;”而不是RegxFunc(B5,$C$2)中的逗号“,”
【解决方案4】:

这是我的尝试:

Function RegParse(ByVal pattern As String, ByVal html As String)
    Dim regex   As RegExp
    Set regex = New RegExp
    
    With regex
        .IgnoreCase = True  'ignoring cases while regex engine performs the search.
        .pattern = pattern  'declaring regex pattern.
        .Global = False     'restricting regex to find only first match.
        
        If .Test(html) Then         'Testing if the pattern matches or not
            mStr = .Execute(html)(0)        '.Execute(html)(0) will provide the String which matches with Regex
            RegParse = .Replace(mStr, "$1") '.Replace function will replace the String with whatever is in the first set of braces - $1.
        Else
            RegParse = "#N/A"
        End If 
    End With
End Function

【讨论】:

    【解决方案5】:

    这不是一个直接的答案,但可能会提供更有效的替代方案供您考虑。也就是说,Google Sheets 内置了几个Regex Functions,这些可以非常方便,并有助于规避 Excel 中的一些技术程序。显然,在您的 PC 上使用 Excel 有一些优势,但对于大多数用户而言,Google 表格将提供相同的体验,并且可能会在可移植性和文档共享方面提供一些好处。

    他们提供

    REGEXEXTRACT:根据正则表达式提取匹配的子字符串。

    REGEXREPLACE:使用正则表达式将部分文本字符串替换为不同的文本字符串。

    SUBSTITUTE:用字符串中的新文本替换现有文本。

    REPLACE:用不同的文本字符串替换部分文本字符串。

    您可以像这样直接将这些输入到单元格中,并会生成您想要的任何内容

    =REGEXMATCH(A2, "[0-9]+")
    

    它们还可以很好地与其他函数结合使用,例如 IF 语句,如下所示:

    =IF(REGEXMATCH(E8,"MiB"),REGEXEXTRACT(E8,"\d*\.\d*|\d*")/1000,IF(REGEXMATCH(E8,"GiB"),REGEXEXTRACT(E8,"\d*\.\d*|\d*"),"")
    

    希望这为那些对 Excel 的 VBS 组件感到畏惧的用户提供了一个简单的解决方法。

    【讨论】:

    • 感谢分享亚历克斯。这对那些寻找谷歌版本的人很有用。您可能会考虑编写和回答另一个特定于 Google Sheets Regex 的问题,因为它有自己的命名法,对其他人非常有用。无论如何,你有我的支持!
    • 你能在excel中创建一个完全支持google语法的模块吗?
    【解决方案6】:

    我需要将其用作单元格函数(如SUMVLOOKUP),发现它很容易:

    1. 确保您在启用宏的 Excel 文件中(另存为 xlsm)。
    2. 打开开发者工具Alt + F11
    3. 在其他答案中添加 Microsoft VBScript 正则表达式 5.5
    4. 在工作簿或自己的模块中创建以下函数:

      Function REGPLACE(myRange As Range, matchPattern As String, outputPattern As String) As Variant
          Dim regex As New VBScript_RegExp_55.RegExp
          Dim strInput As String
      
          strInput = myRange.Value
      
          With regex
              .Global = True
              .MultiLine = True
              .IgnoreCase = False
              .Pattern = matchPattern
          End With
      
          REGPLACE = regex.Replace(strInput, outputPattern)
      
      End Function
      
    5. 然后您可以在单元格中使用=REGPLACE(B1, "(\w) (\d+)", "$1$2")(例如:“A 243”到“A243”)

    【讨论】:

    • 这个 outputPattern 的命名让我大吃一惊。这是重置价值。
    • 是的。我想我把它命名为模式,所以很明显它不仅仅是字符串替换,你可以使用正则表达式匹配组,如 $1 $2 等。
    【解决方案7】:

    为了增加有价值的内容,我想提醒一下为什么有时 VBA 中的 RegEx 并不理想。并非所有表达式都受支持,但可能会抛出 Error 5017 并可能让作者猜测(我是自己的受害者)。

    虽然我们可以找到一些关于支持sources,但了解支持哪些元字符等会很有帮助。更深入的解释可以在here 找到。在此来源中提到:

    “尽管“VBScript 的正则表达式 ... 5.5 版实现了很多在早期版本的 VBScript 中缺少的基本正则表达式功能。 ... JavaScript 和 VBScript 实现 Perl 风格的正则表达式。但是,它们缺乏 Perl 和其他现代正则表达式风格中可用的大量高级功能:"


    因此,支持的是:

    • 字符串开头 ancor \A,或者使用 ^ 插入符号匹配字符串中第一个字符之前的位置
    • 字符串结束 ancor \Z,或者使用 $ 美元符号来匹配字符串中最后一个字符之后的位置
    • 正向 LookBehind,例如:(?&lt;=a)b(虽然支持正向 LookAhead
    • 否定 LookBehind,例如:(?&lt;!a)b(虽然支持否定 LookAhead
    • Atomic Grouping
    • Possessive Quantifiers
    • Unicode 例如:\{uFFFF}
    • Named Capturing Groups。或者使用Numbered Capturing Groups
    • 内联修饰符,例如:/i(区分大小写)或 /g(全局)等。通过 RegExp 对象属性设置这些 > RegExp.Global = TrueRegExp.IgnoreCase = True(如果可用)。
    • Conditionals
    • Regular Expression Comments。在脚本中使用常规 ' cmets 添加这些

    我已经不止一次在 VBA 中使用正则表达式碰壁了。通常使用LookBehind,但有时我什至会忘记修饰符。我自己并没有经历过上述所有这些背景,但我想我会尝试广泛地参考一些更深入的信息。随意评论/更正/添加。向regular-expressions.info 大声疾呼以获取大量信息。

    P.S.您提到了常规的 VBA 方法和函数,我可以确认它们(至少对我自己而言)在 RegEx 会失败的地方以它们自己的方式提供了帮助。

    【讨论】:

    • 非常需要的补充+
    【解决方案8】:

    这是一个regex_subst() 函数。例子:

    =regex_subst("watermellon", "[aeiou]", "")
    ---> wtrmlln
    =regex_subst("watermellon", "[^aeiou]", "")
    ---> aeeo
    

    这是简化的代码(无论如何对我来说更简单)。我不知道如何使用上述方法构建合适的输出模式,以像我的示例一样工作:

    Function regex_subst( _
         strInput As String _
       , matchPattern As String _
       , Optional ByVal replacePattern As String = "" _
    ) As Variant
        Dim inputRegexObj As New VBScript_RegExp_55.RegExp
    
        With inputRegexObj
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = matchPattern
        End With
    
        regex_subst = inputRegexObj.Replace(strInput, replacePattern)
    End Function
    

    【讨论】:

      【解决方案9】:

      我不想启用参考库,因为我需要我的脚本是可移植的。Dim foo As New VBScript_RegExp_55.RegExp 行导致了User Defined Type Not Defined 错误,但我找到了一个适用的解决方案我。

      使用 @chrisneilsen 更新 RE cmets:

      我的印象是启用参考库与本地计算机设置相关联,但实际上它直接与工作簿相关联。因此,您可以启用参考库,共享启用宏的工作簿,最终用户也不必启用该库。警告:Late Binding 的优势在于,开发人员不必担心用户计算机上安装的对象库版本错误。@987654324 可能不会出现此问题@ library,但我并不认为此时“性能”的好处对我来说是值得的,因为我们在我的代码中谈论的是难以察觉的毫秒。我觉得这值得更新以帮助其他人理解。如果启用参考库,则可以使用“早期绑定”,但如果不这样做,据我所知,代码可以正常工作,但您需要“后期绑定”并松散一些性能/调试功能。

      来源:https://peltiertech.com/Excel/EarlyLateBinding.html

      您需要在单元格A1 中放置一个示例字符串,然后测试您的strPattern。一旦工作正常,然后根据需要调整rng

      Public Sub RegExSearch()
      'https://stackoverflow.com/questions/22542834/how-to-use-regular-expressions-regex-in-microsoft-excel-both-in-cell-and-loops
      'https://wellsr.com/vba/2018/excel/vba-regex-regular-expressions-guide/
      'https://www.vitoshacademy.com/vba-regex-in-excel/
          Dim regexp As Object
          'Dim regex As New VBScript_RegExp_55.regexp 'Caused "User Defined Type Not Defined" Error
          Dim rng As Range, rcell As Range
          Dim strInput As String, strPattern As String
          
          Set regexp = CreateObject("vbscript.regexp")
          Set rng = ActiveSheet.Range("A1:A1")
              
          strPattern = "([a-z]{2})([0-9]{8})"
          'Search for 2 Letters then 8 Digits Eg: XY12345678 = Matched
      
          With regexp
              .Global = False
              .MultiLine = False
              .ignoreCase = True
              .Pattern = strPattern
          End With
      
          For Each rcell In rng.Cells
      
              If strPattern <> "" Then
                  strInput = rcell.Value
      
                  If regexp.test(strInput) Then
                      MsgBox rcell & " Matched in Cell " & rcell.Address
                  Else
                      MsgBox "No Matches!"
                  End If
              End If
          Next
      End Sub
      

      【讨论】:

      • 我不想启用参考库,因为我需要我的脚本是可移植的 - VBScript_RegExp_55 库几乎无处不在,因此风险非常低不在特定的目标机器上。而且无论如何,从 Early Bound 切换到 Late Bound 并不能解决可移植性问题(代码仍然会出错,只是在运行时而不是编译时)
      • 当然可以,但是 RegEx 代码不会可用。如果 RegEx 的东西是更大的图书馆工作簿的一部分,我想让它不会引发编译错误,因此允许使用其他部分可能被认为是有用的
      • 我的观点是如果代码不能在早期绑定(有所需的参考),那么它也不能在后期绑定。至于可移植性点,在不同的 PC 上可能存在同一库的不同版本时,这是有好处的。这里几乎不是问题,Regex 库十多年来没有改变,也不太可能很快改变。无论如何,“更改默认设置”是什么意思?库参考是工作簿的一部分,而不是 PC 设置。
      • 我几乎只通过xlam 加载项针对ActiveWorkbook 运行宏,据我了解,启用参考库与本地PC MS Office 设置相关联。如果,这在某种程度上与xlam 相关联,可以共享而无需用户在其端做任何事情,那么也许我错了。我现在更明白你说 Early 和 Late 有不同的错误处理,但我不关心。
      • 你在哪个图书馆有过这样的经历?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-27
      相关资源
      最近更新 更多