'*******************************************************************************
'* confirma la validez de la fecha pasada como parametro, devolviendola si es
'* valida con formato cadena dd/mm/aa y si procede hh:mm:ss
'* también la devuelve en formato fecha si se pasa el parametro opcional, datFecha
'* la fecha a pasar tiene que tener como minimo un digito para día, otro para mes
'* otro para año y en caso de incluir hora, hora y minutos
'* uso If ValidarFecha(strFecha, datFecha) Then
'* ESH 05/02/03 19:15
'*******************************************************************************
Public Function ValidarFecha(strFecha As String, Optional datFecha) As Boolean
Dim intDia As Integer, _
intMes As Integer, _
intAño As Integer, _
intHora As Integer, _
intMinutos As Integer, _
intSegundos As Integer, _
byt1aBarra As Byte, _
byt2aBarra As Byte, _
bytEspacio As Byte, _
byt1oDosPuntos As Byte, _
byt2oDosPuntos As Byte
ValidarFecha = False
' si la fecha no tiene un minimo de 5 digitos aborto el proceso
If Len(strFecha) < 5 Then strFecha = "": Exit Function
' busco la posición de las barras de fecha
byt1aBarra = InStr(strFecha, "/")
byt2aBarra = InStrRev(strFecha, "/")
' busco la posición de los dos puntos de hora
bytEspacio = InStr(strFecha, " ")
byt1oDosPuntos = InStr(strFecha, ":")
intDia = Val(Left(strFecha, byt1aBarra - 1))
intMes = Val(Mid(strFecha, byt1aBarra + 1, byt2aBarra - byt1aBarra - 1))
If byt1oDosPuntos = 0 Then
intAño = Val(Mid(strFecha, byt2aBarra + 1))
Else
intAño = Val(Mid(strFecha, byt2aBarra + 1, bytEspacio - byt2aBarra - 1))
End If
' si el día o el mes están fuera de rango aborto el proceso
If intDia < 1 Or intDia > 31 Then strFecha = "": Exit Function
If intMes < 1 Or intMes > 12 Then strFecha = "": Exit Function
' si aparecen los dos puntos, es por que hay hora
If byt1oDosPuntos <> 0 Then
byt2oDosPuntos = InStrRev(strFecha, ":")
intHora = Val(Mid(strFecha, bytEspacio + 1, byt1oDosPuntos - bytEspacio - 1))
' según haya o no segundos
If byt2oDosPuntos = byt1oDosPuntos Then
intMinutos = Val(Mid(strFecha, byt1oDosPuntos + 1))
intSegundos = 0
Else
intMinutos = Val(Mid(strFecha, byt1oDosPuntos + 1, byt2oDosPuntos - byt1oDosPuntos - 1))
intSegundos = Val(Mid(strFecha, byt2oDosPuntos + 1))
End If ' byt2oDosPuntos = byt1oDosPuntos
If intHora > 23 Then strFecha = "": Exit Function
If intMinutos > 59 Then strFecha = "": Exit Function
If intSegundos > 59 Then strFecha = "": Exit Function
End If ' byt1oDosPuntos <> 0
' reconstruyo la fecha y la devuelvo en formato cadena d/m/a o d/m/a h:m:s
If byt1oDosPuntos = 0 Then
strFecha = CStr(format(DateSerial(intAño, intMes, intDia), "dd/mm/yy"))
Else
strFecha = CStr(format(DateSerial(intAño, intMes, intDia) & " " & TimeSerial(intHora, _
intMinutos, intSegundos), "dd/mm/yy hh:nn:ss"))
End If ' byt1oDosPuntos = 0
ValidarFecha = True
' la devuelvo en el formato correspondiente
datFecha = CDate(strFecha)
End Function ' ValidarFecha
|
'*******************************************************************************
'* Devuelve el número de días habiles comprendidos entre dos fechas
'* NO contempla días festivos
'* uso: DiasHabiles ("01/01/03", "01/02/03")
'* ESH 15/05/03 20:00
'*******************************************************************************
Public Function DiasHabiles(strFechaInicio As String, strFechaFin As String) As Long
Dim datFechaInicio As Date, _
datFechaFin As Date
datFechaInicio = CDate(strFechaInicio)
datFechaFin = CDate(strFechaFin)
Do While datFechaInicio <> datFechaFin
' según la fecha de inicio se mayor o menor que la de fin
If datFechaInicio >= datFechaFin Then
If Weekday(datFechaFin, vbMonday) < 6 Then DiasHabiles = DiasHabiles + 1
datFechaFin = datFechaFin + 1
Else
If Weekday(datFechaInicio, vbMonday) < 6 Then DiasHabiles = DiasHabiles + 1
datFechaInicio = datFechaInicio + 1
End If
Loop
End Function ' DiasHabiles
|
'*******************************************************************************
'* Devuelve la fecha del cambio de Horario de Verano (ultimo domingo de Marzo)
'* del año pasado como argumento y en su defecto el actual
'* uso: txtVerano = CambioHorarioVerano
'* ESH 01/04/03 18:50
'*******************************************************************************
Public Function CambioHorarioVerano(Optional intAño As Integer) As Date
Dim datDia As Date, _
bytDia As Byte
If intAño = 0 Then intAño = Year(Date)
' horario de verano (último domingo de Marzo)
bytDia = 31
datDia = DateSerial(intAño, 3, bytDia)
' busco el ultimo domingo (primero empezando por el final)
Do While Weekday(datDia) <> vbSunday
datDia = DateSerial(intAño, 3, bytDia)
bytDia = bytDia - 1
Loop
CambioHorarioVerano = datDia
End Function ' CambioHorarioVerano
|
'*******************************************************************************
'* Devuelve la fecha del cambio de Horario de Invierno (ultimo domingo de Octubre)
'* del año pasado como argumento y en su defecto el actual
'* uso: txtInvierno = CambioHorarioInvierno
'* ESH 01/04/03 18:55
'*******************************************************************************
Public Function CambioHorarioInvierno(Optional intAño As Integer) As Date
Dim datDia As Date, _
bytDia As Byte
If intAño = 0 Then intAño = Year(Date)
' horario de invierno (ultimo domingo de Octubre)
bytDia = 31
datDia = DateSerial(intAño, 10, bytDia)
' busco el ultimo domingo (primero empezando por el final)
Do While Weekday(datDia) <> vbSunday
datDia = DateSerial(intAño, 10, bytDia)
bytDia = bytDia - 1
Loop
CambioHorarioInvierno = datDia
End Function ' CambioHorarioInvierno
|
No hay comentarios:
Publicar un comentario
Gracias por comentar en mi blog. Saludos.