Bất kỳ ngôn ngữ lập trình nào cũng có thể giúp bạn giải quyết vấn đề này, ở đây là đếm số ngày thứ hai, thứ ba,... chủ nhật trong tháng hiện tại. Điều cốt lõi là giải thuật đếm ngày trong tháng, nếu bạn đã biết giải thuật thì chỉ cần miêu tả giải thuật bằng ngôn ngữ ưa thích. Trong Excel, bạn có thể dùng VBA để viết macro giải quyết vấn đề nào đó. Thí dụ đoạn macro sau sẽ giải quyết vấn đề của bạn:
Option Explicit
‘ Khai báo kiểu chứa thông tin thời gian
Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
‘ Khai báo hàm API của Windows
Private Declare Sub GetLocalTime Lib “kernel32” (lpSystemTime As SYSTEMTIME)
‘ Khai báo biến cần dùng
Dim Days(0 To 6) As Integer
Dim MinDay As Integer
Dim MaxDay As Integer
‘ Macro đếm ngày
Sub DayCount()
Dim lpSystemTime As SYSTEMTIME
Dim iday As Integer
Dim idayofweek As Integer
‘ Khởi động counter ban đầu
For idayofweek = 0 To 6
Days(idayofweek) = 0
Next
‘ đọc thông tin ngày hiện tại
GetLocalTime lpSystemTime
‘ Tìm ngày nhỏ nhất và lớn nhất trong tháng
MinDay = 1
If (lpSystemTime.wMonth = 2) Then
MaxDay = 28
‘ Nên kiểm tra thêm năm nhuần, có 29 ngày
ElseIf (lpSystemTime.wMonth < 8 And lpSystemTime.wMonth Mod 2) Then
MaxDay = 31
ElseIf (lpSystemTime.wMonth > 7 And (lpSystemTime.wMonth Mod 2) = 0) Then
MaxDay = 31
Else
MaxDay = 30
End If
‘ Tính số ngày trong tuần của tháng hiện tại
iday = lpSystemTime.wDay
idayofweek = lpSystemTime.wDayOfWeek
While (iday <= MaxDay)
Days(idayofweek) = Days(idayofweek) + 1
iday = iday + 1
idayofweek = (idayofweek + 1) Mod 7
Wend
iday = lpSystemTime.wDay
idayofweek = lpSystemTime.wDayOfWeek
Days(idayofweek) = Days(idayofweek) - 1
While (iday >= MinDay)
Days(idayofweek) = Days(idayofweek) + 1
iday = iday - 1
If (idayofweek = 0) Then
idayofweek = 6
Else
idayofweek = idayofweek - 1
End If
Wend
‘ Hiển thị kết quả
MsgBox (“C.Nhat:” & Days(0) & “, T.Hai:” & Days(1) & “, T.Ba:” & Days(2) & “, T.Tu:” & Days(3) & “, T.Nam:” & Days(4) & “, T.Sau:” & Days(5) & “, T.Bay:” & Days(6))
End Sub
Option Explicit
‘ Khai báo kiểu chứa thông tin thời gian
Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
‘ Khai báo hàm API của Windows
Private Declare Sub GetLocalTime Lib “kernel32” (lpSystemTime As SYSTEMTIME)
‘ Khai báo biến cần dùng
Dim Days(0 To 6) As Integer
Dim MinDay As Integer
Dim MaxDay As Integer
‘ Macro đếm ngày
Sub DayCount()
Dim lpSystemTime As SYSTEMTIME
Dim iday As Integer
Dim idayofweek As Integer
‘ Khởi động counter ban đầu
For idayofweek = 0 To 6
Days(idayofweek) = 0
Next
‘ đọc thông tin ngày hiện tại
GetLocalTime lpSystemTime
‘ Tìm ngày nhỏ nhất và lớn nhất trong tháng
MinDay = 1
If (lpSystemTime.wMonth = 2) Then
MaxDay = 28
‘ Nên kiểm tra thêm năm nhuần, có 29 ngày
ElseIf (lpSystemTime.wMonth < 8 And lpSystemTime.wMonth Mod 2) Then
MaxDay = 31
ElseIf (lpSystemTime.wMonth > 7 And (lpSystemTime.wMonth Mod 2) = 0) Then
MaxDay = 31
Else
MaxDay = 30
End If
‘ Tính số ngày trong tuần của tháng hiện tại
iday = lpSystemTime.wDay
idayofweek = lpSystemTime.wDayOfWeek
While (iday <= MaxDay)
Days(idayofweek) = Days(idayofweek) + 1
iday = iday + 1
idayofweek = (idayofweek + 1) Mod 7
Wend
iday = lpSystemTime.wDay
idayofweek = lpSystemTime.wDayOfWeek
Days(idayofweek) = Days(idayofweek) - 1
While (iday >= MinDay)
Days(idayofweek) = Days(idayofweek) + 1
iday = iday - 1
If (idayofweek = 0) Then
idayofweek = 6
Else
idayofweek = idayofweek - 1
End If
Wend
‘ Hiển thị kết quả
MsgBox (“C.Nhat:” & Days(0) & “, T.Hai:” & Days(1) & “, T.Ba:” & Days(2) & “, T.Tu:” & Days(3) & “, T.Nam:” & Days(4) & “, T.Sau:” & Days(5) & “, T.Bay:” & Days(6))
End Sub