2012-05-18 23 views
6

Tôi đang cố gắng sử dụng cụm từ thông dụng VBA để xác thực phạm vi thời gian của biểu mẫu: #0:00xm - #0:00xm trong đó xa hoặc p. Vì vậy, chuỗi chữ có thể là "1:30pm - 12:00am". Tôi muốn khớp các ô có mẫu này.Biểu thức chính quy VBA phù hợp với phạm vi thời gian như "1:30 chiều - 12:00 sáng"

Khi tôi sử dụng biểu thức chính quy trong công cụ trực tuyến này: http://public.kvalley.com/regex/regex.asp và kiểm tra biểu thức của tôi, nó khớp chính xác.

Tuy nhiên, khi tôi sử dụng cùng một biểu thức trong VBA, nó không khớp.

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 
+0

Kiểm tra xem các nhà điều hành LIKE là trường hợp nhạy cảm./[apm] {2}/có thể được viết là/[ap] m /, và sẽ rõ ràng hơn những chuỗi có thể chấp nhận được. –

+0

Bây giờ bạn đang đặt '/' trước đó. Bạn có nghĩ rằng đó có thể là vấn đề? Nếu vậy, làm thế nào tôi sẽ sử dụng đúng '/'? – Matt

+1

@Matt không sử dụng '/' - hãy nghĩ về dấu gạch chéo làm dấu ngoặc kép quanh '/ regex literal /' (cú pháp thực sự được sử dụng trong perl, javascript và các ngôn ngữ khác) – Aprillion

Trả lời

7

Đối với những ai quan tâm, đây là cố định, phiên bản làm việc của tôi với cảm ơn đặc biệt đến dda cho RegEx đơn giản hơn mình ^^:

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 
+2

cảm ơn bạn đã đăng bài này. đã giúp tôi học –

0

Bên trong Excel, chuyển đến Định dạng ô> Số> Danh mục> Tùy chỉnh. Bạn sẽ thấy nhiều định dạng kiểu thời gian.

Những gì bạn có thể đang tìm kiếm là h: mm AM/PM

OK. Tôi đã nhìn sâu hơn vào điều này và nhận ra tầm nhìn ngắn của tôi.

Đây có phải là những gì bạn đang theo dõi không? Tôi đã làm một bài kiểm tra cơ bản về định dạng giá trị thời gian với AM/PM và các ô không được định dạng theo cách đó.

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 
+2

tôi không nghĩ rằng bạn có thể regex-phù hợp với một số định dạng vì nó là một chuỗi - bạn đã thử nó ?? – Aprillion

+0

cảm ơn vì đã chỉ tầm nhìn ngắn của tôi. Tôi đã chỉnh sửa câu trả lời của tôi cho một cách tiếp cận VBA chức năng hơn, tôi tin. –

3

Hãy dọn dẹp và cải thiện regex của bạn:

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

này sẽ chỉ phù hợp nếu toàn bộ tế bào là một ngày định dạng giống như bạn muốn nó, và không có gì khác (các^_ ___ $ conditions). Tôi đã thêm cả a và A và p và P để chắc chắn không có sự cố nào.

Tôi không có VBA/Excel trên máy này, vì vậy không thể thử mã của bạn với regex của tôi, nhưng regex mỗi hoạt động.

+0

đến điểm của David Gorsline ở trên, VBA không hỗ trợ RegEx –

+0

@Scott LIKE nhà điều hành không hỗ trợ RegEx, không phải VBA – Aprillion

+0

ah ... vì vậy, là một cái gì đó như thế này được coi là RegEx - _ ($ * #, ## 0 _); _ ($ * (#, ## 0); _ ($ * "-" _); _ (@_) -. Beinga tự học VBA khám phá các lĩnh vực lập trình khác, tôi vẫn đang học rất nhiều về lập trình bên ngoài VBA !EDIT: -> nevermind, tôi thấy liên kết của bạn ở trên –

Các vấn đề liên quan