Tính ngày đầu tháng và cuối tháng trừ ngày nghỉ trong năm (1 người xem)

Người dùng đang xem chủ đề này

Em khong biet

Thành viên hoạt động
Tham gia
2/12/14
Bài viết
103
Được thích
10
Xin chào các bác trong diễn đàn!

Các bác cho em hỏi làm thế nào để tính được ngày làm việc bắt đầu của tháng và ngày kết thúc của tháng (trừ thứ bảy, chủ nhật, ngày lễ tết)

Ví dụ:
Ở tháng 1 năm 2015, được nghỉ từ ngày 01 tháng 01 đến ngày 03 tháng 01 do ngày mùng 01 là nghỉ tết dương lịch, mùng 02, mùng 03 là thứ bảy và chủ nhật nên ngày bắt đầu là ngày mùng 04/01/2015, tương tự cuối tháng 01 là ngày 31 nhưng lại vào thứ bảy nên ngày kết thúc trong tháng là ngày 30/01/2015.

Rất mong nhận được sự giúp đỡ của các bác!
Chúc diễn đàn ngày càng phát triển!
 

File đính kèm

Lần chỉnh sửa cuối:
Mình làm bằng hàm tự tạo, bạn tham khảo nha:
 

File đính kèm

Xin chào các bác trong diễn đàn!

Các bác cho em hỏi làm thế nào để tính được ngày làm việc bắt đầu của tháng và ngày kết thúc của tháng (trừ thứ bảy, chủ nhật, ngày lễ tết)

Ví dụ:
Ở tháng 1 năm 2015, được nghỉ từ ngày 01 tháng 01 đến ngày 03 tháng 01 do ngày mùng 01 là nghỉ tết dương lịch, mùng 02, mùng 03 là thứ bảy và chủ nhật nên ngày bắt đầu là ngày mùng 04/01/2015, tương tự cuối tháng 01 là ngày 31 nhưng lại vào thứ bảy nên ngày kết thúc trong tháng là ngày 30/01/2015.
Rất mong nhận được sự giúp đỡ của các bác!
Chúc diễn đàn ngày càng phát triển!
Ý bạn là thế nào?
1) Tính số ngày giữa cột "Bắt đầu" và "Kết thúc"??? Đúng --> =Cột "Kết thúc" - cột "Bắt đầu"
2) Công thức để ra ngày ở cột "Bắt đầu" và "Kết thúc" ??? Ví dụ ra kết quả 04/01/2015 và 30/01/2015 vân vân và vân vân
3) "trừ thứ bảy, chủ nhật, ngày lễ tết" nghĩa là như thế nào? Có phải là trừ những ngày thứ bảy, chủ nhật, ngày lễ tết trong khoảng 04/01/2015 và 30/01/2015?
 
Để có đáp án cho bài này bạn cần phải có danh sách các ngày nghỉ trong năm:

1/Nghỉ lễ:
-Tết Dương lịch : Nghỉ ngày 01/01 hàng năm (1 ngày).
-Tết Âm lịch: Nghỉ ngày Âm lịch cuối năm trước và 4 ngày đầu năm Âm lịch ( 5 ngày)
-Ngày giỗ tổ Hùng Vương 10/3 Âm lịch (1 ngày)
-Ngày 30/4 (1 ngày)
-Ngày 01/5 (1 ngày)
-Ngày 2/9 (1 ngày)

2/Nghỉ hàng tuần: Tùy theo quy định của đơn vị, nghỉ thứ 7 và Chủ Nhật hay chỉ nghỉ Chủ nhật

* Trong các ngày nghỉ theo quy định không thống nhất là Âm lịch và Dương lịch nên ta cần có hàm chuyển đổi về Dương lịch (Tham khảo Hồ Ngọc Đức).
* Do số ngày nghỉ dài nhất không quá 7 ngày (30 Tết AL vào thứ 2 chẳng hạn) Vậy là chỉ cần kiểm tra 8 ngày đầu tháng và cuối tháng không dính danh sách trên là OK làm việc.
*Để thuận tiện ta nên dùng VBA.
*Để tùy biến: Ta nên lập hẳn Danh sách các ngày nghỉ vì để phòng trường hợp Chính phủ cho phép làm bù, đổi ngày để dồn ngày nghỉ như 1 số trường hợp gần đây hoặc danh sách các ngày chuyển đổi trong năm.

