باب تعجب می کند که آیا راه آسانی برای تعیین اینکه آیا سال یک تاریخ خاص یک سال کبیسه است یا نه، برای اهداف محاسبه بهره و تعداد روزهای مرکب وجود دارد.
همه ما می دانیم که اگر یک سال بر 4 بخش پذیر باشد، یک سال کبیسه است، درست است؟ خوب، در واقع، این اشتباه است. بنابراین، نمی توانید به سادگی یک عدد سال را بر 4 تقسیم کنید، مانند شکل زیر، برای تعیین اینکه آیا سال کبیسه است یا خیر:
=IF(MOD(YEAR(A1), 4) = 0, "Leap", "Regular")
این فرمول برای تمام تاریخهای این قرن (سالهای 2000 تا 2099) کار میکند، اما خارج از این محدوده بهطور قابل اعتمادی کار نمیکند. دلیل آن این است که "قابل تقسیم بر 4" تنها آزمون برای یک سال کبیسه نیست. اگر سال یک قرن سال باشد (قابل تقسیم بر 100)، آنگاه کبیسه است فقط اگر بر 400 بخش پذیر باشد. بنابراین سال 2000 یک سال کبیسه است، اما سال 2100 نیست.
اگر می خواهید روشی ضد گلوله برای تعیین اینکه آیا تاریخ در یک سال کبیسه رخ می دهد یا نه، پس فرمول شما باید پیچیده تر باشد:
=IF(OR(AND(MOD(YEAR(A1),4)=0,MOD(YEAR(A1),100)>0),
MOD(YEAR(A1),400)=0),"Leap","Regular")
توجه داشته باشید که این یک فرمول واحد است. در اینجا در دو خط نشان داده شده است تا کاملاً بر روی صفحه نمایش قرار گیرد. این فرمول هر سه شرط لازم را برای تعیین اینکه آیا یک تاریخ در یک سال کبیسه قرار می گیرد، آزمایش می کند.
البته، یک رویکرد متفاوت این است که به سادگی بفهمیم که آیا یک سال معین دارای 29 فوریه است یا خیر. از هر تعداد فرمول می توان برای انجام این کار استفاده کرد:
=IF(DAY(EOMONTH("1Jan"&YEAR(A1),1))=29, "Leap", "Regular")
=IF(MONTH(DATE(YEAR(A1),2,29))=2, "Leap", "Regular")
=IF(DAY(DATE(YEAR(A1),2,29))=29, "Leap", "Regular")
=IF(DAY(DATE(YEAR(A1),3,0))=29, "Leap", "Regular")
هر یک از روش هایی که تاکنون توضیح داده شده است، برای هر تاریخی که توسط اکسل پشتیبانی می شود، به خوبی کار می کند، به استثنای یک استثنا. اگر تاریخ سلول A1 در سال 1900 باشد، آنهایی که از تابع DATE استفاده می کنند (سه مورد آخر که در بالا نشان داده شده است) کار نمی کنند. (به اندازه کافی جالب توجه است که تابع EOMONTH همان مشکلی را که تابع DATE در این زمینه نشان می دهد را نشان نمی دهد.)
اگر باید با تاریخ هایی که قبل از تاریخ هایی که توسط اکسل پشتیبانی می شود (قبل از 1 ژانویه 1900) کار کنید، به جای اینکه سال را از تاریخ اکسل خارج کنید، باید مستقیماً با سال ها کار کنید. اگر سلول A1 فقط یک سال داشته باشد، تغییر فرمول سه آزمایشی به خوبی کار خواهد کرد:
=IF(OR(AND(MOD(A1,4)=0,MOD(A1,100)>0),MOD(A1,400)=0),"Leap","Regular")
همچنین می توانید یک تابع تعریف شده توسط کاربر ایجاد کنید که تاریخ را آزمایش کند. این رویکرد بدون در نظر گرفتن اینکه سلول حاوی مقدار تاریخ باشد یا مقدار متنی برای تاریخ، به خوبی کار خواهد کرد. (اگر یک مقدار تاریخ پشتیبانی نشده را در یک سلول وارد کنید - مانند 1/1/1896 - اکسل به جای اینکه سعی کند آن را به عنوان یک تاریخ تجزیه کند، ورودی را به عنوان یک مقدار متنی در نظر می گیرد.) مثال زیر با تمام تاریخ های پشتیبانی شده به درستی کار می کند. VBA که در محدوده سال 100 تا 9999 قرار دارد:
Function IsLeap1(c As Range) As Boolean
YearNo = Year(c.Value)
If YearNo Mod 100 = 0 Then
IsLeap1 = ((YearNo 100) Mod 4 = 0)
Else
IsLeap1 = (YearNo Mod 4 = 0)
End If
End Function
برای استفاده از تابع در کاربرگ خود فرمولی مانند زیر را وارد کنید:
=IF(IsLeap1(A1),"Leap", "Regular")
ماکرو تک خطی زیر با استفاده از ترفند تشخیص اینکه آیا 29 فوریه در سال مورد نظر وجود دارد یا خیر کار می کند:
Function IsLeap2(c As Range)
IsLeap2 = IsDate("2/29/" & Year(c.Value))
End Function
ماکرو به همان شکلی که ماکرو قبلی در کاربرگ شما ارجاع داده می شود:
=IF(IsLeap2(A1),"Leap", "Regular")
اگر به روشهای خلاقانهتری برای تعیین اینکه آیا تاریخ در سال کبیسه است نیاز دارید، این مقاله را بررسی کنید:
https://chandoo.org/wp/2012/02/29/check-leap-year-using-excel/