2008-09-24 18 views
8

वीबीए में IsLeapYear फ़ंक्शन का अच्छा कार्यान्वयन क्या है?आप वीबीए में लीपियर कैसे ढूंढते हैं?

संपादित करें: मैं भाग गया if-then और एक टाइमर में लिपटे पुनरावृत्तियों साथ DateSerial क्रियान्वयन, और DateSerial 1-2 एमएस (300 पुनरावृत्तियों की 5 रन, 1 औसत सेल कार्यपत्रक के साथ औसतन तेज था फार्मूला भी काम कर रहा है)।

+0

1-2 एमएस कितने एमएस से बाहर है? यानी * सापेक्ष * दक्षता लाभ क्या है? बस उत्सुक! –

+0

@ जीन, अच्छा सवाल, कि कुछ साल पहले था। मैं कोशिश करता हूं और याद रखूंगा कि जब मैं कुछ और परीक्षण करने के लिए अगले हफ्ते काम पर वापस आऊंगा, तो यह विशेष रूप से अच्छा होगा क्योंकि तब से अधिक जवाब आए हैं। –

उत्तर

15
Public Function isLeapYear(Yr As Integer) As Boolean 

    ' returns FALSE if not Leap Year, TRUE if Leap Year 

    isLeapYear = (Month(DateSerial(Yr, 2, 29)) = 2) 

End Function 

मुझे मूल रूप से चिप पियरसन की महान एक्सेल साइट से यह फ़ंक्शन मिला।

Pearson's site

+0

रचनात्मक समाधान! मुझे आश्चर्य है कि यह पोस्ट किए गए अन्य लोगों के खिलाफ कैसे प्रदर्शन करता है। –

+0

प्रदर्शन अब –

+1

पर सूचीबद्ध है जो सभी लीप वर्ष नियमों को ध्यान में रखता है। – StingyJack

11
public function isLeapYear (yr as integer) as boolean 
    isLeapYear = false 
    if (mod(yr,400)) = 0 then isLeapYear = true 
    elseif (mod(yr,100)) = 0 then isLeapYear = false 
    elseif (mod(yr,4)) = 0 then isLeapYear = true 
end function 
अधिक के लिए

विकिपीडिया ... http://en.wikipedia.org/wiki/Leap_year

+0

यह भी अधिक कुशल हो सकता है। मुझे यह पसंद है कि यह विशेष रूप से लीप वर्ष की परिभाषा लेता है और इसे उत्तर में काम करता है। – nathaniel

+0

मुझे एक औरफ का उपयोग करना चाहिए था। इसे और अधिक स्पष्ट बनाने के लिए। वास्तव में, मैं यह करूँगा ... – seanyboy

+0

परिवर्तनीय isLeap का उपयोग नहीं किया जा रहा है –

5

हैं दक्षता एक विचार है और उम्मीद साल यादृच्छिक है, तो यह थोड़ा बेहतर हो सकता है पहले सबसे लगातार मामले करना है:

public function isLeapYear (yr as integer) as boolean 
    if (mod(yr,4)) <> 0 then isLeapYear = false 
    elseif (mod(yr,400)) = 0 then isLeapYear = true 
    elseif (mod(yr,100)) = 0 then isLeapYear = false 
    else isLeapYear = true 
end function 
+1

पर आना चाहिए यदि दक्षता लक्ष्य है तो आप isLeapYear = false से छुटकारा पा सकते हैं, क्योंकि बूलियन मान गलत पर डिफ़ॉल्ट हैं :) – Oorang

2

मैं CodeToad पर इस अजीब एक पाया:

Public Function IsLeapYear(Year As Varient) As Boolean 
    IsLeapYear = IsDate("29-Feb-" & Year) 
End Function 

हालांकि मुझे पूरा यकीन है कि फ़ंक्शन में IsDate का उपयोग संभवतया कुछ, ififs से धीमा है।

2

चिप पियर्सन समाधान पर एक बदलाव के रूप में, आप भी

Public Function isLeapYear(Yr As Integer) As Boolean 

    ' returns FALSE if not Leap Year, TRUE if Leap Year 

    isLeapYear = (DAY(DateSerial(Yr, 3, 0)) = 29) 

End Function 
+0

क्या आप DAY फ़ंक्शन का उपयोग करने के बजाय हैं माह समारोह? –

+0

ओह - धन्यवाद - हाँ मैंने किया। मेरे कट और पेस्ट में बहुत जल्दबाजी – RonnieDickson

+0

ठीक है, मैंने इसे संपादित किया। –

1
Public Function ISLeapYear(Y As Integer) AS Boolean 
' Uses a 2 or 4 digit year 
'To determine whether a year is a leap year, follow these steps: 
'1 If the year is evenly divisible by 4, go to step 2. Otherwise, go to step 5. 
'2 If the year is evenly divisible by 100, go to step 3. Otherwise, go to step 4. 
'3 If the year is evenly divisible by 400, go to step 4. Otherwise, go to step 5. 
'4 The year is a leap year (it has 366 days). 
'5 The year is not a leap year (it has 365 days). 

If Y Mod 4 = 0 Then ' This is Step 1 either goto step 2 else step 5 
    If Y Mod 100 = 0 Then ' This is Step 2 either goto step 3 else step 4 
     If Y Mod 400 = 0 Then ' This is Step 3 either goto step 4 else step 5 
      ISLeapYear = True ' This is Step 4 from step 3 
       Exit Function 
     Else: ISLeapYear = False ' This is Step 5 from step 3 
       Exit Function 
     End If 
    Else: ISLeapYear = True ' This is Step 4 from Step 2 
      Exit Function 
    End If 
Else: ISLeapYear = False ' This is Step 5 from Step 1 
End If 


End Function 
1
Public Function isLeapYear(Optional intYear As Variant) As Boolean 

    If IsMissing(intYear) Then 
     intYear = Year(Date) 
    End If 

    If intYear Mod 400 = 0 Then 
     isLeapYear = True 
    ElseIf intYear Mod 4 = 0 And intYear Mod 100 <> 0 Then 
     isLeapYear = True 
    End If 

End Function 
0

की कोशिश कर सकते यहाँ एक और सरल विकल्प है।

Leap_Day_Check = Day(DateValue("01/03/" & Required_Year) - 1) 

यदि Leap_Day_Check = 28 तो यह एक लीप वर्ष नहीं है, अगर यह 2 9 है।

वीबीए जानता है कि 1 मार्च से पहले की तारीख एक वर्ष में क्या है और इसलिए यह हमारे लिए 28 या 2 9 फरवरी हो जाएगी।

1

मैं कई महान अवधारणाओं कि संकेत मिलता है अतिरिक्त समझ और तारीख कार्यों कि कोड दक्षता के मामले में से जानने के लिए ... भयानक हैं के उपयोग .. निष्पादित करने के लिए

मशीन एक समारोह के लिए आवश्यक कोड पर विचार करें

जटिल तारीख कार्यों से उपयोग केवल काफी तेजी से पूर्णांक कार्यों बुनियादी गोटो पर बनाया गया था मुझे लगता है कि तेजी से

Function IsYLeapYear(Y%) As Boolean 
    If Y Mod 4 <> 0 Then GoTo NoLY ' get rid of 75% of them 
    If Y Mod 400 <> 0 And Y Mod 100 = 0 Then GoTo NoLY 
    IsYLeapYear = True 

नीचे की तरह कुछ है नहीं:

End Function