Mình nêu phương án như vậy bạn tham khảo.
 
Ý bạn là thế nào?
1) Tính số ngày giữa cột "Bắt đầu" và "Kết thúc"??? Đúng --> =Cột "Kết thúc" - cột "Bắt đầu"
2) Công thức để ra ngày ở cột "Bắt đầu" và "Kết thúc" ??? Ví dụ ra kết quả 04/01/2015 và 30/01/2015 vân vân và vân vân
3) "trừ thứ bảy, chủ nhật, ngày lễ tết" nghĩa là như thế nào? Có phải là trừ những ngày thứ bảy, chủ nhật, ngày lễ tết trong khoảng 04/01/2015 và 30/01/2015?

Hi, ý của em là ý thứ hai của bác ạ.
Trừ thứ bảy, chủ nhật, ngày lễ tết là những ngày nghỉ không đi làm ạ, chỉ hiển thị ngày đầu tháng và cuối tháng thôi. Nếu đầu tháng trùng vào ngày nghỉ thì tiến lên ngày sau, nếu cuối tháng trùng vào ngày nghỉ thì sẽ lùi lại ngày trước đó.
Ví dụ:
- Vào tháng 4 năm 2015, ngày bắt đầu là ngày 1/4 ngày kết thúc là ngày 30/4, nhưng 30/4 là ngày lễ được nghỉ nên ngày kết thúc lùi lại thành ngày 29/4
- Vào tháng 5 năm 2015, ngày bắt đầu là ngày 1/5 ngày kết thúc là ngày 31/5, nhưng 1/5 là ngày lễ được nghỉ, 2/5 và 3/5 là ngày thứ bảy và chủ nhật được nghỉ nên ngày bắt đầu là ngày 4/5, tương tự ngày kết thúc lùi lại thành ngày 29/4 vì 30/5 và 31/5 vào thứ bảy chủ nhật.
 
Lần chỉnh sửa cuối:
Về lập công thức thì mình có lẽ còn thua cả bạn nữa ấy chứ!

Bác có thể giúp em chỉ dùng công thức sẵn có cùa Excel thôi được không ạ, em muốn tính cả những năm sau nữa?

Nhưng hàm tự tạo của mình viết cũng có thể xài cho các năm khác mà;
Chỉ có điều lúc ấy:

(1) Cần cập nhật ngày nghĩ lễ trong năm đó trong bảng ở góc trái trang tính, nhất là các ngày nghĩ lễ âm lịch

(2) Cung cấp tham biến thứ 2 chỉ ra năm bạn cần; Hiện tại nó đang là tùy chọn cho 2015 (Không cần cung cấp).
 
Để có đáp án cho bài này bạn cần phải có danh sách các ngày nghỉ trong năm:

1/Nghỉ lễ:
-Tết Dương lịch : Nghỉ ngày 01/01 hàng năm (1 ngày).
-Tết Âm lịch: Nghỉ ngày Âm lịch cuối năm trước và 4 ngày đầu năm Âm lịch ( 5 ngày)
-Ngày giỗ tổ Hùng Vương 10/3 Âm lịch (1 ngày)
-Ngày 30/4 (1 ngày)
-Ngày 01/5 (1 ngày)
-Ngày 2/9 (1 ngày)

2/Nghỉ hàng tuần: Tùy theo quy định của đơn vị, nghỉ thứ 7 và Chủ Nhật hay chỉ nghỉ Chủ nhật

