Regex `宏崩溃Excel 2013中没有任何内容

Regex `宏崩溃Excel 2013中没有任何内容,regex,excel,vba,Regex,Excel,Vba,我试图在Excel 2015宏中使用正则表达式。我不知道我是否做错了什么,但每次我运行它,我的Excel都会崩溃。下面是宏: Sub MakeExplicit() Dim whitespace As RegExp Set whitespace = New RegExp whitespace.Pattern = "\s+" whitespace.MultiLine = True whitespace.Global = True Dim impli

我试图在Excel 2015宏中使用正则表达式。我不知道我是否做错了什么,但每次我运行它,我的Excel都会崩溃。下面是宏:

Sub MakeExplicit()

    Dim whitespace As RegExp
    Set whitespace = New RegExp
    whitespace.Pattern = "\s+"
    whitespace.MultiLine = True
    whitespace.Global = True

    Dim implicit As RegExp
    Set implicit = New RegExp
    implicit.Pattern = "^\d+-\d+$"

    Dim row As range

    For Each row In ActiveSheet.UsedRange.Rows

        Dim first As range
        Set first = row.Cells(1, 1)

        Dim str As String
        str = first.Text
        str = whitespace.Replace(str, Nothing)

        If implicit.Test(str) Then 'FIXME here it crashes

            Dim FromTo As Variant
            FromTo = Split(str, "-")

            Dim sFrom, sTo As Integer
            sFrom = FromTo(1)
            sTo = FromTo(2)

            ' doplň chybějící číslice
            ' např [2345, 78] doplní
            ' na [2345, 2378]
            sTo = Left( _
                sFrom, _
                Len(sFrom) - Len(sTo) _
            ) + sTo

            Dim iFrom, iTo As Integer
            iFrom = CInt(sFrom)
            iTo = CInt(sTo)

            If iFrom > iTo Then _
                Err.Raise 42, first.Address, _
                "Wrong order of numbers!"


            Dim i As Integer
            For i = iFrom To iTo
                ' some more code
            Next i

        End If

    Next row

End Sub
通过使用调试器,我发现当代码到达“
If implicit.Test(str),然后
”时,它会崩溃,这意味着RegEx有问题。以下是本项目的参考资料:


显而易见的问题是,我如何让它工作?VBA本身就是一种非常丑陋的语言,所以我不喜欢如何工作,只要让它工作就足够了。

这就是崩溃的原因

str = whitespace.Replace(str, Nothing)
没有任何东西可用于销毁对象<代码>设置对象=无

改用

str = whitespace.Replace(str, "")
或者,根据Mat的杯子

str = whitespace.Replace(str, vbNullString)    ' uses less memory and is more readable

这是一条撞车的线路

str = whitespace.Replace(str, Nothing)
没有任何东西可用于销毁对象<代码>设置对象=无

改用

str = whitespace.Replace(str, "")
或者,根据Mat的杯子

str = whitespace.Replace(str, vbNullString)    ' uses less memory and is more readable
有几件事

1) 行
如果隐式.Test(str),则
不应导致错误

2) 若要将一个或多个空格替换为无空格,请使用
而不是

str = whitespace.Replace(str, "")
3) 由于Split函数返回一个基于0的数组,请使用

sFrom = FromTo(0)
sTo = FromTo(1)
4) 要连接,请使用与(&)而不是加号(+)

希望这有帮助

有几件事

1) 行
如果隐式.Test(str),则
不应导致错误

2) 若要将一个或多个空格替换为无空格,请使用
而不是

str = whitespace.Replace(str, "")
3) 由于Split函数返回一个基于0的数组,请使用

sFrom = FromTo(0)
sTo = FromTo(1)
4) 要连接,请使用与(&)而不是加号(+)


希望这有帮助

我在回答之前试过了。试图在字符串中插入
Nothing
,会导致Excel 2016除了第一点之外的所有结果都被否决
Nothing
是空对象引用,而不是
字符串
。VBA字符串不是对象,将
Nothing
传递给使用值(而不是引用)的方法,这无疑是火上浇油。实际上,我的第一点提到了行
If implicit.Test(str),然后是
,因为OP说它导致了一个错误。我编辑了我的帖子来澄清。谢谢我在回答之前试过了。试图在字符串中插入
Nothing
,会导致Excel 2016除了第一点之外的所有结果都被否决
Nothing
是空对象引用,而不是
字符串
。VBA字符串不是对象,将
Nothing
传递给使用值(而不是引用)的方法,这无疑是火上浇油。实际上,我的第一点提到了行
If implicit.Test(str),然后是
,因为OP说它导致了一个错误。我编辑了我的帖子来澄清。谢谢那个除了我会使用
vbNullString
来代替零字节的内存占用(而空字符串文本使用2字节)。因为我喜欢在魔法文字上使用内置常量:-)
Nothing
也(可能更经常)用于测试表达式是否引用了实际的对象引用:
如果不是Range.Find(“Foo”,Sheet1.UsedRange)则为Nothing
。哎哟,这就是为什么我不应该信任未命名的源代码。这使我误以为
vbNullString
Nothing
是一样的。作为一名VBA新手,我喜欢
Nothing
more;)那个除了我会使用
vbNullString
来代替零字节的内存占用(而空字符串文本使用2字节)。因为我喜欢在魔法文字上使用内置常量:-)
Nothing
也(可能更经常)用于测试表达式是否引用了实际的对象引用:
如果不是Range.Find(“Foo”,Sheet1.UsedRange)则为Nothing
。哎哟,这就是为什么我不应该信任未命名的源代码。这使我误以为
vbNullString
Nothing
是一样的。作为一名VBA新手,我喜欢
Nothing
more;)