Chuyển ngày từ chuỗi để Excel hiểu

Liên hệ QC

cantl

!!! Giải thoát !!!
Tham gia
6/8/08
Bài viết
1,805
Được thích
1,153
Giới tính
Nam
Tình hình là em mới mò được cái này. Tạm thời viết sơ sơ, chưa biết sẽ gặp những lỗi gì.
Mã:
Public Function NgayTuChuoi(CellNgay As Range) As String
    Dim Regex As Object
    Dim Ngay As Object
    Set Regex = CreateObject("vbscript.regexp")
    With Regex
        .Global = True
        .pattern = "\d{2,4}[\/-]\d{1,2}[\/-]\d{2,4}"
       Set Ngay = Regex.Execute(CellNgay)
       End With
    NgayTuChuoi = Ngay(0)
End Function

Public Function NgayThat(CellNgay As Range, Optional Deli$ = "/", Optional TypeD$ = "dmy")
Dim arrNgay As Variant
Dim arrTypeD(3) As String
Dim Item As Variant
Dim NgayDangChuoi$
Dim Ngay%, Thang%, Nam%
arrTypeD(0) = Mid(TypeD, 1, 1)
arrTypeD(1) = Mid(TypeD, 2, 1)
arrTypeD(2) = Mid(TypeD, 3, 1)
NgayDangChuoi = NgayTuChuoi(CellNgay)
arrNgay = Split(NgayDangChuoi, Deli)
For Item = 0 To UBound(arrNgay)
Select Case arrTypeD(Item)
   Case Is = "d"
      Ngay = arrNgay(Item)
   Case Is = "m"
      Thang = arrNgay(Item)
   Case Else
      Nam = arrNgay(Item)
End Select
Next
NgayThat = DateSerial(Nam, Thang, Ngay)
End Function
Mục đích là như hình ảnh, khó diễn tả thành lời:

1697451460950.png

Hy vọng các bác lướt qua góp ý để em lại tiếp tục mò bổ sung.
File chưa bẫy lỗi vì trình độ không lường được sẽ gặp lỗi gì.
 

File đính kèm

  • Tach 1 ngay trong Chuoi.xlsm
    20.2 KB · Đọc: 10
Nếu theo chuẩn này thì em nghĩ không nên dùng hàm Cdate nữa, em đang so sánh từng giá trị với array(d,m,y), có lẽ nếu tháng>12 thì đảo "d" và "m".

Thêm nữa:
slkda jflsd jflsa 23-5-13 ls ls sadkf, em đang hiểu là 13/5/2023, Cdate hiểu là 23/5/2013.



Em còn vướng chỗ Regex thế này:

pattern = "\d{1,4}[\/|.|-]\d{1,2}[\/|.|-]\d{1,4}" sẽ lấy được 3 loại:
13/10/2023
13-10-2023
13.10.2023

nhưng nếu đổi chỗ "." và "-" (pattern = "\d{1,4}[\/|-|.]\d{1,2}[\/|-|.]\d{1,4}") thì lại chỉ lấy được 2 cái:
13/10/2023
13-10-2023
13.10.2023
Sau khi nhìn trộm regex của Nhattan, thì em sửa lại như sau, đảo ký tự sẽ đều giống nhau:

"\d{1,4}[\/\-\.]\d{1,2}[\/\-\.]\d{1,4}"
hoặc
"\d{1,4}[\/\.\-]\d{1,2}[\/\.\-]\d{1,4}"

Hoặc gọn hơn nữa:
"\d{1,4}[/.-]\d{1,2}[/.-]\d{1,4}"
hoặc
"\d{1,4}[/\-.]\d{1,2}[/\-.]\d{1,4}"

Regex chẳng khác chi cuộc đời, sống ngay thẳng là điều cấm kỵ, chỉ có nghiêng bên này, nghiêng bên kia thì mới thuận theo thời thế.
_)()(- _)()(- _)()(-
 
Lần chỉnh sửa cuối:
Upvote 0
Sau khi nhìn trộm regex của Nhattan, thì em sửa lại như sau, đảo ký tự sẽ đều giống nhau:

"\d{1,4}[\/\-\.]\d{1,2}[\/\-\.]\d{1,4}"
hoặc
"\d{1,4}[\/\.\-]\d{1,2}[\/\.\-]\d{1,4}"

Regex chẳng khác chi cuộc đời, sống ngay thẳng là điều cấm kỵ, chỉ có nghiêng bên này, nghiêng bên kia thì mới thuận theo thời thế.
_)()(- _)()(- _)()(-
Cái pattern của món regex này nhìn rối mắt quá.
 
Upvote 0
Cái món regex này, quả thật rối, mình chỉ dùng khi chẳng đặng đừng.
 
Upvote 0
Sau khi nhìn trộm regex của Nhattan, thì em sửa lại như sau, đảo ký tự sẽ đều giống nhau:

"\d{1,4}[\/\-\.]\d{1,2}[\/\-\.]\d{1,4}"
hoặc
"\d{1,4}[\/\.\-]\d{1,2}[\/\.\-]\d{1,4}"

Hoặc gọn hơn nữa:
"\d{1,4}[/.-]\d{1,2}[/.-]\d{1,4}"
hoặc
"\d{1,4}[/\-.]\d{1,2}[/\-.]\d{1,4}"

Regex chẳng khác chi cuộc đời, sống ngay thẳng là điều cấm kỵ, chỉ có nghiêng bên này, nghiêng bên kia thì mới thuận theo thời thế.
1. Mẫu của bạn không có chỗ bắt/capture chuỗi con thì làm sao đảo?

2. Mẫu không hẳn đúng lắm. Nó sẽ lấy tất cả
từ 1/1/1 đến 001/01/0001

Bài này làm đúng phải có nhiều dạng mẫu và thử từng cái. Đúng mẫu nào thì phân tích theo kiểu đó.

mau(1) = mẫu test dạng dd/mm/yy
mau(2) = mẫu test dạng mm/dd/yy
mau(3) = ...

For i = 1 To UBound(mau)
If regEx.Test(mau(i)) Then Exit For
Next i
Select i
Case 1
' giải lý theo dd/mm/yy
Case 2
' giải lý theo mm/dd/yy
Case 3
...
Case Else ' chả mẫu nào match
End Select

(xem thêm bên dưới)

Cái món regex này, quả thật rối, mình chỉ dùng khi chẳng đặng đừng.

Tại quý vị không quen Unix cho nên nghe tới Regex thì đã có thành kiến, rồi ngại học cách đọc pattern.

Cái pattern của thớt ngắn ngủn, không có capture, không có dòm trước/lookahead, ngó sau/lookbehind. Vậy mà cũng than rắc rối. Trong khi đó, gặp mấy công thức excel khủng dài cả cây số thì đọc ào ào.

Đối với tôi, Regex pattern còn dễ đọc hơn công thức khủng. Cũng giống như công thức khủng, chỉ cần lấy từng đoạn ra thử. Trên mạng có hằng chục quép sai chuyên thử pattern, chỉ cần 30 giây thì biết cách thử trên các nơi này.

Cái khó của Regex trên VBA là duyệt xong rồi lấy kết quả không giản dị lắm.
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom