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 __
... he estado buscando y no acabo de aclararme con mi duda.
... he hecho una funcion 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 configuracion regional del sistema del usuario.
en esto ultimo es donde tengo mis mayores dudas. En mi equipo tengo la configuracion (creo que) europea ['dd/mm/yyyy]
y en un principio pense que con formatearla asi Format(fecha, "mm/dd/yyyy") me valdria, y de hecho parece valerme, pero
y si la configuracion del sistema es p.ej: 'mm/dd/yyyy'? que ocurriria con el formateo?
lo invertiria, creyendo ponerlo bien, o directamente lo reconoce y lo mantiene tal cual?
... esta es la funcion, pero como solo la he probado en mi configuracion, 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 podeis echarme una mano o facilitarme un link 'esclarecedor', os lo agradezco
Respuesta Responder a este mensaje
#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:

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 :))



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.

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)] -?-



¿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..

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 -?-



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?

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



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

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



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
Respuesta Responder a este mensaje
#3 Héctor Miguel
16/05/2007 - 00:52 | Informe spam
hola, Ivan ! [entre lineas]
_____
... al hilo de tu respuesta... algunas de las dudas que me surjen empiezo por el final:
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


... mi idea andaba por aqui (aunque, no se porque, empe#ado en pasarlo a single e incluso a double)



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'


_____
... pensaba que al tratarse de... fechas en rangos tendria que reconvertir tambien el valor de las celdas
... ni siquiera se me habia ocurrido hacer pruebas), con el a#adido de que al usar comandos tipo AutoFilter, Find, etc...



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


_____
he cambiado la anterior funcion... 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 [codigo omitido] :-(( [...]
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 2do valor para el intervalo
en caso de ser 0, supong que tendre que incluir un condicional que permita la busqueda en todo el rango.



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


_____
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)] -?-


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: [codigo omitido] :-(( [...]
... mas que nada es por si ves algun posible problema con las fechas o



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


_____
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 -?-


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?



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


_____
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


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



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(...))


_____
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


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?



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

saludos,
hector.
Respuesta Responder a este mensaje
#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: =>

.3) la 'menor' fecha que excel tiene programado 'reconocer' es 01/01/1900





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
Respuesta Responder a este mensaje
#5 Héctor Miguel
16/05/2007 - 02:22 | Informe spam
hola, Ivan !

PD: (en espera de leer/traducir los links) solo una pregunta sin compromiso respecto a esto: =>
.3) la 'menor' fecha que excel tiene programado 'reconocer' es 01/01/1900


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...



[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.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida