visual programming for examples easy codes code best excel function vba excel-vba code-snippets

programming - vba excel pdf



¿Cómo encuentras Leapyear en VBA? (9)

Si la eficiencia es una consideración y el año esperado es aleatorio, entonces podría ser un poco mejor hacer el caso más frecuente primero:

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

¿Cuál es una buena implementación de una función IsLeapYear en VBA?

Editar: ejecuté la implementación si-entonces y DateSerial con iteraciones envueltas en un temporizador, y el DateSerial fue más rápido en promedio en 1-2 ms (5 ejecuciones de 300 iteraciones, con una fórmula de celda de celda promedio también funcionando).


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 para más ... http://en.wikipedia.org/wiki/Leap_year


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

Originalmente obtuve esta función del excelente sitio de Excel de Chip Pearson.

El sitio de Pearson


Como una variación de la solución Chip Pearson, también puedes probar

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


Encontré este divertido en CodeToad :

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

Aunque estoy bastante seguro de que el uso de IsDate en una función es probablemente más lento que un par de if, elseifs.


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


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


Aquí hay otra opción simple.

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

Si Leap_Day_Check = 28 entonces no es un año bisiesto, si es 29 lo es.

VBA sabe lo que es la fecha anterior al 1 de marzo en un año, por lo que será para nosotros el 28 o el 29 de febrero.


Veo muchos conceptos geniales que indican una mayor comprensión y uso de las funciones de fecha que son excelentes para aprender de ... En términos de eficiencia del código ... considere el código de máquina necesario para que una función se ejecute

en lugar de las funciones de fecha complejas usan solo funciones enteras bastante rápidas. BASIC se construyó en GOTO. Sospecho que algo como "below" es más rápido

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