Hỏi về cách tính số ngày chẵn và lẻ trong 1 tháng bất kỳ (4 người xem)

Liên hệ QC

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

trandangkhoi

Thành viên hoạt động
Tham gia
26/3/07
Bài viết
175
Được thích
165
Các bác ơi , có một công thức nào có thể tính số ngày chẵn lẻ của một tháng bất kỳ mà không phải dùng VBA không
 
Mình cũng chưa hiểu hết ý câu hỏi của bạn:

Giả sử ô A1: chứa ngày 13/08/2008

- Ngày này nếu là ngày chẵn thì hàm trả về chuỗi Ngày chẵn ngược lại thì trả về ngày lẽ: Công thức tại ô B1:
=IF(MOD(DAY(A1),2)=0,"Ngày chẵn","Ngày lẽ")

- Nếu bạn muốn biết tổng số ngày trong tháng nào đó và trả về tháng có tổng số ngày chãn hay lẻ thì dùng: Tại ô C1 nhập vào công thức
=IF(MOD(DAY(EOMONTH(A1,0)),2)=0,"Số ngày trong tháng chẵn","Số ngày trong tháng lẻ")

*Hàm EOMONTH trả về ngày cuối của một tháng trước hay sau ngày làm mốc tính (nhớ Add-Ins | Analysis Tools Pak trước khi sử dụng hàm này)

Xem thêm bài này trong nhóm hàm Ngày và thời gian: http://www.giaiphapexcel.com/forum/showthread.php?p=19238#post19238

TP.
 

File đính kèm

Ý của mình là mình có 2 mốc thời gian bất kỳ nào đó( tương ứng với 2 ô trên excel), mình muốn xem trong đó có bao nhiêu ngày chẵn hoặc bao nhiêu ngày lẻ, ( ngày chẵn , ngày lẻ là ngày2 , ngày 1 ý chứ ko phải là thứ 2 , thứ 4 đâu )
 
Ặc các bác giúp giùm em một công thức tổng quát với , em nghĩ mãi không ra được, em dốt các hàm về thời gian này quá
 
A1=Ngày đầu, B1=Ngày cuối (trong cùng tháng)
Số ngày chẵn=
Mã:
IF(MOD(B1-A1+1;2)=0;(B1-A1+1)/2;IF(MOD(DAY(A1);2)=0;INT((B1-A1+1)/2)+1;INT((B1-A1+1)/2)))
 
Nếu là trong cùng 1 tháng thì đâu cần công thức dài như thế nhỉ?
Ngày lẽ: =INT((B1-A1-MOD(B1,2)+2)/2)
Ngày chẳn= tổng số ngày - ngày lẻ

ANH TUẤN
 
các bạn , trong 1 tháng thì mình cũng tính được mình hỏi hai khoảng thời gian bất kỳ. Mình thấy có hàm Days360 tính số ngày giưa hai khoảng thời gian trong 1 năm .Nhưng mà còn có các tháng có 30, 31 hoặc 29 ngày thì sao. Theo mình là không dùng công thức thông thường được. Có đúng không.
 
Có thể làm như sau:
1. Biết rằng số ngày chẵn trong mỗi tháng đều bằng 15 ngày (Trừ tháng 2 có 14 ngày)
2. Tính số ngày chẵn còn lại trong tháng tương ứng ô A1
3. Tính số ngày chẵn từ đầu tháng đến ngày B1
4. Cộng theo điều kiện tương ứng với tháng (Có tháng 2 hay không)
Nếu khoảng thời gian từ năm này sang năm khác thì hơi phức tạp 1 chút, nhưng chỉ cần kiểm tra số năm là ra
 
Sao không làm như anhtuan1066 mà phức tạp làm gì vậy các bạn :
Ngày đầu : A1
Ngày cuối : B1

---> Số ngày chẵn : =INT((B1-A1-MOD(B1,2)+2)/2)
--->Số ngày lẻ : = B1-A1+1 - INT((B1-A1-MOD(B1,2)+2)/2)

hm hm!!
 
