Regex `宏崩溃Excel 2013中没有任何内容
我试图在Excel 2015宏中使用正则表达式。我不知道我是否做错了什么,但每次我运行它,我的Excel都会崩溃。下面是宏: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
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;)