* Trong các ngày nghỉ theo quy định không thống nhất là Âm lịch và Dương lịch nên ta cần có hàm chuyển đổi về Dương lịch (Tham khảo Hồ Ngọc Đức).
* Do số ngày nghỉ dài nhất không quá 7 ngày (30 Tết AL vào thứ 2 chẳng hạn) Vậy là chỉ cần kiểm tra 8 ngày đầu tháng và cuối tháng không dính danh sách trên là OK làm việc.
*Để thuận tiện ta nên dùng VBA.
*Để tùy biến: Ta nên lập hẳn Danh sách các ngày nghỉ vì để phòng trường hợp Chính phủ cho phép làm bù, đổi ngày để dồn ngày nghỉ như 1 số trường hợp gần đây hoặc danh sách các ngày chuyển đổi trong năm.

Mình nêu phương án như vậy bạn tham khảo.

hi, cảm ơn bác!
Em muốn dùng công thức để sau này nếu có thay hoặc sửa nội dung file thì không phải sửa VBA. (cái này thì em mù tịt)+-+-+-+
 
Thì bạn xài tạm hàm của mình đi, trong khi chờ các "Đại Công thức" giúp bạn!

Tất nhiên, như "Đất cảng" đã nêu, hàng năm bạn fải cập nhật bảng liệt kê những ngày nghĩ lễ & cung cấp cho hàm mảng tham biến thứ 2 chỉ ra số năm bạn cần!

PHP:
Option Explicit
Function NLV(Tháng As Byte, Optional Nam As Integer = 2015)
 Dim J As Integer, Dat As Date
 
 ReDim Ngay(1 To 1, 1 To 2)
 For J = 1 To 7
    Dat = DateSerial(Nam, Tháng, 0 + J)
    If NgayLe(Dat) Or Weekday(Dat) = 1 Or Weekday(Dat) = 7 Then
    Else
        Ngay(1, 1) = Dat:           Exit For
    End If
 Next J
 For J = 1 To 7
    Dat = DateSerial(Nam, 1 + Tháng, 1) - J
    If Weekday(Dat) <> 1 And Weekday(Dat) <> 7 And NgayLe(Dat) = False Then
        Ngay(1, 2) = Dat:           Exit For
    End If
 Next J
 NLV = Ngay()
End Function
Mã:
Function NgayLe(Dat As Date) As Boolean
 Dim Cls As Range
 For Each Cls In Range("NLe")
    If Dat = Cls.Value Then
        NgayLe = True
    End If
 Next Cls
End Function
 
Lần chỉnh sửa cuối:
Thì bạn xài tạm hàm của mình đi, trong khi chờ các "Đại Công thức" giúp bạn!

Tất nhiên, như "Đất cảng" đã nêu, hàng năm bạn fải cập nhật bảng liệt kê những ngày nghĩ lễ & cung cấp cho hàm mảng tham biến thứ 2 chỉ ra số năm bạn cần!

PHP:
Option Explicit
Function NLV(Tháng As Byte, Optional Nam As Integer = 2015)
 Dim J As Integer, Dat As Date
 
 ReDim Ngay(1 To 1, 1 To 2)
 For J = 1 To 7
    Dat = DateSerial(Nam, Tháng, 0 + J)
    If NgayLe(Dat) Or Weekday(Dat) = 1 Or Weekday(Dat) = 7 Then
    Else
        Ngay(1, 1) = Dat:           Exit For
    End If
 Next J
 For J = 1 To 7
    Dat = DateSerial(Nam, 1 + Tháng, 1) - J
    If Weekday(Dat) <> 1 And Weekday(Dat) <> 7 And NgayLe(Dat) = False Then
        Ngay(1, 2) = Dat:           Exit For
    End If
 Next J
 NLV = Ngay()
End Function
Mã:
Function NgayLe(Dat As Date) As Boolean
 Dim Cls As Range
 For Each Cls In Range("NLe")
    If Dat = Cls.Value Then
        NgayLe = True
    End If
 Next Cls
End Function

file của em đây ạ, bác làm ơn sửa giúp em được không ạ.
Sorry các bác vì sự bất tiện này! Các bác đừng "chém" em nhé!
 

File đính kèm

Đây là cách tính dùng công thức, mình dùng thêm bảng phụ cho đỡ phức tạp
 

File đính kèm

hì hì, đúng là toàn cao thủ, em cảm ơn các bác rất nhìu ạ!
 

Bài viết mới nhất

Back
Top Bottom