fechas VBA

15/05/2007 - 02:25 por Ivan | Informe spam
hola a todos,

aunque se que es un tema muy tratado en el foro (de hecho creo haber leído
unas cuantas conversaciones al respecto, sobre todo de y/o entre Hector
Miguel y KL, en incluso puede que yo mismo haya estado implicado en alguna),
he estado buscando y no acabo de aclararme con mi duda.

se trata de lo siguiente: he hecho una función para que me devuelva la fecha
en formato valido para VB < espero no equivocarme al pensar que es
'mm/dd/yy' >, para poder usar estas en diversos procesos (pej autofiltros)
sin tener que formatearla directamente cada vez, y SOBRE TODO para poder
usarla sin que importe la configuración regional del sistema del usuario.

en esto ultimo es donde tengo mis mayores dudas. En mi equipo tengo la
configuración (creo que) europea ['dd/mm/yyyy], y en un principio pensé que
con formatearla así Format(fecha, "mm/dd/yyyy") me valdría, y de hecho
parece valerme, pero

¿y si la configuración del sistema es p.ej: 'mm/dd/yyyy'? ¿que ocurriría con
el formateo?¿ lo invertiría, creyendo ponerlo bien, o directamente lo
reconoce y lo mantiene tal cual?

bueno, ante estas dudas, esta es la función, pero como solo la he probado en
mi configuración, en la que parece funcionar bien, no se hasta que punto
pueden surgir problemas en otras configuraciones, o si existen tros factores
a tener en cuenta, o una forma de simplificarlo

Function FechaVba(ByVal fecha As Date) As Date
Select Case Application.International(xlDateOrder)
Case 0: FechaVba = DateValue(fecha)
Case Else: FechaVba = Format(fecha, "mm/dd/yyyy")
End Select
End Function

lo dicho, si podéis echarme una mano o facilitarme un link 'esclarecedor',
os lo agradezco

un saludo y hasta pronto
Ivan

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
15/05/2007 - 07:04 | Informe spam
hola, Ivan !

1) al usar la funcion [vba] Format, no pierdas de vista que devuelve -> cadenas de texto
por lo que pudiera ser necesario andar des/re/convirtiendo fechas segun la configuracion regional -?-

2) [hasta donde se] existen algunas 'situaciones' donde es necesario 'respetar' la configuracion regional [p.e.]
el separador decimal en algunos casos de autofiltros, y otras caracteristicas como en los formatos condicionales
[por si estuvieran estos incluidos en tus 'diversos procesos' (pej autofiltros)] -?-

3) todas formas, no creo que te resulte perjudicial si te comento [hasta donde se] algunos 'trabajos' con fechas en vba...
a) si en tu configuracion regional, el orden de fecha-corta es dd-mm-aa... para VBA [que es 'US-Centric'] ES mm-dd-aa
b) CDate(texto_fecha) utiliza el formato/orden de fechas que se tiene en la configuracion regional de windows
c) VBA [siendo US-Centric) ESPERA y 'trabaja' -siempre/solo- con el formato de fechas mm-dd-yy
d) si en la configuracion regional el formato de fechas es NO-USA... hay 'conflictos' con la interpretacion EN VBA
e) si [al fin de cuentas en excel] las fechas SON numeros seriales...
-> una 'nueva' re/conversion con el tipo de datos CLng(CDate(...)) +/- te asegura la 'transparencia' entre VBA-usuario :))

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

__ la consulta original __
Mostrar la cita
#2 Ivan
15/05/2007 - 19:58 | Informe spam
hola Hector Miguel, muchas gracias una vez mas

la verdad es que aunque ya (te) lo habia 'oido' en muchas ocasiones, no deja
de ser curioso el comportamiento de las fechas en vba. Gracias a tus
comentarios (estos y los de otras muchas de tus respuestas en el foro) creo
que al menos ire recortando bastante mi ignorancia al respecto. De todas
formas, y al hilo de tu respuesta, permiteme consultarte algunas de las
dudas que me surjen

empiezo por el final:

