为什么当给出的输入错误时,vba总是返回No Error?

时间:2016-11-28 07:25:55

标签: excel vba excel-vba

我正在编写一个小宏,它将遍历工作表中的所有单元格并测试特定正则表达式的列。我写了一个简单的正则表达式来比较输入是否为字符串;如果是,那么它应该忽略它,否则它应该将单元格格式化为红色。预期的输出是内容错误的单元格应该着色。但是,VBA会处理每个内容并将每个错误的条目传递为正确。

这是我的代码:

 Dim RegEx As Object
 Set RegEx = CreateObject("VBScript.RegExp")

       With RegEx
                .Pattern = "/^[A-Za-z]+$/"
                .Global = True
                .IgnoreCase = True

                If .Test(cell_value) Then
                    Cells.Item(num_rows, num_cols).Interior.ColorIndex = RGB(255, 0, 0)

                    MsgBox "Error" + cell_value
                Else
                    MsgBox "No error" + cell_value
                End If
            End With

即使输入错误,也始终返回“无错误”。任何提示?

2 个答案:

答案 0 :(得分:1)

你知道,在你的例子中,每个单元格的cantoning模式都会被标记为错误,对吧?更具体地说,如果在您的示例中.Pattern = "A",则每个包含字母Aa(感谢IgnoreCase = True)的单元格都会被标记为错误,而不是。

如果这是您的意图,那么您的模式必定存在问题。您发布的脚本对我来说很好。

答案 1 :(得分:1)

您可以使用条件格式(即没有代码)来执行此操作

例如,只有当字符串包含A-Z时,此条件格式才会返回 TRUE

  

A是65
  B是90

所以测试是每个角色的值是否在64&之间。通过比较这些测试的总和与字符串的长度来进行比较。

=SUMPRODUCT(--((CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>64)), --(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<91))=LEN(A1)

我在2004年写了另一个问题,像Barry Houdini这样的人使用Xl2013和xl2016中的新功能可能有更好的解决方案。