6

我正在尝试使用 VBA 正则表达式来验证表单的时间范围:#0:00xm - #0:00xmwhere xis aor p. 所以字符串文字可能是"1:30pm - 12:00am". 我想匹配具有这种模式的单元格。

当我在这个在线工具中使用正则表达式时:http://public.kvalley.com/regex/regex.asp并检查我的表达式,它匹配正确。

但是,当我在 VBA 中使用相同的表达式时,它不匹配。

Dim rRange As Range
Dim rCell As Range

Set rRange = Range("A2", "A4") '"G225")

For Each rCell In rRange.Cells
MsgBox (rCell.Value)
    If rCell.Value Like "^([0-9]{1,2}[:][0-9]{2}[apm]{2}[ ][-][ ][0-9]{1,2}[:][0-9]{2}[apm]{2})$" Then
    MsgBox ("YES")
        'rCell.Interior.Color = RGB(0, 250, 0)
    Else
    MsgBox ("NO")
        'rCell.Interior.Color = RGB(250, 0, 0)
    End If
Next rCell
4

3 回答 3

7

对于任何关心的人,这是我的固定工作版本,特别感谢 dda 提供的更简单的 RegEx ^^:

Dim rRange As Range
Dim rCell As Range

Dim re As Object
Set re = CreateObject("vbscript.regexp")
With re
  .Pattern = "^\d\d?:\d\d[aApP][mM] - \d\d?:\d\d[aApP][mM]$"
  .Global = False
  .IgnoreCase = False
End With

Set rRange = Range("A2", "G225")

For Each rCell In rRange.Cells
    If re.Test(rCell) Then
        rCell.Interior.Color = RGB(0, 250, 0)
    Else
        rCell.Interior.Color = RGB(250, 0, 0)
    End If
Next rCell
于 2012-05-18T19:16:50.797 回答
3

让我们清理并改进您的正则表达式:

^\d\d?:\d\d[aApP][mM] - \d\d?:\d\d[aApP][mM]$

仅当整个单元格是您想要的日期格式时才会匹配,而不是其他(^ _ ___ $ 条件)。我添加了 a 和 A,以及 p 和 P 以确保没有大小写问题。

我在这台机器上没有 VBA/Excel,所以不能用我的正则表达式尝试你的代码,但正则表达式本身可以工作。

于 2012-05-18T18:59:26.593 回答
0

在 Excel 中,转到单元格格式 > 数字 > 类别 > 自定义。您将看到大量时间类型格式。

您可能正在寻找的是 h:mm AM/PM

好的。我确实对此进行了更多研究,并意识到我的短视。

这更多的是你所追求的吗?我对使用 AM/PM 和未以这种方式格式化的单元格的时间值格式进行了基本测试。

Dim rRange As Range
Dim rCell As Range

Set rRange = Range("A2", "A4")

For Each rCell In rRange
    If InStr(1, UCase(rCell.Value), " AM") > 0 Or InStr(1, UCase(rCell.Value), " PM") > 0 Then
        If InStr(1, rCell.Value, ":") <> 0 Then Debug.Print rCell.Value
    End If
Next
于 2012-05-18T18:29:42.030 回答