Mostrar la cita
inicialmente mi idea andaba por aqui (aunque, no se porque, empeñado en
pasarlo a single e incluso a double), pero pensaba que al tratarse de
busquedas de fechas en rangos tendria que reconvertir tambien el valor de
las celdas al mismo tipo para hacer la comparacion (la verdad es que me
obceque un poco y ni siquiera se me habia ocurrido hacer pruebas), con el
añadido de que al usar comandos tipo AutoFilter, Find, etc, esto no era
posible. Ahora, tras tu comentario, he hecho algunas pruebas, y
efectivamente parece asociar el nro. a la fecha correspondiente tambien en
esos casos (al menos con autofilter) sin necesidad de usar formatos o
similar.

he cambiado la anterior funcion por esta, que aunque quizas sea un poco
innecesaria, me permite asignar un valor cero cuando el dato no es valido o
no existe (inicialmente esta encaminado a btener el intervalo de fechas
entre las introducidas en 2 textbox), y asi comenzar la busqueda desde el
inicio de la lista

'
Function LongFecha(ByVal fecha As Variant) As Long
On Error Resume Next
LongFecha = CLng(CDate(fecha))
On Error GoTo 0
End Function
'

en cuanto a esto no tenia claro que fecha devolveria '0' pero parece que es
esta: 30/12/1899, lo cual en mi cas creo que es margen suficiente. En
cuanto al 2º valor para el intervalo, en caso de ser 0, supong que tendre
que incluir un condicional que permita la busqueda en todo el rango.

Mostrar la cita
¿podrias decirme en que casos [o algun ej.] se dan estas excepciones? por
ej. en mis intentos cn autofiltros (usando las fechas formateadas) si parece
obligado el formato US-centric

en cualquier caso supongo que el uso de una funcion tipo a la del anterior
mensaje no afectaria a las opciones de configuracin en si mismas, o al menos
no al separador decimal. ¿o quizas si?

de todas formas te pongo una de mis pruebas de uso con los autofiltros:

'-
' filtra una lista con los registros comprendidos entre dos datos
' (nros o fechas) y pega el resultado (+ titulos) en otra hoja
'-
Public Sub EntreDatos(ByRef rngOrigen As Range, _
ByRef CeldaDestino As Range, _
ByVal Dato1 As Variant, _
ByVal Dato2 As Variant, _
ByVal colFiltro As Long)
Dim Crt1, Crt2, hjOrigen As Worksheet, _
hjDestino As Worksheet
If rngOrigen.Cells(2, 1) = "" Then Exit Sub
Set hjOrigen = rngOrigen.Parent
Set hjDestino = CeldaDestino.Parent
Application.ScreenUpdating = False
With hjDestino
If .AutoFilterMode Then .AutoFilterMode = False
End With
CeldaDestino.CurrentRegion.Clear
Crt1 = ">=" & Dato1: Crt2 = "<=" & Dato2
With hjOrigen
If .AutoFilterMode Then .AutoFilterMode = False
With rngOrigen
.Sort Key1:=.Cells(2, colFiltro), _
order1:=xlAscending, _
header:=xlYes
.AutoFilter field:=colFiltro, _
Criteria1:=Crt1, _
Operator:=xlAnd, _
Criteria2:=Crt2
End With
.AutoFilter.Range.Copy CeldaDestino
If .AutoFilterMode Then .AutoFilterMode = False
End With
Set hjOrigen = Nothing: Set hjDestino = Nothing
End Sub
'--

bueno, mas que nada es por si ves algun posible problema con las fechas
o..

Mostrar la cita
aqui ando un poco mareado, pues por lo que parece (o al menos eso me ha
parecido en mis pruebas) hay veces que una 'fecha' de tipo string, o quizas
mejor dicho, una cadena con formato 'asociable' a una fecha si la reconoce
como tal ( configuraciones aparte) y en otras me da la impresion de que no,
aunque ahora mismo no sabria decir cuales son las unas y cuales las otras.

¿hay algun 'patron' para saber en cuales reconoce un texto como fecha y en
cuales no?

Mostrar la cita
con lo que, si te he entendido bien, el uso de CDate no garantiza la
'traduccion' a lenguage VBa

Mostrar la cita
entonces, y al menos en el caso de excel, ¿seria suficiente con la
conversion a Long para realizar una comparacion sin importar la
configuracion, o puede haber excepciones?


bueno, como veras, me he tomado el pie, que se dice por aqui

en cualquier caso muchas gracias

