Lo primero que pensamos recomendarle es que utilizara el método FormatDateTime. Este método acepta una cadena y la convierte a formato de fecha:
strNew = FormatDateTime(strOld)
El problema de esta alternativa es que la primera fecha de nuestra tabla, 40806, se convierte a 9/20/2011. ¿Por qué? Bien, lo… interesante… de Excel es que cuando se intenta convertir una cifra en fecha, el programa asume que es un número en serie que representa la cantidad de días que han pasado desde el 1 de enero de 1900. Resulta que 40806 días después del 1 de enero de 1900 nos da la fecha del 20 de septiembre de 2011. Vuelta a empezar.
Al final decidimos tratar el número como una cadena: con las funciones de VBScript Left, Right y Mid se separa la cadena y posteriormente se vuelve a colocar todo con los símbolos adecuados que convencerán a Excel de que deseamos obtener una fecha real, no un número en serie. Este es el resultado:
Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open("C:\scripts\test.xls")
intRow = 1
intCol = 1
i = 0
Do Until objExcel.Cells(intRow,intCol).Value = ""
strDate = objExcel.Cells(intRow, intCol).Value
i = Len(strDate)
If i > 6 Then
dtYear = Right(strDate, 4)
i = i - 5
Else
dtYear = Right(strDate, 2)
i = i - 3
End If
dtDay = Mid(strDate, i, 2)
i = i - 1
dtMonth = Left(strDate, i)
newDate = dtMonth & "/" & dtDay & "/" & dtYear
objExcel.Cells(intRow, intCol).Value = newDate
intRow = intRow + 1
Loop
objExcel.Visible = True
Lo primero que hacemos es crear un objeto de Excel y abrir la hoja de cálculo. Después, configuramos un bucle Do para que recorra la columna de fechas completa. El bucle continuará hasta que llegue a una celda vacía en la columna; si no todas las columnas de su hoja de cálculo presentan fechas, deberá modificar esta secuencia de comandos.
A continuación, leemos la fecha de la primera celda, que casualmente se encuentra en la fila 1, columna 1:
strDate = objExcel.Cells(intRow, intCol).Value
Posteriormente empleamos la función Len para recuperar el número de caracteres en la cadena de fecha. Dado que la cadena no siempre tendrá la misma longitud, usaremos este número al leer la cadena para realizar un seguimiento del número de caracteres que hemos dejado.
Al leer la cadena, comenzamos desde el final de la misma. Teniendo en cuenta el formato de las fechas, la longitud máxima que puede tener una cadena con un año de dos dígitos es de seis caracteres, mientras que la longitud mínima de una cadena con un año de cuatro dígitos es de siete. Por ello comprobamos si la longitud de la cadena es superior a seis caracteres y, si es así, esto significa que este valor específico utiliza cuatro dígitos para el año. En consecuencia, utilizamos la función Right para leer los cuatro últimos caracteres y los guardamos como el año. Si la cadena tiene seis caracteres o menos, sólo puede significar una cosa: que emplea dos dígitos para indicar el año. Por lo tanto, leemos sólo los dos últimos caracteres y los guardamos como el año:
If i > 6 Then
dtYear = Right(strDate, 4)
i = i - 5
Else
dtYear = Right(strDate, 2)
i = i - 3
End If
Como puede observar, también restamos la longitud de la fecha más uno de la longitud de la cadena restante. Empleamos dicho número a medida que seguimos trabajando hacia atrás por la cadena para leer el día (y efectivamente, se trata de una configuración para Estados Unidos):
dtDay = Mid(strDate, i, 2)
i = i - 1
Aquí, utilizamos la función Mid para indicar que deseamos recuperar dos caracteres iniciales en la posición i, que, como dijimos antes, es la longitud de la cadena menos la longitud del año menos uno, puesto que vamos a recuperar dos caracteres. Por decirlo de otro modo, la primera cadena tiene cinco caracteres, por lo que el valor de i es 5. Tras leer el año, el valor de i es 5 – 2 – 1, o lo que es lo mismo, 2. Comenzando en la posición 2, tomamos dos caracteres, que casualmente representan el día. Posteriormente restamos 1 y empleamos esa posición para recuperar el mes:
dtMonth = Left(strDate, i)
Aquí usamos la función Left para recuperar el número de caracteres restante (en este caso uno) y los guardamos como el mes. A continuación, simplemente lo colocamos todo junto, separando las distintas partes de la fecha con barras diagonales (/):
newDate = dtMonth & "/" & dtDay & "/" & dtYear
Tras ello incluimos la nueva cadena en la celda en la que leemos la fecha, incrementamos el número de fila y volvemos a realizar un bucle que comience en la siguiente fila de la columna. Lo último que hacemos es abrir Excel para que se puedan ver los resultados.
Y eso es todo. Saluda a mamá de nuestra parte. Vaya, quería decir, salude a su mamá de nuestra parte…. |