Creating Custom Function - A Little Help Please!

G

Guest

Have been trying to write my first custom function, to determine if a year is
a leap year, using the following formula provided by Microsoft:

=IF(OR(MOD(A1,400)=0,AND(MOD(A1,4)=0,MOD(A1,100)<>0)),"Leap Year", "NOT a
Leap Year")

In my worksheet, for example, I plan to put the following formula in cell
B1: =if(LeapYear(A1) = "leap",c209/t13,b23*U14). I cannot get the custom
function (below) to work properly; it either comes back with an error,
returns 0, or the wrong answer. So far, I've got:

Public Function LeapYear(MyRange As Range) As Integer
Dim ActiveCell As Range
On Error GoTo LeapYearErr
Application.Volatile
LeapYear =
"=IF(OR(MOD(A1,400)=0,AND(MOD(A1,4)=0,MOD(A1,100)<>0)),""leap"",""not"")"
LeapYearErr:
Exit Function
End Function

Can someone advise what I'm doing wrong here?
 
G

Guest

Here is a function that should work for you. It returns a True or False

Public Function LeapYear(Cell As Range) As Boolean
If Cell.Value Mod 400 = 0 Or (Cell.Value Mod 4 = 0 And Cell.Value Mod
100 <> 0) Then
LeapYear = True
Else
LeapYear = False
End If
End Function

So in B1 you could use
=if(LeapYear(A1) ,c209/t13,b23*U14)
 
G

Guest

Public Function LeapYear(yr as Long) as Boolean
LeapYear = (month(date(yr,2,29)) = 2)
End Sub
 
R

Randy Harmelink

Tom said:
Public Function LeapYear(yr as Long) as Boolean
LeapYear = (month(date(yr,2,29)) = 2)
End Sub

I was going to offer something similar (subtract 1 from 3/1 of the year
to see if the day is 28 or 29). However, basing the leap year decision
on whether the year has a 2/29 date appears to incorrectly identify
1900 as a leap year? EXCEL's date function claims there is a date of
2/29/1900.

Plus, it only works back to 1900. Which may or may not be a problem,
depending on how it is being used.
 
G

Guest

What you say about Excel is true. But I am not using Excel. I am using
VBA, so it does not have these limitations.
 
N

NickHK

The 1900 error was deliberately included for compatibility with Lotus's
previous error.
Excel's worksheet will only work back to 1900, but VBA Dates are valid back
the year 100.
However, given the number of changes to the calendars since then, I would
not put much faith in reality v. calculation before the 1800s.

NickHK
 
N

Niek Otten

<not put much faith in reality v. calculation before the 1800s.>

The meaning of the date also depends on its location. In Russia, for example, the Gregorian calendar was adopted as late as 1917,
and there are many other examples of other calendars being used in rather recent centuries.

--
Kind regards,

Niek Otten
Microsoft MVP - Excel

| The 1900 error was deliberately included for compatibility with Lotus's
| previous error.
| Excel's worksheet will only work back to 1900, but VBA Dates are valid back
| the year 100.
| However, given the number of changes to the calendars since then, I would
| not put much faith in reality v. calculation before the 1800s.
|
| NickHK
|
| | > Tom Ogilvy wrote:
| > > Public Function LeapYear(yr as Long) as Boolean
| > > LeapYear = (month(date(yr,2,29)) = 2)
| > > End Sub
| >
| > I was going to offer something similar (subtract 1 from 3/1 of the year
| > to see if the day is 28 or 29). However, basing the leap year decision
| > on whether the year has a 2/29 date appears to incorrectly identify
| > 1900 as a leap year? EXCEL's date function claims there is a date of
| > 2/29/1900.
| >
| > Plus, it only works back to 1900. Which may or may not be a problem,
| > depending on how it is being used.
| >
|
|
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top