un saludo y hasta pronto
Ivan
#3 Héctor Miguel
16/05/2007 - 00:52 | Informe spam
hola, Ivan ! [entre lineas]
_____
Mostrar la cita
1) si las fechas son la parte 'entera' de un numero serial seria mejor usar CLng [entero largo] ya que con CInt [entero simple]
tu rango de fechas 'detectable' se acaba +/- por Sept-17-1989 [32768]
-> si nececitas incluir horas a la fecha, entonces sera mejor convertir a 'doble'


_____
Mostrar la cita
2) una vez que se han 'bien-comunicado' excel-vba-usuario no se requieren de mayore 'peripecias' en la interfase con el usuario :D


_____
Mostrar la cita
3) la 'menor' fecha que excel tiene programado 'reconocer' es 01/01/1900 :-((
si requieres trabajar con fechas anteriores [?]... visita: -> http://www.j-walk.com/ss/excel/files/xdate.htm


_____
Mostrar la cita
4) te sugeriria utilizar controles de fecha/hora como el DTPicker o el Calendar -> EN LUGAR DE TEXTBOXES [por si las dudas]
a) los textboxes aceptan todo tipo de datos de entrada [a menos que los separes para dia / mes / a#o]...
b) nada te garantiza que lo que el usuario este 'entrando' vaya a coincidir NI con la configuracion regional NI con vba -?-
c) [p.e.] que sucedera si [por costumbre] hace una entrada de fecha usando literales en ingles/castellano en el idioma 'equivocado' ?
-> revisa: http://www.bmsltd.ie/ExcelProgRef/Ch22/default.htm


_____
Mostrar la cita
5) [creo que] mas que algun 'patron', hay que 'mantener presentes' los convencionalismos de fechas en vba
y las formas de comunicacion 'efectiva/transparente/...' con el usuario :))
[aunque parezcan muchas/demasiadas/... si las analizas/asimilas/comprendes/... no son tantas] :D


_____
Mostrar la cita
6) es correcto, solo te 'dice' que vba ha 'captado' cual es el formato en la configuracion regional donde esta corriendo
[pero sigue 'necesitando' que se lo digas.. 'en su idioma'] :)) -> CLng(CDate(...))


_____
Mostrar la cita
7) espero que no hubiera mayores 'reglas' a considerar... en cualquier caso, te remitiria nuevamente con Stephen Bullen :))

saludos,
hector.
#4 Ivan
16/05/2007 - 02:01 | Informe spam
hola Hector Miguel, muchas gracias por todo

(lo mismo aparece duplicado este mensaje pues google me ha hecho una
csa 'rara', pero por si acaso aqui lo envi)

de un plumazo has despejado unas cuantas de esas dudas, que aunque en
algunos casos parezcan obvias, no acabas (acabo) de asimilar/
comprender < a pesar de haber leido mil veces sobre (+o-) ellas> hasta
que no te dan una esplicacion concreta.

Mis nros. rojos contigo no se si cabrian en un double. Gracias de
nuevo.

en cuanto a los enlaces, 'prometo' empezar ha retomar mi precario
ingles con ellos

un saludo y hasta pronto
Ivan

PD: (en espera de leer/traducir los links) solo una pregunta sin
compromiso respecto a esto: =>

Mostrar la cita
supongo que por 'reconcer' se entiende el poder operar con ellas como
fechas desde la interfaz de excel, pero ¿con VBA si puede trabajarse
con fechas anterires? lo comento sobre todo porque por ej. el
'31/12/1899' venia de ejecutar en la ventana inmediato lo siguiente:

format(cdate(0),"dd/mm/yyyy")

y por ej. esto => 'format(cdate(-50000),"dd/mm/yyyy")'

devuelve esto => '06/02/1763'

bueno, lo dicho, sin ningun compromiso, solo que me ha llamado la
atencion. Un saludo
#5 Héctor Miguel
16/05/2007 - 02:22 | Informe spam
hola, Ivan !

Mostrar la cita
[hasta donde se]... es correcto, la 'limitante' opera solo en la interfase con el usuario, no tanto en vba ;)
[aunque por otro lado]... si la intencion es 'interactuar' con el usuario... -???-
[supongo que] seguiras 'sujeto' a los convencionalismos regionales
[y a trabajar con fechas 'textuales' con el usuario] :D

saludos,
hector.
Ads by Google
Search Busqueda sugerida