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.
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.
Visitanos en http://universoexcel.com
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.
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.
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.
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)
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.
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 AsString) 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)
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)
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.
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 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)
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)
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.
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
-----------------------------------------------------------------
www.TrazEX.com (soluciones sobre Excel)
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.
-----------------------------------------------------------------
www.TrazEX.com (soluciones sobre Excel)
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
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
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.