- Tham gia
- 3/7/07
- Bài viết
- 4,946
- Được thích
- 23,206
- Nghề nghiệp
- Dạy đàn piano
Các bác ơi, vì tìm trong VBA của Excel 2003 không có hàm EoMonth (End of month - tính ngày cuối tháng) nên tui mạo muội chế ra cái hàm này, sẵn tiện làm luôn cái tính đầu tháng (SoMonth - Start of Month).
* HOMNAY = tính ngày cuối tháng (hay đầu tháng) từ cái ngày này, có thể gõ chuỗi dạng "dd/mm/yyyy" hay dùng các hàm như Now(), Today()...
* LECH = từ cái tháng của HOMNAY tính lệch đi bao nhiêu tháng, nếu tính ngược về trước thì gõ dấu âm.
Phải chi mà VBA của Excel 2003 cũng có cái hàm EoMonth như Excel 2007 thì khỏe quá, khỏi làm cái chuyện này. Nhưng thôi, các bác xem và cho xin ý kiến nghe. Thanks.
* HOMNAY = tính ngày cuối tháng (hay đầu tháng) từ cái ngày này, có thể gõ chuỗi dạng "dd/mm/yyyy" hay dùng các hàm như Now(), Today()...
* LECH = từ cái tháng của HOMNAY tính lệch đi bao nhiêu tháng, nếu tính ngược về trước thì gõ dấu âm.
Function EoMonth(HOMNAY As String, LECH As Integer)
XMONTH = Month(HOMNAY)
XYEAR = Year(HOMNAY)
If LECH >= 0 Then
XMONTH = XMONTH + LECH - 12 * Application.WorksheetFunction.Floor((XMONTH + LECH - 1) / 12, 1)
XYEAR = XYEAR - Application.WorksheetFunction.Floor((XMONTH + LECH - 1) / 12, 1)
Else
XMONTH = XMONTH + LECH + 12 * Application.WorksheetFunction.Floor(-(XMONTH + LECH - 12) / 12, 1)
XYEAR = XYEAR + Application.WorksheetFunction.Floor(-(XMONTH + LECH - 12) / 12, 1)
End If
If XMONTH = 1 Or XMONTH = 3 Or XMONTH = 5 Or XMONTH = 7 Or XMONTH = 8 Or XMONTH = 10 Or XMONTH = 12 Then xday = 31
If XMONTH = 4 Or XMONTH = 6 Or XMONTH = 9 Or XMONTH = 11 Then xday = 30
If XMONTH = 2 Then
If XYEAR \ 4 = 0 Then
xday = 29
Else: xday = 28
End If
End If
EoMonth = Application.WorksheetFunction.TEXT(xday & "/" & XMONTH & "/" & XYEAR, "dd/mm/yyyy")
End Function
Function SoMonth(HOMNAY As String, LECH As Integer)
XMONTH = Month(HOMNAY)
XYEAR = Year(HOMNAY)
If LECH >= 0 Then
XMONTH = XMONTH + LECH - 12 * Application.WorksheetFunction.Floor((XMONTH + LECH - 1) / 12, 1)
XYEAR = XYEAR - Application.WorksheetFunction.Floor((XMONTH + LECH - 1) / 12, 1)
Else
XMONTH = XMONTH + LECH + 12 * Application.WorksheetFunction.Floor(-(XMONTH + LECH - 12) / 12, 1)
XYEAR = XYEAR + Application.WorksheetFunction.Floor(-(XMONTH + LECH - 12) / 12, 1)
End If
xday = 1
SoMonth = Application.WorksheetFunction.TEXT(xday & "/" & XMONTH & "/" & XYEAR, "dd/mm/yyyy")
End Function
XMONTH = Month(HOMNAY)
XYEAR = Year(HOMNAY)
If LECH >= 0 Then
XMONTH = XMONTH + LECH - 12 * Application.WorksheetFunction.Floor((XMONTH + LECH - 1) / 12, 1)
XYEAR = XYEAR - Application.WorksheetFunction.Floor((XMONTH + LECH - 1) / 12, 1)
Else
XMONTH = XMONTH + LECH + 12 * Application.WorksheetFunction.Floor(-(XMONTH + LECH - 12) / 12, 1)
XYEAR = XYEAR + Application.WorksheetFunction.Floor(-(XMONTH + LECH - 12) / 12, 1)
End If
If XMONTH = 1 Or XMONTH = 3 Or XMONTH = 5 Or XMONTH = 7 Or XMONTH = 8 Or XMONTH = 10 Or XMONTH = 12 Then xday = 31
If XMONTH = 4 Or XMONTH = 6 Or XMONTH = 9 Or XMONTH = 11 Then xday = 30
If XMONTH = 2 Then
If XYEAR \ 4 = 0 Then
xday = 29
Else: xday = 28
End If
End If
EoMonth = Application.WorksheetFunction.TEXT(xday & "/" & XMONTH & "/" & XYEAR, "dd/mm/yyyy")
End Function
Function SoMonth(HOMNAY As String, LECH As Integer)
XMONTH = Month(HOMNAY)
XYEAR = Year(HOMNAY)
If LECH >= 0 Then
XMONTH = XMONTH + LECH - 12 * Application.WorksheetFunction.Floor((XMONTH + LECH - 1) / 12, 1)
XYEAR = XYEAR - Application.WorksheetFunction.Floor((XMONTH + LECH - 1) / 12, 1)
Else
XMONTH = XMONTH + LECH + 12 * Application.WorksheetFunction.Floor(-(XMONTH + LECH - 12) / 12, 1)
XYEAR = XYEAR + Application.WorksheetFunction.Floor(-(XMONTH + LECH - 12) / 12, 1)
End If
xday = 1
SoMonth = Application.WorksheetFunction.TEXT(xday & "/" & XMONTH & "/" & XYEAR, "dd/mm/yyyy")
End Function
Phải chi mà VBA của Excel 2003 cũng có cái hàm EoMonth như Excel 2007 thì khỏe quá, khỏi làm cái chuyện này. Nhưng thôi, các bác xem và cho xin ý kiến nghe. Thanks.