Entrada de fecha con plantilla

16 envíos / 0 nuevos
Último envío
Jose Luis Casla...
Imagen de Jose Luis Casla Araiz
Offline
última acción: Hace 1 año 1 mes
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntos
alta: 11/05/2012 - 15:15
Puntos: 1785
Entrada de fecha con plantilla

Desearia saber si es posible (convencido de que en Excel se puede "casi" todo...) introducir en una celda, el dia, mes y año sin separacion y que Excel le ponga con algun formato, macro, o funcion, los guiones o barras correspondientes, como en este ejemplo:

Entro 230212 y Excel lo pone en la celda como 23-02-12 reconociendolo como fecha, claro esta.

Etiquetas: 

universoexcel
Imagen de universoexcel
Offline
última acción: Hace 6 años 8 meses
Nivel 1 - 200 puntosNivel 2 - 500 puntos
alta: 25/10/2011 - 19:41
Puntos: 710
Re: Entrada de fecha con plantilla

Efectivamente, en Excel "casi" todo es posible, pero a veces la solución no es la más intuitiva.

 

Hay varias formas de hacer lo que dices, pero básicamente todas necesitan que partas tu cadena de texto, para indicar que parte es el Dia, el Mes y el Año.

 

La fórmula más simple sería, asumiendo que tu valor estuviera en la celda A1: =FECHA("20"&DERECHA(A1,2),EXTRAE(A1,3,2),IZQUIERDA(A1,2))

 

El resultado será un número de serie al que ya podrás darle el formato de fecha que desees.

visitante (no verificado)
Imagen de visitante
Re: Entrada de fecha con plantilla

Te agradezco la respuesta que me ofreces, UniversoExcel, pero no sirve para la situación que planteo, porque el dato no se encuentra en ninguna celda previamente, sino que al llegar a la celda a1, por poner un ejemplo, quiero introducir una fecha, y pueda hacerlo sin necesidad de ponerle el separador guion o barra...

La idea, es que el usuario, pueda escribir, a veces con los separadores... a veces sin ellos... como cuando se define que una celda tenga formato de fecha, y Excel "entiende" de igual manera si escribes el guion o la barra como separador. Excel le pondra el separador que hayas escogido en el formato.

Para mi, la idea que mejor expresa esto, es la de una plantilla, que en otros lenguajes de programacion se puede utilizar, y los numeros que escribes, se van a situar solamente en los espacios entre los guiones que has definido como plantilla. La plantilla seria algo asi: ("NN-NN-NN") Los numeros que vas introduciendo van a situarse solamente sobre las "N" y si escribes el guion, no pasa nada porque la plantilla esta esperando el numero que ocupe el espacio de la siguiente "N". De todas maneras, repito, gracias por la respuesta.

visitante (no verificado)
Imagen de visitante
Re: Entrada de fecha con plantilla

Agradezco tu rapida respuesta, UniversoExcel. De todas maneras, no sirve para la situacion que planteo, ya que los numeros no estan "previamente" en ninguna celda. Es decir, no se trata de convertir una "cadena" que ya existiera, en formato fecha... sino que en la celda por ejemplo, A1 hay que introducir una fecha, y se trata de poder introducirla directamente, sin necesidad de escribir el separador, guion o barra, propio del formato Fecha.

La idea que mejor expresa esto, es la de una plantilla, como por ejemplo ("NN-NN-NN") en la que los numeros que se van introduciehndo en la celda, van a ir sustituyendo las N por cada numero. Es mas. Si se introduce el guion no pasa nada, ya que la "plantilla" espera hasta el siguiente numero, para sustituir la N correspondiente. Algunos otros lenguajes de programacion, utilizan este tipo de plantillas.

visitante (no verificado)
Imagen de visitante
Re: Entrada de fecha con plantilla

Te agradezco la rapida respuesta UniversoExcel. Pero no responde a la situacion que planteo.

No se trata de convertir una "cadena" existente en alguna celda, a formato Fecha. Eso estaria claro.

Se trata de que en la celda, por ejemplo A1, haya que introducir una fecha, y se pueda hacerlo directamente sin necesidad de escribir los separadores.

