Hướng Dẫn Chuyển Đổi Chuỗi Ngày Tháng Thành Date Trong VBA

Giới Thiệu

Trong quá trình làm việc với Excel, đôi khi chúng ta cần chuyển đổi chuỗi ngày tháng có định dạng không cố định thành kiểu dữ liệu Date để thuận tiện cho việc tính toán và xử lý dữ liệu. Trong bài viết này, chúng ta sẽ sử dụng VBA (Visual Basic for Applications) kết hợp với Regular Expressions (Regex) để trích xuất ngày, tháng, năm từ chuỗi và chuyển đổi thành Date trong Excel.


1. Ví Dụ Dữ Liệu Đầu Vào & Kết Quả Mong Muốn

Dưới đây là một số ví dụ về các chuỗi ngày tháng đầu vào và kết quả mong muốn sau khi chuyển đổi:

STT Chuỗi đầu vào Kết quả mong muốn
1 Ngày 01 tháng 10 năm 2024 01-Oct-24
2 Ngày 1 tháng 10 năm 2024 01-Oct-24
3 1/10/2024 01-Oct-24
4 01-10-2024 01-Oct-24
5 Ngày 5 tháng 6 năm 2023 05-Jun-23
6 5.6.2023 05-Jun-23
7 05/06/2023 05-Jun-23
8 Ngày 01 tháng 10 năm 2024 01-Oct-24
9 Ngày 9 tháng 7 năm 2022 09-Jul-22
10 9-7-2022 09-Jul-22
11 Ngày 01, tháng 10, năm 2024 01-Oct-24
12 Ngày 1-tháng 10.năm 2024 01-Oct-24
13 Ngày 01…. tháng: 10 – năm = 2024 01-Oct-24
14 Ngày 6 / tháng 5 / năm 2021 06-May-21
15 Ngày 1.. tháng 2— năm 2020 01-Feb-20

2. Viết Hàm VBA Chuyển Đổi Chuỗi Ngày Thành Date

Chúng ta sẽ sử dụng VBA để viết một hàm ConvertToDate nhằm chuyển đổi các chuỗi ngày tháng có định dạng khác nhau thành kiểu dữ liệu Date.

Hàm VBA:

Function ConvertToDate(dateString As String) As Date
    Dim regex As Object
    Dim matches As Object
    Dim dayPart As Integer, monthPart As Integer, yearPart As Integer
    
    ' Khởi tạo RegExp
    Set regex = CreateObject("VBScript.RegExp")
    regex.Pattern = "(\d{1,2})\D+(\d{1,2})\D+(\d{4})"
    regex.IgnoreCase = True
    regex.Global = False
    
    ' Kiểm tra nếu chuỗi phù hợp với pattern
    If regex.Test(dateString) Then
        Set matches = regex.Execute(dateString)
        If matches.Count > 0 Then
            ' Lấy số ngày, tháng, năm từ chuỗi
            dayPart = CInt(matches(0).SubMatches(0))
            monthPart = CInt(matches(0).SubMatches(1))
            yearPart = CInt(matches(0).SubMatches(2))
            
            ' Trả về giá trị Date
            ConvertToDate = DateSerial(yearPart, monthPart, dayPart)
            Exit Function
        End If
    End If
    
    ' Trả về 0 nếu không hợp lệ
    ConvertToDate = 0
End Function

3. Giải Thích Code VBA

  • Sử dụng RegExp (Regular Expressions) để tìm kiếm và trích xuất dữ liệu ngày, tháng, năm từ chuỗi đầu vào.
  • regex.Pattern = “(\d{1,2})\D+(\d{1,2})\D+(\d{4})”:
    • \d{1,2}: Nhận diện ngày (1 hoặc 2 chữ số).
    • \D+: Nhận diện bất kỳ ký tự nào không phải số (dấu cách, dấu chấm, dấu gạch ngang,…).
    • \d{4}: Nhận diện năm (4 chữ số).
  • Chuyển đổi giá trị ngày, tháng, năm thành DateSerial để tạo kiểu dữ liệu Date trong Excel.
  • Hàm sẽ trả về 0 nếu chuỗi không hợp lệ.

4. Cách Sử Dụng Hàm Trong Excel

  1. Mở VBA Editor:
    • Nhấn ALT + F11 để mở VBA Editor.
    • Chọn Insert > Module.
    • Dán đoạn mã VBA trên vào module mới.
  2. Gọi hàm trong Excel:
    • Ví dụ: Ô A1 chứa chuỗi Ngày 01 tháng 10 năm 2024.
    • Tại ô B1, nhập công thức:
      =ConvertToDate(A1)
    • Nhấn Enter, ô B1 sẽ hiển thị 01-Oct-24.
  3. Định dạng lại cột ngày tháng (nếu cần):
    • Chọn cột chứa kết quả.
    • Vào Format Cells (CTRL + 1), chọn Date và kiểu hiển thị mong muốn (VD: DD-MMM-YY).

5. Tải File Thực Hành

Bạn có thể tải xuống file Excel mẫu chứa dữ liệu thực hành và mã VBA sẵn có tại đây: 📥 Download File Thực Hành


6. Tổng Kết

  • Bài viết này hướng dẫn cách chuyển đổi chuỗi ngày tháng có nhiều định dạng khác nhau thành kiểu dữ liệu Date trong VBA.
  • Sử dụng Regular Expressions (Regex) giúp tự động nhận diện và chuẩn hóa dữ liệu đầu vào.
  • Hàm VBA này hữu ích khi làm việc với dữ liệu nhập từ nhiều nguồn khác nhau.

📌 Bạn có muốn mở rộng hàm để nhận diện tháng viết bằng chữ (ví dụ: “Tháng Một” thành “01”) không? Hãy để lại bình luận! 🚀

 

Leave a Reply

Your email address will not be published. Required fields are marked *