【问题标题】:`Nothing` in macro crashes Excel 2013宏中的“无”使 Excel 2013 崩溃
【发布时间】:2017-08-17 23:44:10
【问题描述】:

我正在尝试在 Excel 2015 宏中使用 RegEx。我不知道我是否做错了什么,但每次我运行它时,我的 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) Then”时它会崩溃,这意味着 RegEx 有问题。这些是项目的参考资料:

显而易见的问题是如何让它工作? VBA 本身就是一种非常丑陋的语言,所以我对如何没有偏好,只是让它工作够了。

【问题讨论】:

    标签: regex excel vba


    【解决方案1】:

    这是崩溃的行

    str = whitespace.Replace(str, Nothing)
    

    Nothing用于销毁对象...set object = nothing

    改用

    str = whitespace.Replace(str, "")
    

    或者,根据 Mat's Mug

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

    【讨论】:

    • 那个。除了我会使用 vbNullString 来代替零字节占用空间(而空字符串文字使用 2 个字节)。因为我只是喜欢使用内置常量而不是魔法文字:-)
    • Nothing 也(可能更频繁地)用于测试,如果一个表达式引用了一个实际的对象引用:If Not Range.Find("Foo", Sheet1.UsedRange) Is Nothing Then
    • 哎呀,这就是为什么我不应该相信未引用的来源。这个SO answer 误导我认为vbNullStringNothing 是相同的。作为一个 VBA 新手,我更喜欢 Nothing 的声音 ;)
    【解决方案2】:

    一些事情......

    1) If implicit.Test(str) Then 行不应导致错误。

    2) 要替换一个或多个不带空格的空格,请使用"" 而不是Nothing...

    str = whitespace.Replace(str, "")
    

    3) 由于Split函数返回一个从0开始的数组,所以使用...

    sFrom = FromTo(0)
    sTo = FromTo(1)
    

    4) 要连接,请使用与号 (&) 代替加号 (+)...

        sTo = Left( _
            sFrom, _
            Len(sFrom) - Len(sTo) _
        ) & sTo
    

    希望这会有所帮助!

    【讨论】:

    • 我在回答之前试过了。尝试将Nothing 插入字符串会导致 Excel 2016 崩溃
    • 赞成除第一点以外的所有内容...Nothing 是一个空的对象引用,而不是String。 VBA 字符串不是对象,将 Nothing 传递给与 values(不是 references)一起使用的方法,确实会火上浇油.
    • 实际上,我的第一点指的是If implicit.Test(str) Then这一行,因为OP说它导致了错误。我已经编辑了我的帖子以澄清。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多