La idea es la de una plantilla, que se utiliza en algunos otros lenguajes de programacion, al estilo de ("NN-NN-NN") y donde cada numero que se introduce, ocupa el lugar solo de las N. Es mas. Si se introduce el guion da lo mismo, porque la plantilla "espera" al siguiente numero.

xoan ninguen
Imagen de xoan ninguen
Offline
última acción: Hace 3 años 9 meses
Nivel 1 - 200 puntosNivel 2 - 500 puntos
alta: 19/01/2011 - 10:03
Puntos: 835
Re: Entrada de fecha con plantilla

A ver, que lo intento yo:

 

Supón que las fechas a introducir están en la columna C (pueden estar en la columna que te venga en gana, o en toda la hoja incluso, pero puede dar error si no se corresponde con un valor de fecha correcto: p.e.: 31 de febrero de XXXX).

 

Pincha con el botón derecho en la pestaña de la hoja en la que quieres que haga la conversión de las cifras en fechas, y vete a "Ver Codigo" (es la última opción del menú emergente), allí pega esto:

 

Sub WorkSheet_Change(ByVal Target As Range)

    Dim lgValor As Long

    Target.NumberFormat = xlGeneral 'Esto asigna el formato General a la celda

    On Error Resume Next

    If IsNumeric(Target.Value) And Target.Value <> "" And Target.Column = 3 Then   '<----- Aquí pon el número de la columna que sea A=1, C = 3,...., o elimina "And Target.Column = 3" para que afecte a toda la hoja

        Application.EnableEvents = False

            Target.NumberFormat = "dd-mm-yyyy" 'Asignamos el formato de fecha que queremos 

            lgValor = Target.Value 'Guarda el valor introducido para poder operar con él

            Let Target.Value = VBA.CDate(VBA.Left(lgValor, 2) & "/" & VBA.Mid(lgValor, 3, 2) & "/" & VBA.Right(lgValor, 2))

        Let Application.EnableEvents = True

    End If

    On Error GoTo 0

 

End Sub

 

Espero que eso sea lo que precisas...

Puedes asignarle otros formatos a cañón (p.e:  "dd-mm-yyyy","dd~mm~yyyy",... la creatividad en Excel, que no tiene fronteras)

 

Un saludo

-----------------------------------------------------------------

www.TrazEX.com (soluciones sobre Excel)

visitante (no verificado)
Imagen de visitante
Re: Entrada de fecha con plantilla

Muy buena solucion, xoan ninguen. Por ahi habia hecho yo mis intentos, sin conseguirlo... Quiero decir, que yo habia situado la solucion en algun macro autoejecutable de la hoja, pero no habia acertado.

La solucion definitiva creo que vendra por ese camino. Y digo la solucion definitiva, porque con este paso aunque, repito, se acerca mucho, tiene un pequeño fallo cuando los dias son menor que 10... es decir, que estamos hablando de los 9 primeros dias de mes. En ese caso, desprecia el cero inicial y lo trata como un numero de cinco cifras y claro, da error. Muchas gracias, xoan ninguen.

xoan ninguen
Imagen de xoan ninguen
Offline
última acción: Hace 3 años 9 meses
Nivel 1 - 200 puntosNivel 2 - 500 puntos
alta: 19/01/2011 - 10:03
Puntos: 835
Re: Entrada de fecha con plantilla

Lo admito, fallé en el primer intento. No probé las cifras suficientes anoche.

Afortunadamente ya tenía creada una función para determinar las fechas... y aquí viene que ni pintada. Recordaba que no era una macro sencilla.

Está adaptada a un formato de un fichero que me encontré que tenía una forma rara para las fechas (80/20), y Excel no funciona así con los años, pero supongo que no te vas a encontrar con esta casuística de años, y que siempre te va a funcionar. Pero puedes ir a esa sección específica y modificar su comportamiento con el tema de los años.

 

Te va a encantar:

Un saludo

 

Sub WorkSheet_Change(ByVal Target As Range)
    Dim strCadenaFecha As String
    Target.NumberFormat = xlGeneral 'Esto asigna el formato General a la celda
    On Error Resume Next
    'Aquí podría seleccionarse la columna/Fila que sea menester (eliminando "And Target.Column = 3" afectaría a toda la hoja).
    If IsNumeric(Target.Value) And Target.Value <> "" And Target.Column = 3 Then
        Application.EnableEvents = False
            strCadenaFecha = Target.Value 'Guarda el valor introducido para poder operar con él
            Target.Value = fDeterminaFecha(strCadenaFecha)
            Target.NumberFormat = "dd-mm-yyyy" 'Asignamos el formato de fecha que queremos
        Let Application.EnableEvents = True
    End If
    On Error GoTo 0