Mai quá... có người có ý kiến rồi... tôi thấy Topic này khá hay, vậy mà chẳng ai tham gia nên tôi cũng làm biếng (chẳng lẽ tự nói 1 mình)... Ngay từ khi post bài lên tôi đã biết công thức có sai sót, đúng ra phải là: =INT((B1-A1-MOD(DAY(B1),2)+3)/2) (công thức 1)... nhưng công thức này cũng chỉ dùng dc trong tháng... còn khác tháng, khác năm thì sao?
Công thức trên tôi rút ra từ công thức tính số ngày Chủ nhật giữa 2 khoảng thời gian : =INT((B1-A1-WEEKDAY(B1)+8)/7) (công thức 2)... Hai công thức này có điểm tương đồng...nhưng có điều gì khác làm cho công thức 1 cho kết quả sai? Chỉ có 1 điểm duy nhất đó là hàm WEEKDAY cho kết quả tuần hoàn từ 1 đến 7,(sau thứ 2 phải là thứ 3.. sau thứ 7 phải là CN).. trong khi hàm MOD trong trường hợp này thì chưa chắc... sau ngày chẳn sẽ là ngày lẽ và ngược lại... nhưng đến ngày 31 thì... sau ngày lẽ 31 lại đến ngày 1 là ngày lẽ nữa...
Tất cả chúng ta đều có thể suy luận... Cũng giống như cách bạn Son2006 đã suy luận. Nhưng ở đây mọi người muốn có 1 công thức tổng quát cơ... công thức này phải luôn luôn đúng trong mọi trường hợp dù 2 móc thời gian là cùng tháng hay khác tháng, cùng năm hay khác năm
Mong các bạn đóng góp ý kiến.. Tôi cũng đang suy nghĩ nhưng chưa có tiến triển gì cả...
Mến
ANH TUẤN
 
Vậy tốt nhất là dùng VBA

Tính ngày T7, CH . . . thì dễ hơn bởi vòng tuần hoàn là 7 ngày.

Còn đây lại tùy tháng, tùy năm (nhuận) nữa.

Vì vậy cứ dùng VBA cho tiện (làm 1 hàm người dùng thôi mà)
 
Có lẽ việc tính ngày chẵn, lẻ trong một khoảng thời gian khác tháng, khác năm mà dùng các hàm của Excel để giải quyết thì cũng phức tạp đấy.
Người hỏi y/c là không dùng VBA, nhưng tôi đóng góp đoạn code VBA cho những ai cần...
Vào VBA, Insert Module, rồi thêm đoạn code sau:
Mã:
Option Explicit
Public Function NgayChanLe(date1 As Date, date2 As Date, chanle)
Dim i, songaychan, songayle, so_thang
Dim dem1, dem2
'Tinh so thang
If Year(date1) = Year(date2) Then
    so_thang = Month(date2) - Month(date1) + 1
Else
    so_thang = (12 - Month(date1) + 1) + Month(date2) + (Year(date2) - Year(date1) - 1) * 12
End If
'Tinh so ngay chan, le
For i = 1 To so_thang - 2
    songaychan = songaychan + Int(Day(DateSerial(Year(date1), Month(date1) + i + 1, 0)) / 2)
    songayle = songayle + Day(DateSerial(Year(date1), Month(date1) + i + 1, 0)) - _
Int(Day(DateSerial(Year(date1), Month(date1) + i + 1, 0)) / 2)
Next i
'Tinh so ngay chan le cua thang dau tien
For i = Day(date1) To Day(DateSerial(Year(date1), Month(date1) + 1, 0))
    If (i / 2 - Int(i / 2)) = 0 Then
        dem1 = dem1 + 1
    Else
        dem2 = dem2 + 1
    End If
Next i
'Tinh so ngay chan le cua thang cuoi cung
For i = 1 To Day(date2)
    If (i / 2 - Int(i / 2)) = 0 Then
        dem1 = dem1 + 1
    Else
        dem2 = dem2 + 1
    End If
