¡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 crear una tabla y rellenar automáticamente la primera columna con un intervalo de fechas?


¿Cómo puedo crear una tabla y rellenar la primera columna con un intervalo de fechas?

P

¡Hola, chicos del scripting! ¿Cómo puedo crear una tabla y rellenar automáticamente la primera columna con un intervalo de fechas?

-- DG

R

Hola DG. ¿Sabe? Hace tiempo nos habríamos puesto un poco nerviosos al tener que responder a esta pregunta. ¿Por qué? Bien, al parecer Word debería incluir un comando para hacer algo así y nosotros no pudimos encontrarlo. (Aunque la verdad es que tampoco buscamos mucho.) Sin embargo, sí que tenemos una secuencia de comandos que a pesar de no ser la solución más elegante puede solucionarnos el problema.

Así que ¿por qué nos ponemos nerviosos? Cada vez que hemos respondido a una pregunta similar hemos recibido un aluvión de mensajes de correo electrónico de gente que nos decía cosas como “En lugar de utilizar una loca solución en forma de 100 líneas de código podrían haber logrado lo mismo con un par de líneas simplemente llamando al método AutoCreateCalendar”. Estos comentarios suponían un problema y no sólo porque hirieran sentimientos (bueno, en realidad no tanto; los chicos del scripting no tenemos sentimientos), sino porque eran acertados: podríamos haber hecho las cosas mejor, o más rápidamente o más fácilmente. Desgraciadamente, y por motivos que no vamos a discutir, no podíamos hacer gran cosa con todas estas soluciones mejores o más rápidas o más fáciles que recibíamos.

Pero ahora contamos con Community-Submitted Scripts Center (en inglés). Mientras lee la columna de hoy, si se descubre pensando “Vaya, yo tengo una forma mucho mejor de resolver este problema”, envíe su solución a Community Center. Confíe en nosotros, los chicos de scripting somos conscientes de que podemos no tener respuesta para los problemas de todos.

Bueno, al menos no a los problemas de secuencias de comandos de todos.

Así que ¿qué solución encontramos? La siguiente:

Const NUMBER_OF_ROWS = 1
Const NUMBER_OF_COLUMNS = 2
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
Set objDoc = objWord.Documents.Add()
Set objRange = objDoc.Range()
objDoc.Tables.Add objRange, NUMBER_OF_ROWS, NUMBER_OF_COLUMNS
Set objTable = objDoc.Tables(1)
objTable.Cell(1, 1).Range.Text = "Date"
objTable.Cell(1, 2).Range.Text = "Notes"
dtmDate = #4/1/2006#
dtmMonth = Month(dtmDate)
i = 2
Do While True
    objTable.Rows.Add()
    objTable.Cell(i, 1).Range.Text = dtmDate
    dtmDate = dtmDate + 1
    If Month(dtmDate) <> dtmMonth Then
        Exit Do
    End If
    i = i +1
Loop

Antes de comenzar debemos señalar que este pequeño código está relacionado con agregar fechas a una tabla; gran parte de él trata cómo crear la tabla en primer lugar. Hoy no ahondaremos en el tema de la creación de tablas. Pero no desespere: tenemos un artículo de Office Space (en inglés) en el que encontrará la información sobre cómo crear una tabla en Microsoft Word.

Sin abundar en detalles, la secuencia comienza creando una nueva instancia visible del objeto Word.Application y posteriormente utiliza el método Add para abrir un documento de Word en blanco. Posteriormente agregamos una nueva tabla (con una fila y dos columnas) a este documento, incluyendo el encabezado Date (Fecha) en la columna 1 y el encabezado Notes (Notas) en la columna 2. (¿Por qué razón? Porque DG necesita una tabla con un aspecto similar al siguiente: la fecha en una columna y espacio para escribir notas en la otra. También debemos señalar que DG la necesita para un mes cada vez, por ejemplo, una fila en la columna para cada uno de los días del mes de abril.)

Eso nos lleva a estas tres líneas de código:

dtmDate = #4/1/2006#
dtmMonth = Month(dtmDate)
i = 2

En la primera línea simplemente asignamos el primer día del mes de abril (4/1/2006) a una variable llamada dtmDate. A continuación utilizamos la función Month para asignar el mes (abril) de la fecha inicial a una variable llamada dtmMonth. Como pronto comprobará, emplearemos esta variable para determinar el momento en que se alcanza el final del mes.

Ah, cierto: ¿qué pasa con la línea 3? En la línea 3 asignamos el valor 2 a la variable de contador i. Emplearemos esta variable para realizar un seguimiento de en qué número de fila de la tabla trabajamos. Asignamos a la variable el valor 2 puesto que es la fila en la que deseamos colocar el primer día del mes; recuerde que ya hemos insertado encabezados en la primera fila de la tabla.

A continuación directamente nos encontramos con este bloque de código:

Do While True
    objTable.Rows.Add()
    objTable.Cell(i, 1).Range.Text = dtmDate
    dtmDate = dtmDate + 1
    If Month(dtmDate) <> dtmMonth Then
        Exit Do
    End If
    i = i +1
Loop

En él configuramos un bucle Do que se ejecutará hasta que alcancemos el final del mes. Dentro de dicho bucle llamamos al método Add para agregar una nueva fila a la tabla; posteriormente empleamos esta línea de código para escribir el valor de nuestra fecha inicial en la columna 1 de esta nueva fila:

objTable.Cell(i, 1).Range.Text = dtmDate

Hasta ahora ha sido bastante fácil; ahora es cuando se complica un poco. Tras escribir el 1 de abril de 2006 en la tabla, necesitamos hacer lo mismo con el 2 de abril de 2006 pero en la siguiente fila. Para ello comenzamos agregando un día a la variable dtmDate, con lo que se consigue que el valor de dtmDate sea igual al 2 de abril de 2006:

dtmDate = dtmDate + 1

Eso está bien. Pero suponga que dtmDate era igual al 30 de abril de 2006. En ese caso, al agregarse un día, dtmDate sería igual al 1 de mayo de 2006 y no queremos ninguna fecha de mayo en la tabla. En cambio, si simplemente hemos agregado filas para cada día de abril el trabajo está concluido. ¿Qué hacemos en ese caso? Aquí se lo mostramos:

If Month(dtmDate) <> dtmMonth Then
    Exit Do
End If

Comprobamos que el mes de nuestra fecha actual (dtmDate) aún es igual al mes inicial de abril (que, como bien recuerda, incluimos en la variable dtmMonth). En caso afirmativo incrementamos la variable de contador i en 1, realizamos un bucle y agregamos una nueva fila a la tabla. Sin embargo, si los dos meses son diferentes, esto significará que nos hemos quedado sin días de abril. En este caso usamos el comando Exit Do para salir del bucle Do, con lo que termina la secuencia.

¿Realmente obtendremos una tabla con una fila para cada día del mes de abril? Inténtelo y compruébelo por sí mismo. Y si aún piensa en una forma mejor de realizar esta tarea, envíe su solución a Community-Submitted Scripts Center (en inglés). Según nuestros cálculos, con ello sería una de los 950 millones de personas que han ideado una solución mejor, o más rápida o más fácil que los chicos del scripting. ¡Por descontado una compañía muy selecta!


Para más Información

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

Arriba Arriba