End Sub

Private Function fDeterminaFecha(ByRef strFechaDDMMAAAA AsStringAs Date
'DDMMAAAA
    'DD representa el día con dos dígitos
    'MM el mes
    'AAAA el año
'Si la fecha tiene 6 ó menos dígitos, el año se representará con dos dígitos (AA), _
interpretándose con el criterio “80/20”. Esto es, cualquier año que sea igual o _
superior a 80 corresponderá al siglo XX y cualquier año que sea menor de 80 _
corresponderá al siglo XXI.

'Si la fecha tiene menos de 5 dígitos representa mes y año únicamente (MMAA), _
si tiene menos de tres, solo el año (AA).

'Si se identifica la fecha con un número impar de dígitos, _
se completará con el carácter cero por la izquierda.

'Para representar una fecha sin un día o mes específico, se utilizará un _
doble cero en cada caso.

    Dim intAño As Integer
    Dim intMes As Integer
    Dim intDia As Integer
    
    'Para fechas bien formateadas por Excel (o de lectura)
    strFechaDDMMAAAA = VBA.Replace(strFechaDDMMAAAA, VBA.Chr(47), "")
    '12062000  12 de junio de 2000
    '120699    12 de junio de 1999
    '00061281  junio de 1281
    '061281    6 de diciembre de 1981
    '401       abril de 2001
    
    Select Case Len(strFechaDDMMAAAA) > 6
        Case True
            intAño = VBA.CInt(VBA.Right(strFechaDDMMAAAA, 4))
            strFechaDDMMAAAA = VBA.Mid(strFechaDDMMAAAA, 1, VBA.Len(strFechaDDMMAAAA) - 4)
        Case False
            If VBA.Len(strFechaDDMMAAAA) Mod 2 ThenstrFechaDDMMAAAA = "0" & strFechaDDMMAAAA
            intAño = VBA.CInt(VBA.Right(strFechaDDMMAAAA, 2))
            strFechaDDMMAAAA = VBA.Mid(strFechaDDMMAAAA, 1, VBA.Len(strFechaDDMMAAAA) - 2)
            If intAño < 80 Then
                intAño = 2000 + intAño
            ElseIf intAño >= 80 And intAño < 100 Then
                intAño = 1900 + intAño
            End If
    End Select
    
    Select Case VBA.Len(strFechaDDMMAAAA)
        Case 0: intMes = 1: intDia = 1
        Case 2: intMes = VBA.CInt(strFechaDDMMAAAA): _
                intDia = 1
        Case 4: intMes = VBA.CInt(VBA.Mid(strFechaDDMMAAAA, 3, 2)): _
                intDia = VBA.CInt(VBA.Mid(strFechaDDMMAAAA, 1, 2))
    End Select
    
    fDeterminaFecha = VBA.CDate(DateSerial(intAño, intMes, intDia))
End Function

-----------------------------------------------------------------

www.TrazEX.com (soluciones sobre Excel)

visitante (no verificado)
Imagen de visitante
Re: Entrada de fecha con plantilla

Hola xoan ninguen. Muchas gracias de nuevo por tu aporte. Me da la impresion de que casi casi, te lo estas tomando como un asunto personal... Te lo agradezca sinceramente.

Tu planteamiento, minucioso hasta el detalle, me ha encantado, como tu mismo lo anticipabas.

La solucion planteada, responde perfectamente al planteamineto que yo hacia en mi pregunta original. Cualquier caso posible esta previsto... si los dias son menor que 10... asi como si la entrada de numeros contempla solamente el mes y el año.... incluso solo el año... No dejas resquicio de error...

Me ha encantado tambien el uso que haces de la funcion fDeterminaFecha... Muy agudo, eso de mirar si la cantidad de numeros que introduces en la celda, es par... 4 o 2... Muy agudo, si señor...

Bueno. Despues de los puntos a favor, un 10 por mi parte... un par de puntitos conflictivos...

Primero: Aunque esta expresion If IsNumeric(Target.Value) And Target.Value <> "" And Target.Column = 3 Then
de la macro "parece" limitar los efectos a la columna 3, algo ocurre en toda la hoja, porque si en cualquier otra columna de la misma hoja introduzco los mismos datos, por ejemplo, 130512 asi como en la columna 3 me pone "13-05-2012" (como se queria...) en las otras columnas, pone "1". No me explico por que...

Segundo: No se tampoco, por que en la columna 3 donde se ejecuta el macro, no se puede aplicar una validacion por ejemplo, que compruebe si la fecha esta dentro del año actual... fechas comprendidaes entre "01-01-2012" y el "31-12-2012".

Tampoco pretendo que me "saques las castañas del fuego" en todas las pegas... Te lo planteo, porque se me escapa el alcance de los efectos de esa macro aplicada a la hoja en cuestion.

Pero con lo que ya me has dado, me siento francamente muy agradecido. Gracias xoan ninguen y la intermediacion del Foro.

xoan ninguen
Imagen de xoan ninguen
Offline
última acción: Hace 3 años 9 meses
Nivel 1 - 200 puntosNivel 2 - 500 puntos
alta: 19/01/2011 - 10:03
Puntos: 835
Re: Entrada de fecha con plantilla

El cambio fundamental está en Target.NumberFormat =  xlGeneral  "General"

 

Además había un error con las fechas en las que los meses y los días se representaban con números impares de cifras (p.e.: 1-11-2012 --> 30/11/2012). El criterio que he seguido es que se aceptan estas numeraciones impares, pero los días se escriben con 1 o dos cifras (porque Excel eliminaría el 0 delantero), pero los meses, obligatoriamente con dos, cuando también se expresa día

La validación de fechas, la he tenido que introducir vía macro, no he sabido desactivarla -ni con el  EnableEvents = False- ... sé que tiene que ver con el formato (NumberFormat), pero ya había seguido otra línea argumental en la macro, y resolvía el problema.

Además hay que puentear algunos errores que salen por en medio con los formatos, o cuando el número de celdas es mayor que uno... resumiendo, queda algo así (como siempre, la liebre saldrá por algún sitio por donde no se la espera... ;)):

 

(Y ahora me estoy planteando la forma de meter esa comprobación de fechas dentro de una función/referencia... en vez de hacerlo dentro de la macro, que no tiene porqué ser accesible al usuario para modificarla. La única forma que se me ocurre, a bote pronto, es que fijes dos referencias a las fechas límite en dos celdas de la hoja y apuntes hacia ellas con dtFechaMinima/dtFechaMaxima = ActiveSheet.Cells(Fila,Columna)... ya estamos creativos)


Sub WorkSheet_Change(ByVal Target As Excel.Range)
    Dim strCadenaFecha As String
    Dim strFormatoPrevio As String
    Dim bConvertibleAFecha As Boolean
    Dim dtFecha As Date, dtFechaMinima As Date, dtFechaMaximaAs Date
    
    bConvertibleAFecha = False
    On Error GoTo SalirSinCambios
    If Target.Rows.Count > 1 Or Target.Columns.Count > 1 ThenGoTo SalirSinCambios
    strFormatoPrevio = Target.NumberFormat
    Target.NumberFormat = "General" 'Esto asigna el formato General a la celda
    'Aquí podría seleccionarse la columna/Fila que sea menester (eliminando "And Target.Column = 3" afectaría a toda la hoja).
    If IsNumeric(Target.Value) And Target.Value <> "" And Target.Column = 3 Then
        dtFechaMinima = "01-01-2013"
        dtFechaMaxima = "31-12-2013"
        
        strCadenaFecha = Target.Value 'Guarda el valor introducido para poder operar con él
        dtFecha = fDeterminaFecha(strCadenaFecha)
        If Not (dtFecha >= dtFechaMinima And dtFecha <= dtFechaMaxima) Then
            lgRespuesta = VBA.MsgBox("La fecha introducida no " & dtFecha & " no está comprendida entre los valores límite" & vbNewLine & _
                                     "[" & dtFechaMinima & " a " & dtFechaMaxima & "]", vbCritical, "A D V E R T E N C I A")
            strFormatoPrevio = "General"
        Else
            bConvertibleAFecha = True
            Let Application.EnableEvents = False
            Target.Value = dtFecha
            Target.NumberFormat = "dd-mm-yyyy" 'Asignamos el formato de fecha que queremos
            Let Application.EnableEvents = True
        End If
    End If
    Target.NumberFormat = VBA.IIf(bConvertibleAFecha, "dd-mm-yyyy", strFormatoPrevio)
    On Error GoTo 0

SalirSinCambios:
End Sub


Public Function fDeterminaFecha(ByRef strFechaDDMMAAAA As StringAs Date
'DDMMAAAA
    'DD representa el día con dos dígitos
    'MM el mes
    'AAAA el año
'Si la fecha tiene 6 ó menos dígitos, el año se representará con dos dígitos (AA), _
interpretándose con el criterio “80/20”. Esto es, cualquier año que sea igual o _
superior a 80 corresponderá al siglo XX y cualquier año que sea menor de 80 _
corresponderá al siglo XXI.

'Si la fecha tiene menos de 5 dígitos representa mes y año únicamente (MMAA), _
si tiene menos de tres, solo el año (AA).

'Si se identifica la fecha con un número impar de dígitos, _
se completará con el carácter cero por la izquierda.

'Para representar una fecha sin un día o mes específico, se utilizará un _
doble cero en cada caso.

    Dim intAño As Integer
    Dim intMes As Integer
    Dim intDia As Integer
    
    'Para fechas bien formateadas por Excel (o de lectura)
    strFechaDDMMAAAA = VBA.Replace(strFechaDDMMAAAA, VBA.Chr(47), "")
    '12062000  12 de junio de 2000
    '120699    12 de junio de 1999
    '00061281  junio de 1281
    '061281    6 de diciembre de 1981
    '401       abril de 2001
    
    Select Case Len(strFechaDDMMAAAA) > 6
        Case True
            intAño = VBA.CInt(VBA.Right(strFechaDDMMAAAA, 4))
            strFechaDDMMAAAA = VBA.Mid(strFechaDDMMAAAA, 1, VBA.Len(strFechaDDMMAAAA) - 4)
        Case False
            If VBA.Len(strFechaDDMMAAAA) Mod 2 Then strFechaDDMMAAAA = "0" & strFechaDDMMAAAA
            intAño = VBA.CInt(VBA.Right(strFechaDDMMAAAA, 2))
            strFechaDDMMAAAA = VBA.Mid(strFechaDDMMAAAA, 1, VBA.Len(strFechaDDMMAAAA) - 2)
            If intAño < 80 Then
                intAño = 2000 + intAño
            ElseIf intAño >= 80 And intAño < 100 Then
                intAño = 1900 + intAño
            End If
    End Select
    
    Select Case VBA.Len(strFechaDDMMAAAA)
        Case 0: intMes = 1: intDia = 1
        Case 1: intMes = VBA.CInt(strFechaDDMMAAAA): intDia = 1
        Case 2: intMes = VBA.CInt(strFechaDDMMAAAA): _
                intDia = 1
        Case 3: intMes = VBA.CInt(VBA.Right(strFechaDDMMAAAA, 2)): _
                intDia = VBA.CInt(VBA.Left(strFechaDDMMAAAA, 1))
        Case 4: intMes = VBA.CInt(VBA.Mid(strFechaDDMMAAAA, 3, 2)): _
                intDia = VBA.CInt(VBA.Mid(strFechaDDMMAAAA, 1, 2))
                If intMes > 12 Then 'Se ha producido un error en la interpretación de las fechas...
                    lgRespuesta = VBA.MsgBox("Error en la interpretación de las fechas", vbCritical, "A D V E R T E N C I A")
                    intDia = 1: intMes = 1
                End If
    End Select
    
    fDeterminaFecha = VBA.CDate(DateSerial(intAño, intMes, intDia))
End Function

-----------------------------------------------------------------

www.TrazEX.com (soluciones sobre Excel)

visitante (no verificado)
Imagen de visitante
Re: Entrada de fecha con plantilla

Hola de nuevo xoan ninguen.

A lo dicho. Te has picado con el tema y lo sigues bordando. Muchisimas gracias, por tu dedicacion y tambien, por las lecciones  que estoy entresacando de todo tu desarrollo.

Se me escapan no pocos detalles, claro esta, pero ahi voy rellenando los huecos de mis ignorancias. Gracias tambien por tu paciencia, porque aceptas con "deportividad" que la liebre salte por donde menos se espera. Desde luego, esa es experiencia adquirida en el diseño de programas y rutinas...

Resueltos algunos problemas. Al cambiar el formato a "General" se ha resuelto el tema de que en las otras celdas de la hoja no pormitiera introducir cantidades.

Tambien funciona la "validacion" introducida en la Macro definiendo la fecha minima y maxima.

En cuanto lo vi, pense que no habria dificultad para escribir esos topes minimo y maximo en un par de celdas de la hoja, y apuntar hacia ellas. De esa manera se podria "generalizar" la utilizacion de la macro, en otros años, sin necesidad de que el usuario entre en la macro...

Bueno. Pues la primera liebre me ha saltado, por lo menos a mi, porque no he conseguido que funcione la macro apuntando hacia esas celdas. He definido esas celdas, con formato de fecha, y he escrito la fecha minima como "01-01-2012" y la maxima como "31-12-2012" pero no se por que razon, en la celda donde trato de entrar la fecha bajo el control de la macro, (columna 3) si escribo "150512" me situa directamente 150512 como numero, alineado a la derecha, sin convertirlo en fecha.

En cambio, asignando el valor de la fecha minima y maxima, tal como tu lo has hecho, dentro de la macro, funciona perfectamente...

Segunda liebre que salta. Dejando como esta la macro, tal como tu la presentas, si introduzco una fecha formateada como lo hace Excel, es decir, 15/05/12, parece que esta instruccion

strFechaDDMMAAAA = VBA.Replace(strFechaDDMMAAAA, VBA.Chr(47), "")
pensada para suprimirle las dos barras diagonales, no hace efecto, la macro se confunde y convierte la fecha en numero...

No quisiera llegar al limite de tu paciencia, con tanta liebre y tanta... cosa.

Hasta donde me has llevado, ya me siento MUY agradecido. Gracias xoan ninguen.

 

xoan ninguen
Imagen de xoan ninguen
Offline
última acción: Hace 3 años 9 meses
Nivel 1 - 200 puntosNivel 2 - 500 puntos
alta: 19/01/2011 - 10:03
Puntos: 835
Re: Entrada de fecha con plantilla

Hola José Luis,

No voy a negar que me lo estoy tomando como algo personal ;), pero de paso que corrijo tus liebres, voy depurando mi técnica de macros. Y aumento la programación defensiva de algunas de mis creaciones... porque el usuario final es impredecible XDD.

