Hàm EOMONTH: Trả về ngày kết thúc của tháng

Cấu trúc của hàm EOMONTH:
EOMONTH(Ngay,SoThang)
Ngay: Là ngày bắt đầu do người dùng chỉ định. Ví dụ 20/4/2019
SoThang: Là số tháng tính từ ngày bắt đầu do người dùng chỉ định. Ví dụ : 1

Như vậy 20/4/2019 được xác định là tháng 4/2019 tiếp theo 1 tháng là 5/2019, và ngày cuối cùng của tháng 5/2019 là ngày 31/5/2019.
Vì vậy ta sẽ có kết quả: EOMONTH("20/4/2019",1) = 31/5/2019.

Như vậy nếu muốn tìm ngày cuối cùng của tháng 4/2019 thì ở công thức trên ta sửa thành:
EOMONTH("20/4/2019",0) = 30/4/2019.

Một số ví dụ khác:
Trường hợpCột ACông thứcKết quả
1
1/8/2016​
=EOMONTH(A1,1)
30/9/2016​
2
15/8/2016​
=EOMONTH(A2,2)
31/10/2016​
3
31/8/2016​
=EOMONTH(A3,3)
30/11/2016​
4
1/8/2016​
=EOMONTH(A4,-1)
31/7/2016​

Ứng dụng: Ta có thể sử dụng hàm Excel này vào VBA:
Ví dụ tìm ngày cuối cùng của tháng 2/2020
Mã:
Sub test()
    Dim d As Date
    d = CDate(Format("12/2/2020", "dd/mm/yyyy")) 'lay ngay bat ky cua thang 2/2020
    d = timngaycuoi(d)
    MsgBox d
End Sub

Function timngaycuoi(ByVal d As Date) As Date
    timngaycuoi = WorksheetFunction.EoMonth(d, 0) 'Chu y nhap la 0
End Function
Kết quả là 29/2/2020.
 
Sửa lần cuối:

PTHhn

Yêu THVBA như điếu đổ
Như vậy từ 20/4/2019 tiếp theo 1 tháng là ngày 20/5/2019, và ngày cuối cùng của tháng 5/2019 là ngày 31/5/2019.
Vì vậy ta sẽ có kết quả: EOMONTH("20/4/2019",1) = 31/5/2019.
Cảm ơn bạn về bài viết dễ hiểu, trình bày đẹp. Nhưng ở đoạn trên có lẽ nên hiểu lại:
20/4/2019 là tháng 4, tiếp theo 1 tháng là tháng 5, và hàm này trả về ngày cuối cùng của tháng 5.

Lý do phản biện: Giả sử như bạn trình bày ở trên là đúng. Tôi lấy trường hợp đặc biệt.
cells A1 = 31/1/2020/
EOMONTH(A1,1) nếu theo thuyết minh trên, tiếp theo 1 tháng sẽ rơi vào ngày 31/2/2020, nhưng vì tháng 2/2020 chỉ có 29 ngày nên khả năng rơi sang tháng 3. Như vậy ngày cuối của 3/2020 là 31/3/2020.
Nhưng thực tế EOMONTH(A1,1) = 29/2/2020.
Như vậy cách hiểu của tôi là đúng. Hàm này lấy tháng hiện tại của ngày mà bạn chỉ định, sau đó cộng với số tháng, ví dụ ra tháng 7 thì nó lấy ngày cuối cùng của tháng 7 đó.
 
Cảm ơn @PTHhn đã , mình đã xác nhận là đúng như bạn nói. Mình đã update bài .
 

tuhocvba

Administrator
Thành viên BQT
Theo thông tin , thì hàm EOMONTH có thể dùng từ Office 2007 trở đi. Đối với Office 2003 thì không dùng được.
Bạn cần đăng nhập để thấy đính kèm

Từ ngày bất kỳ trong tháng 3, chẳng hạn là ngày 15/3, chúng ta muốn tìm ngày cuối tháng 3 (31/3), chúng ta có thể dùng hàm EOMONTH như bài viết đã nêu.
Suy nghĩ logic như thế này, ta bắt đầu ngày đầu tiên của tháng 4. d = 1/4.
Bạn cần đăng nhập để thấy đính kèm

d- 1 = 31/3.
Mã:
Sub test()
    Dim d As Date
    d = Now()
    d = eomonththvba(d)
    MsgBox d
End Sub
Function eomonththvba(ByVal dtemp As Date) As Date
    Dim y   As Integer
    Dim m   As Byte
    Dim d   As Byte
    Dim d2  As Date
    Dim s   As String
    
    
    y = Year(dtemp)
    m = Month(dtemp)
    d = Day(dtemp)
    
    If m = 12 Then
        'Ex: 15/12/2020 => 1/1/2021
        m = 1
        d = 1
        y = y + 1
        s = CStr(d) & "/" & CStr(m) & "/" & CStr(y) 'Ex: 1/1/2021
        d2 = CDate(Format(s, "dd/mm/yyyy"))
        eomonththvba = d2 - 1 'Ex: 31/12/2020
    Else
        m = m + 1
        d = 1
        s = CStr(d) & "/" & CStr(m) & "/" & CStr(y) 'Ex: 1/9/2020
        d2 = CDate(Format(s, "dd/mm/yyyy"))
        eomonththvba = d2 - 1 'Ex: 31/8/2020
    End If
    
End Function
Đây cũng là cách nghĩ mà tôi đã dùng ở . Cách nghĩ này dùng đúng trong mọi phiên bản office.
Không chỉ là VBA, vì được viết là Function nên các bạn cũng có thể dùng như một hàm trên bảng tính Excel.
Bạn cần đăng nhập để thấy đính kèm

(Máy tính của tôi để là năm-tháng-ngày cho nên hiển thị ra như trên).

tôi thấy có bạn sử dụng hàm EOMONTH, nhưng nếu dùng hàm này cần nói rõ là nó chỉ dùng được từ Office 2007 trở đi.
Từ "EO" là viết tắt của từ End Of. Như vậy EOMONTH nghĩa là End Of Month tức là ngày cuối cùng của tháng.
 
Top