Tại anh nhìn kỹ quá. Tôi thì chỉ cần nhìn tới chỗ năm nào để vào cột có thứ nấy (trong tuần) là làm luôn. ...
Bài này, theo tôi phân tích thì nó đâu có cần dữ liệu năm. Chỉ cần biết năm nhuần đầu tiên (2024) và năm giới hạn cuối cùng (2099) thôi.
Dim dte As Date
For dte = DateSerial(2024, 2, 29) To DateSerial(2099) Step 365 * 4 + 1
' code ghi dte ra bảng ở đây
Next dte
1. Cái công thức trên trông hỗn đọn nhưng thực ra nó chỉ phải tính mỗi thứ 1 lần. Các giải thuật trước dây phải gọi hàm dateserial ít nhất 19 lần.
2. Vì năm không gồm năm đầu thế kỷ (chia chẵn 100) cho nên con số 365 * 4 + 1 là đúng 4 năm.
Có cả phần ghi ra bảng:
Dim ngayThu(1 To 7) As Long ' mảng ghi nhớ vị trí hiện tại ở mỗi cột
Dim rg As Range, thu As Long
Set rg = #WorkSheet#.Range("ô gì đó") ' ô này là ô bắt đầu ghi dữ liệu
rg.Cells(0, 1).Resize(1, 7).Value = Array("CN", "T2", "T3", "T4", "T5", "T6", "T7") ' tiêu đề, 0 có nghĩa là dòng trên nó
Dim dte As Date
For dte = DateSerial(2024, 2, 29) To DateSerial(2099, 2, 29) Step 365 * 4 + 1
' code ghi dte ra bảng ở đây
thu = Weekday(dte)
ngayThu(thu) = ngayThu(thu) + 1
rg.Cells(ngayThu(thu), thu) = dte
Next dte