Next i
songaychan = songaychan + dem1
songayle = songayle + dem2
If chanle = 1 Then
    NgayChanLe = songayle
Else
    NgayChanLe = songaychan
End If
End Function
 
Mình xin đóng góp code này.
Function songaychan(NgayCuoi As Date, NgayDau As Date) As Integer
Dim i As Integer
Dim ThoiGian As Integer
'lay hieu so ngaycuoi-ngaydau
If NgayCuoi < NgayDau Then
MsgBox ("Ban nhap sai-nhap lai songay(ngaycuoi,ngaydau)")
Exit Function
End If
ThoiGian = NgayCuoi - NgayDau
For i = 0 To ThoiGian
If Day(NgayDau + i) Mod 2 = 0 Then
songaychan = songaychan + 1
End If
Next i
End Function
Số ngày lẻ = ngày cuối - ngày đầu - songaychan +1
 
Lần chỉnh sửa cuối:
Mình cũng xin góp vui 1 hàm vậy:

Mã:
Function SoNgay(NgayDau As Date, NgayCuoi As Date, Loai As String) As Integer
    Dim i As Long
    Dim Ngay As Integer
    If NgayCuoi - NgayDau < 0 Then
        SoNgay = 0
    Else
        For i = NgayDau To NgayCuoi
            If Day(i) Mod 2 = 0 Then Ngay = Ngay + 1
        Next i
        If Loai = "Chan" Then
            SoNgay = Ngay
        ElseIf Loai = "Le" Then
            SoNgay = NgayCuoi - NgayDau + 1 - Ngay
        End If
    End If
End Function
Tham khảo File bên dưới.
 

File đính kèm

anhtuan1066 đã viết:
Ai cha cha... Xom tụ rồi đây! Toàn là các cao thủ... Các bạn ơi! Chẳng lẻ ko còn cách nào làm bằng công thức? Vì nếu chỉ đơn giản là tính số ngày chẳn lẻ mà dùng VBA thì có phí lắm ko? Nếu bất chợt có ai đó cần tính số ngày chẳn lẽ giữa 2 móc thời gian thì.. chỉ vài phép tính đơn giản tôi nhẩm cũng ra (bằng cách suy luận mỗi tháng luôn luôn có 15 ngày chẳn, trừ tháng 2)...
Chẳng lẻ bó tay nhỉ? Search trên Google hình như cũng ko có... Chắc tụi nước ngoài nó ko có khái niệm ngày chẳn lẻ? Ở VN có biển báo cấm xe lưu thông vào ngày chẳn hoặc ngày lẻ nên có khái niệm này chăng? Hi... hi...
ANH TUẤN

Nếu chỉ có thế thôi thì chưa đủ đâu.
Bác suy luận :
-Tìm số ngày chẵn
-Số ngày lẻ = Hiệu Số ngày - số ngày chẵn

Vấn đề là tìm ngày chẵn.

Và ta biết rằng 1 tháng thì luôn có 15 ngày chẵn, như vậy chỉ cần tính ra số tháng và nhân với 15.
Tuy nhiên nếu ngày bắt đầu và ngày kết thúc không phải là đầu hoặc cuối tháng
VD : Bắt đầu : 16/1/07; Kết thúc : 13/8/2008

Vậy thì lại bắt đầu tính:
- Trong tháng 1/2007
- Trong tháng 8/2007
- Từ tháng 2/2007 đến tháng 7/2008
(Và phải tính đến TH là cả ha ngày đều cùng tháng)
Không biết có làm được không, chứ theo mình hơi bị rắc rối đấy.

Tuy nhiên tính cho một mảng thì lại cực dễ :
VD : Có mảng ngày tên : NGAY
-->Số ngày chẵn : {=SUM(IF(MOD(DAY(NGAY);2)=0;1;0))}
-->Số ngày lẻ : {=SUM(IF(MOD(DAY(NGAY);2)=1;1;0))}

Thân!
 
ThuNghi đã viết:
Mình xin đóng góp code này.