Mando un archivo montado... con las macros incluídas (por seguridad, deberías desactivar las macros y revisar antes el código, si bien mi código no incluye nada malicioso, no está de más acostumbrarse a este proceder).

 

Por cierto, hay algunos errores sistemáticos (por falta de espacios en los "Then" y "As XXX") cuando se copia el código de la página. Es cuestión del script que utilizo para general el código de colores... bueno, ya supongo que los vas corrigiendo, porque hasta ahora has podido ejecutar el código que he ido posteando.

 

Un saludo

Enrique

 

'Para la primera liebre:

Sub WorkSheet_Change(ByVal Target As Excel.Range)

    Dim strCadenaFecha As String
    Dim strFormatoPrevio As String
    Dim bConvertibleAFecha As Boolean
    Dim dtFecha As Date, dtFechaMinima As Date, dtFechaMaxima As Date
    
    bConvertibleAFecha = False
    On Error GoTo SalirSinCambios
    If Target.Rows.Count > 1 Or Target.Columns.Count > 1 Then GoTo SalirSinCambios
    strFormatoPrevio = Target.NumberFormat
    Target.NumberFormat = "General" 'Esto asigna el formato General a la celda
    'Aquí podría seleccionarse la columna/Fila que sea menester (eliminando "And Target.Column = 3" afectaría a toda la hoja).
    If IsNumeric(Target.Value) And Target.Value <> "" And Target.Column = 3 Then
        dtFechaMinima = ActiveSheet.Cells(1, 2) '"01-01-2013"
        dtFechaMaxima = ActiveSheet.Cells(2, 2) '"31-12-2013"
        
        strCadenaFecha = Target.Value 'Guarda el valor introducido para poder operar con él
        dtFecha = fDeterminaFecha(strCadenaFecha)
        If Not (dtFecha >= dtFechaMinima And dtFecha <= dtFechaMaxima) Then
            lgRespuesta = VBA.MsgBox("La fecha introducida no " & dtFecha & " no está comprendida entre los valores límite" & vbNewLine & _
                                     "[" & dtFechaMinima & " a " & dtFechaMaxima & "]", vbCritical, "A D V E R T E N C I A")
            strCadenaFecha = VBA.InputBox("Revise la fecha y corrija si es preciso", "Fecha fuera de rango", Target.Value)
            dtFecha = fDeterminaFecha(strCadenaFecha)
        End If
        bConvertibleAFecha = True
        Let Application.EnableEvents = False
        Target.Value = dtFecha
        Target.NumberFormat = "dd-mm-yyyy" 'Asignamos el formato de fecha que queremos
        Let Application.EnableEvents = True
    End If
    Target.NumberFormat = VBA.IIf(bConvertibleAFecha, "dd-mm-yyyy", strFormatoPrevio)
    On Error GoTo 0

