¡Hola, chicos del scripting!

Bienvenido a la columna TechNet en la cual, por medio de Microsoft Scripting Guy, se abordan las preguntas frecuentes acerca de las secuencias de comandos para la administración de sistemas. ¿Tiene alguna pregunta sobre las secuencias de comandos para la administración de sistemas? Envíe un correo electrónico a scripter@microsoft.com. No podemos garantizarle que seremos capaces de responder todas las preguntas que nos lleguen, pero haremos todo lo posible.

Y no se olvide de consultar el Archivo de ¡Hola, chicos del scripting!.

Pregunta del día: ¿cómo puedo convertir un número en una fecha, por ejemplo, 40806 en 4/8/2006, en Excel?


¿Cómo puedo convertir un número en una fecha en Excel?

P

¡Hola, chicos del scripting! ¿Cómo puedo convertir un número en una fecha, por ejemplo, 40806 en 4/8/2006, en Excel?

-- JM

R

Hola JM. Probablemente no sepa que uno de los chicos del scripting tiene un hermano que es actor. Y como todo actor sabe, el nepotismo es bastante frecuente en el mundo de la interpretación. Bien, es algo positivo que los chicos del scripting no seamos actores, porque nunca nos rebajaríamos a tal favoritismo. (Existen otras razones por las que es bueno que no seamos actores, pero esa es otra historia.) Nosotros seleccionamos de forma aleatoria las preguntas que vamos a responder de los cientos que recibimos a diario. Así que, hermanito, digo, JM, ¿qué es lo que deseaba saber? Ah, sí, cómo convertir números en fechas en Excel.

Por su mensaje de correo electrónico parece que dispone de una hoja de cálculo con una columna de números en la que el primero o los dos primeros dígitos (dependiendo del mes) representan el mes, los dos siguientes (siempre dos) el día y los dos o cuatro últimos (ya sea 06 ó 2006) representan el año. Algo parecido a lo siguiente:

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


Para más Información

Consulte el Archivo de ¡Hola, chicos del scripting!.

Arriba Arriba