Mã:
Function songaychan(NgayCuoi As Date, NgayDau As Date) As Integer
Dim i As[SIZE=3][COLOR=Red][B] Integer[/B][/COLOR][/SIZE]
Dim ThoiGian As Integer
'lay hieu so ngaycuoi-ngaydau
If NgayCuoi < NgayDau Then
    MsgBox ("Ban nhap sai-nhap lai songay(ngaycuoi,ngaydau)")
    Exit Function
End If
    ThoiGian = NgayCuoi - NgayDau + 1
For i = 0 To ThoiGian
    If Day(NgayDau + i) Mod 2 = 0 Then
    songaychan = songaychan + 1
    End If
Next i
End Function

Số ngày lẻ = ngày cuối - ngày đầu - songaychan +1

Dear bác ThuNghi : bác đọc kỹ nhé :

Integer Data Type@import url(office.css);Integer variables are stored as 16-bit (2-byte) numbers ranging in value from -32,768 to 32,767. The type-declaration character for Integer is the percent sign (%).

32.767 = 16/09/1989

Vì vậy bác nên cho nó là Long hoặc Date

Thân!
 
Em có ý kiến thế này. Đếm các tháng giữa 2 khoảng thời gian(dựa vào ý kiến của bạn Anh Tuấn . Tại vì trong 1 năm các tháng có 28, 30 và 31 ngày đều cố định rồi . Sau có dùng lệnh IF để đặt điều kiện lên các tháng .Tất cả các tháng đều có 15 ngày chẵn ( trừ tháng 2) . còn số ngày lẻ thì lấy số ngày chẵn trừ đi. Nhưng mà tháng 2 còn có năm nhuận nữa chứ, không biết phải giải quyết thế nào
 
trandangkhoi đã viết:
Em có ý kiến thế này. Đếm các tháng giữa 2 khoảng thời gian(dựa vào ý kiến của bạn Anh Tuấn . Tại vì trong 1 năm các tháng có 28, 30 và 31 ngày đều cố định rồi . Sau có dùng lệnh IF để đặt điều kiện lên các tháng .Tất cả các tháng đều có 15 ngày chẵn ( trừ tháng 2) . còn số ngày lẻ thì lấy số ngày chẵn trừ đi. Nhưng mà tháng 2 còn có năm nhuận nữa chứ, không biết phải giải quyết thế nào
Năm nhuận thì có ảnh hưởng gì cơ chứ ?? Khi năm nhuận : T2 có 29 ngày, như vậy vẫn có 14 ngày chẵn cơ mà!
Thân!
 
Lần chỉnh sửa cuối:
Cái này thì dùng VBA là hay nhất, mình nếu ra ý tưởng là không dùng VBA cho mọi người suy nghĩ xem còn cách nào khác hay ko, hay là ai đó có ý tưởng độc đáo nào đó( tại vì mình cũng mù tịt về VBA mà, chỉ ứng dụng các đoạn code của mọi người thôi). Chứ mà nếu có ứng dụng thì dùng VBA là hay nhất
 
Vậy thì chưa chắc... tôi đang có 1 ý tưởng:
1/- Công thức sẽ sai khi ngày từ 31 bước qua ngày 1 (vì ngày 31 là ngày lẻ, ngày 1 cũng lẻ, ko tuần hoàn)
2/- Ngày chẳn, ngày lẽ ko biến đổi tuần hoàn như hàm WEEKDAY
Vậy thì giã sử rằng ta loại hết ra tất cả những ngày 31 và ngày 29/2 (nếu có) ta sẽ dc 1 chuổi ngày luôn luôn biến đổi tuần hoàn... từ chẳn đến lẻ.. rồi từ lẻ đến chẳn... Thế là có thể áp dụng công thức 1 cách bình thường rồi... Ra kết quả xong... Số ngày lẻ sẻ dc cộng thêm mấy ngày mà ta vừa loại ra (mấy ngày mình loại ra luôn luôn là ngày lẻ)...
các bạn thử phát triển thêm ý tưởng xem...
ANH TUẤN
 
Web KT

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

Back
Top Bottom