SalirSinCambios:
End Sub


'Para la segunda liebre:

Public Function fDeterminaFecha(ByRef strFechaDDMMAAAA As String) As Date

'DDMMAAAA
    'DD representa el día con dos dígitos
    'MM el mes
    'AAAA el año
'Si la fecha tiene 6 ó menos dígitos, el año se representará con dos dígitos (AA), _
interpretándose con el criterio “80/20”. Esto es, cualquier año que sea igual o _
superior a 80 corresponderá al siglo XX y cualquier año que sea menor de 80 _
corresponderá al siglo XXI.

'Si la fecha tiene menos de 5 dígitos representa mes y año únicamente (MMAA), _
si tiene menos de tres, solo el año (AA).

'Si se identifica la fecha con un número impar de dígitos, _
se completará con el carácter cero por la izquierda.

'Para representar una fecha sin un día o mes específico, se utilizará un _
doble cero en cada caso.

    Dim intAño As Integer
    Dim intMes As Integer
    Dim intDia As Integer
    
    'Para fechas bien formateadas por Excel (o de lectura)
    If VBA.CInt(VBA.Left(strFechaDDMMAAAA, 1)) > 3 Then
        'Ya tiene formato fecha...
        intDia = VBA.Day(strFechaDDMMAAAA)
        intMes = VBA.Month(strFechaDDMMAAAA)
        intAño = VBA.Year(strFechaDDMMAAAA)
        strFechaDDMMAAAA = intDia & intMes & intAño
    End If
    strFechaDDMMAAAA = VBA.Replace(strFechaDDMMAAAA, VBA.Chr(47), "")
    '12062000  12 de junio de 2000
    '120699    12 de junio de 1999
    '00061281  junio de 1281
    '061281    6 de diciembre de 1981
    '401       abril de 2001
    
    Select Case Len(strFechaDDMMAAAA) > 6
        Case True
            intAño = VBA.CInt(VBA.Right(strFechaDDMMAAAA, 4))
            strFechaDDMMAAAA = VBA.Mid(strFechaDDMMAAAA, 1, VBA.Len(strFechaDDMMAAAA) - 4)
        Case False
            If VBA.Len(strFechaDDMMAAAA) Mod 2 ThenstrFechaDDMMAAAA = "0" & strFechaDDMMAAAA
            intAño = VBA.CInt(VBA.Right(strFechaDDMMAAAA, 2))
            strFechaDDMMAAAA = VBA.Mid(strFechaDDMMAAAA, 1, VBA.Len(strFechaDDMMAAAA) - 2)
            If intAño < 80 Then
                intAño = 2000 + intAño
            ElseIf intAño >= 80 And intAño < 100 Then
                intAño = 1900 + intAño
            End If
    End Select
    
    Select Case VBA.Len(strFechaDDMMAAAA)
        Case 0: intMes = 1: intDia = 1
        Case 1: intMes = VBA.CInt(strFechaDDMMAAAA): intDia = 1
        Case 2: intMes = VBA.CInt(strFechaDDMMAAAA): _
                intDia = 1
        Case 3: intMes = VBA.CInt(VBA.Right(strFechaDDMMAAAA, 2)): _
                intDia = VBA.CInt(VBA.Left(strFechaDDMMAAAA, 1))
        Case 4: intMes = VBA.CInt(VBA.Mid(strFechaDDMMAAAA, 3, 2)): _
                intDia = VBA.CInt(VBA.Mid(strFechaDDMMAAAA, 1, 2))
                If intMes > 12 Then 'Se ha producido un error en la interpretación de las fechas...
                    lgRespuesta = VBA.MsgBox("Error en la interpretación de las fechas", vbCritical, "A D V E R T E N C I A")
                    intDia = 1: intMes = 1
                End If
    End Select
    
    fDeterminaFecha = VBA.CDate(DateSerial(intAño, intMes, intDia))
