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




















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
Số ngày lẻ = ngày cuối - ngày đầu - songaychan +1Function 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
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
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
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
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 (%).



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à!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







Son2006 đã viết:Có thể dủng công thức tổng quát như sau:
2 thời điểm cho trước là A1 và B1 (B1>A1)
Gọi Sn là số năm của 2 mốc thời gian, tính bằng công thức Sn=year(B1)-year(A1)
Gọi Sa1 là số ngày chẵn từ đầu năm year(A1) đến ngày A1
công thức IF(MONTH(A1)>2,15*(MONTH(A1)-1)-1+INT((DAY(A1))/2),15*(MONTH(A1)-1)+INT((DAY(A1))/2))
Gọi Sb1 là số ngày chẵn từ đầu năm year(B1) đến ngày B1
Công thức
IF(MONTH(B1)>2,15*(MONTH(B1)-1)-1+INT((DAY(B1))/2),15*(MONTH(B1)-1)+INT((DAY(B1))/2))
Ta có số ngày chẵn trong [A1,B1] là
Sn*179-Sa1+Sa2
Tức là
(YEAR(B1)-YEAR(A1))*179-IF(MONTH(A1)>2,15*(MONTH(A1)-1)-1+INT((DAY(A1))/2),15*(MONTH(A1)-1)+INT((DAY(A1))/2))+IF(MONTH(B1)>2,15*(MONTH(B1)-1)-1+INT((DAY(B1))/2),15*(MONTH(B1)-1)+INT((DAY(B1))/2))
Công thức hơi dài nhưng do trong phương pháp tính có tính lặp lại Sa1 và Sb1 nên cũng không phức` tạp lắm
Tính được số ngày chẵn rồi, số ngày lẻ no problem
Tôi chưa kiểm tra kỹ lắm. bạn nào có thời gian test lại hộ




Lệch do toán trồng cây đây mà. Vậy nên công thức tính ngày Sa1 cần tinh71 như số ngày chẵn từ đầu năm đến trứoc ngày A1:IF(MONTH(A1)>2,15*(MONTH(A1)-1)-1+INT((DAY(A1)-1)/2),15*(MONTH(A1)-1)+INT((DAY(A1)-1)/2))Mr Okebab đã viết:Có một chút lệch nào đó, bác sửa lại một xíu nhé.
Bác xem File sẽ thấy.
Thân!




anhtuan1066 đã viết:Tôi còn phát hiện ra những trò khác hay hơn từ công thức này:
-Có thể áp dụng công thức cho dử liệu nào có dạng là 1 chuổi sự kiện liên tục
-Từ đây có thể "đếm" bất cứ thứ gì tương tự như thế bằng cách tạo 1 "mãng giã lập"
-Sửa công thức đôi chút lại có 1 công thức khác có công dụng khác hơn
VD:
1/-Đếm xem có bao nhiêu ngày "chủ nhật" giữa 2 khoảng thời gian:
{=SUM(IF(WEEKDAY(..... =1,1,0))}
2/-Đếm xem có bao nhiêu ngày "thứ năm" giữa 2 khoảng thời gian:
{=SUM(IF(WEEKDAY(..... =5,1,0))}
3/-Đếm xem có bao nhiêu ngày 31 giữa 2 khoảng thời gian:
{=SUM(IF(DAY(..... =31,1,0))}
....
vân vân... và từa lưa hột dưa.. thứ gì ta có thể nghĩ ra...
Cám ơn bạn trandangkhoi đã đưa ra 1 chủ đề thú vị
ANH TUẤN

các bác ơi em hỏi ngu tí bên e được nghỉ thứ 7 và cn thế nếu em muốn tính xem một tháng có bao nhiêu ngày ( em tính công đi làm mà ) thì e dùng hàm nào ! vì e đếm lịch thì có tháng là 22 ngày tháng 18 ngày tháng lại 23 ngày