2008-09-24 49 views
8

Thực hiện tốt chức năng IsLeapYear trong VBA là gì?Làm thế nào để bạn tìm thấy Leapyear trong VBA?

Chỉnh sửa: Tôi đã chạy if-then và thực hiện DateSerial với lặp lại được bao gói trong bộ hẹn giờ và DateSerial nhanh hơn trung bình 1-2 mili giây (5 lần chạy 300 lần lặp lại, với 1 trang tính ô trung bình công thức cũng hoạt động).

+0

1-2 ms trong số bao nhiêu ms? tức là hiệu quả * tương đối * đạt được như thế nào? Chỉ tò mò thôi! –

+0

@Jean, câu hỏi hay, đó là một vài năm trước. Tôi sẽ cố gắng và nhớ khi tôi trở lại làm việc vào tuần tới để làm một số thử nghiệm nhiều hơn, nó sẽ được đặc biệt tốt kể từ khi có thêm câu trả lời từ đó. –

Trả lời

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 

Tôi ban đầu có chức năng này từ trang web Excel tuyệt vời của Chip Pearson.

Pearson's site

+0

giải pháp sáng tạo! Tôi tự hỏi nó hoạt động như thế nào so với những người khác được đăng. –

+0

hiệu suất hiện được liệt kê trong câu hỏi –

+1

Điều đó không tính đến tất cả các quy tắc năm nhuận. – 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 

Wikipedia để biết thêm ... http://en.wikipedia.org/wiki/Leap_year

+0

cái này thậm chí có thể hiệu quả hơn. tôi thích nó đặc biệt có định nghĩa của năm nhuận và làm việc nó vào câu trả lời. – nathaniel

+0

Tôi nên sử dụng một số khác. Để làm cho nó rõ ràng hơn. Trong thực tế, tôi sẽ làm điều đó ... – seanyboy

+0

biến isLeap không được sử dụng –

5

Nếu hiệu quả là một xem xét và năm dự kiến ​​là ngẫu nhiên, sau đó nó có thể là tốt hơn một chút để làm trường hợp thường gặp nhất đầu tiên:

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

Nếu hiệu quả là mục tiêu bạn có thể loại bỏ isLeapYear = false, như các giá trị boolean mặc định là false :) – Oorang

2

Tôi tìm thấy hình ảnh vui nhộn này trên CodeToad:

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

Mặc dù tôi khá chắc chắn rằng việc sử dụng IsDate trong một hàm có thể chậm hơn so với một vài nếu, elseifs.

2

Là một biến thể của giải pháp Chip Pearson, bạn cũng có thể thử

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

bạn có ý định sử dụng hàm DAY thay vì hàm MONTH? –

+0

Rất tiếc - cảm ơn - vâng tôi đã làm. Quá vội vàng trong phần cắt và dán của tôi – RonnieDickson

+0

ok, tôi đã chỉnh sửa nó. –

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

Đây là một lựa chọn đơn giản.

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

Nếu Leap_Day_Check = 28 thì đó không phải là năm nhuận, nếu đó là 29 năm.

VBA biết ngày nào trước ngày 1 tháng 3 diễn ra trong một năm và vì vậy sẽ đặt ngày 28 hoặc 29 tháng 2 cho chúng tôi.

1

Tôi thấy nhiều khái niệm tuyệt vời mà chỉ thêm sự hiểu biết và sử dụng các chức năng ngày đó là tuyệt vời để học hỏi từ ... Xét về hiệu quả mã .. xem xét các mã máy cần thiết cho một chức năng để thực hiện

chứ không phải là chức năng ngày phức tạp chức năng nguyên chỉ sử dụng khá nhanh BASIC được xây dựng trên GOTO tôi nghi ngờ rằng một cái gì đó giống như dưới đây là nhanh hơn

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 

NoLY:

End Function 
Các vấn đề liên quan