End Function

AdjuntoTamaño
Office spreadsheet icon fecheitor.xls32.5 KB

-----------------------------------------------------------------

www.TrazEX.com (soluciones sobre Excel)

xoan ninguen
Imagen de xoan ninguen
Offline
última acción: Hace 3 años 9 meses
Nivel 1 - 200 puntosNivel 2 - 500 puntos
alta: 19/01/2011 - 10:03
Puntos: 835
Re: Entrada de fecha con plantilla

Problemas: no admite fechas escritas al estilo Excel, es decir, asi 15/05/13 o 15/05/2013. El objetivo que se buscaba era evitar las barras.


Tras más de una hora peleando con el asunto, es  jugar al gato y al ratón contra Excel... porque cuando introduzco un valor, Excel internamente lo reconfigura a lo que él entiende, y llega un momento en el que el usuario puede querer introducir las fechas sin barras, Excel le pone las barras, y a partir de ahí, ya es cuestión de la diosa fortuna.


Recomendación: las fechas sólo deberían introducirse en un formato preestablecido, con barras o sin ellas, porque Excel tiene cosas que decir.

Las fechas es lo que tiene, hay muchos formatos, y Excel, con afán de facilitar la tarea al usuario, te la entorpece en este caso. Pero la culpa aquí es del usuario... ;).


Yo lo dejo aquí, si alguien más puede aportar, se agradecerá. Yo, al menos, necesitaría verlo desde otra perspectiva.


P.D.: Si el usuario entra la fecha en el formato con barras, lo más probable es que falle. Y la celda "probablemente" se coloreará en rojo, para su revisión.

AdjuntoTamaño
Office spreadsheet icon fecheitor.xls42.5 KB

-----------------------------------------------------------------

www.TrazEX.com (soluciones sobre Excel)

Jose Luis Casla...
Imagen de Jose Luis Casla Araiz
Offline
última acción: Hace 1 año 1 mes
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntos
alta: 11/05/2012 - 15:15
Puntos: 1785
Re: Entrada de fecha con plantilla

Hola Xoan Ninguen:

Tengo que agradezcerte el esfuerzo realizado y el tiempo dedicado a atender mi pregunta.

Creo que tal como ha quedado esta francamente operativo y queda claro que el usuario debe "aprender" a no meter la fecha con las barras.

Has hecho un buen trabajo, y te aseguro que ademas de la respuesta a mi pregunta, he encontrado en tus planteamientos, lecciones importantes para poder caminar en este mundo de la programacion de Excel, con los recursos del VBA.

Un saludo cordial y mi agradecimiento sincero

Jose Luis Casla

visitante (no verificado)
Imagen de visitante
Re: Entrada de fecha con plantilla

BRAVO! BRAVO Y BRAVO XOAN NINGUEN! 

La parte técnica me queda grande, pero has conseguido dar solución a un problema desesperante, donde muchos desisten, y lo mas importante es que pueden implementarla gente inexperta como yo. 

Muchas Gracias por la solución, y chapó por tu dedicación y afán de solución para con lo demás.

Lara H

chachocara
Imagen de chachocara
Offline
última acción: Hace 11 años 2 meses
alta: 19/01/2013 - 16:17
Puntos: 15
Re: Entrada de fecha con plantilla

Buenas tardes, quisiera saber si me pueden ayudar con el archivo adjunto; necesito que se pueda completar las columnas que digan fecha de la forma en que lo sugiere José Luis. Desde ya muchas gracias por su atención.

AdjuntoTamaño
File trabajos_y_pagos_consultorio.xlsx53.18 KB