You are on page 1of 37

Curso de Visual Basic Para Aplicaciones

Como automatizar tareas y programar cualquier documento u hoja de clculo MS Office


Autores:

Bradanovic Tomas

Abstract
Curso para principiantes, a partir de cero, no se requiere de ningn conocimiento previo aparte de saber usar Word y Excel en sus funciones bsicas

Antes de empezar
Dale un vistazo a mi poltica sobre las consultas que puede resultar til de conocer.

Ahora si, partamos de cero


Visual Basic desde cero? y en unas pocas lecciones simples que cualquiera puede seguir?. Yo creo que se puede. De hecho la mayora aprendemos a programar as, lo que cuesta es la partida y eso es lo que pretendo entregar en este pequeo curso. Primero, para hacer programas en Visual Basic necesitamos el entorno de programacin en cualquiera de sus versiones. Pero si tenemos el Office 97 tambin podemos hacer programas sin necesidad de comprar el Visual Basic. Basta con entrar desde el Word 97 y tendremos el entorno del VB5.0 practicamente completo. Para efectos prcticos eso es lo que usaremos para aprender a programar en VB. As abriremos el Word 97 y escogeremos Herramientas, Macros, Editor de Visual Basic y aparecer lo siguiente:

Explorador de proyectos. El explorador de proyectos es una herramienta de exploracin y gestin que muestra una lista jerrquica de cada proyecto abierto. Tambin muestra cada una de las componentes asociadas con los proyectos, como los documentos de Word, formularios, mdulos de clase y referencias. En palabras sencillas hay que dejarlo tal como est. A medida que agreguemos objetos a nuestro progranma irn apareciendo en el explorador y nos servir para movernos de un componente a otro. Ventana de propiedades. La ventana de Propiedades muestra las propiedades para el objeto activo (Formulario de usuario o control). Ofrece una manera visual de configurar y modificar propiedades. En la ventana de propiedades , las propiedades se pueden listar alfabticamente o por categoras. En palabras sencillas, cuando agregamos un objeto este tiene varias propiedades como su color, tamao, tipo de letra, etc. En esta ventana podemos cambiar las propiedades del objeto activo (iluminado) en ese momento. Barra de herramientas. Es donde aparecen los botones para las funciones mas usadas, esta justo abajo de la Barra de mens que tiene los mens con todas las opciones del Visual BAsic Area de trabajo. Es donde colocamos nuestros objetos (Formularios o controles) y les agregamos cdigo Como se hacen los programas en Visual Basic: Los programas en Visual Basic se hacen en dos etapas a) Se dibujan las pantallas b) Se coloca cdigo a los objetos

As de simple, con esto tenemos toda la teora necesaria para programar en VB, parece chiste pero es en serio. Cuando estudi computacin por primera vez (fin de los 70, poca del Fortran) mi primer programa fue uno de conversin de dlares a pesos. Siempre que he aprendido un lenguaje comienzo haciendo eso ya que permite aprender las funciones basicas ms usadas en la mayora de los programas de la vida real, ingreso de datos, clculo, despliegue (salida) de datos. As, nuestro primer programa sera un CONVERTIDOR DE DOLARES A PESOS. Manos a la obra con el paso a)! dibujaremos las pantallas. Las pantallas en VB se llaman Formularios de Usuario, asi es que procedemos a Insertar, UserForm (usando la barra de mens), nos aparece lo siguiente:

Aparece en nuestra Area de trabajo un formulario llamado UserForm1 (nombre por defecto) y abajo una caja de herramientas con los componentes que podemos colocar dentro de ese formulario. Fijense que la barra superior de UserForm1 est de color azul (iluminada) lo que indica que es el componente activo en este momento. Ahora experimentemos con las propiedades de la UserForm1. Primero hagamos click en la propiedad Caption y cambiemos el valor por defecto (UserForm!) escribiendo encima de eso Convertidor de Dolares a Pesos). Vean como cambia el ttulo de nuestro formulario. Seguidamente cambiemos la propiedad Back color haciendo click en ella y luego un click sobre el botn con flecha que aparece a la derecha. Aparecer una paleta de colores. Haga click sobre cualquier color y ver como cambia el fondo de nuestro formulario. Busque ms propiedades que le parezcan obvias y cambie sus valores. Si no nota ningn efecto restaure la propiedad a su valor original (con el tiempo se familiarizar con cada una de las propiedades). Si, por esas cosas de la vida se le pierde la caja de herramientas, la podr recuperar fcilmente con Ver Caja de Herramientas de la barra del men. Si no encuentra alguna propiedad (por ejemplo Name recuerde que la ventana de propiedades las muestra en orden alfabetico y por categoras, busque en ambos lados pulsando en la ventana correspondiente. Ahora hay tres clases de controles que usaremos en nuestro proyecto: labels (etiquetas), textboxes (cajas de dialogo o de texto) y un commandbutton (botn de comando), todas estos controles se sacan de la caja de herramientas de abajo del formulario.

Los labels son los marcados con la letra A en la caja de herramientas, haga click sobre el icono y luego coloquese sobre el formulario y dibuje arrastrando el mouse el tamao en que desea que aparezca su label. Luego en la ventana de propiedades cambia la propiedad Caption del primer label escribiendo Dolares en lugar de label1. Tambin puede cambiar la propiedad Name a ldolares (por labeldolares). Repita el procedimiento creando otro label con caption Pesos y nombre lpesos (por labeltpesos). Luego escoja un textbox del la caja de herramientas (el icono con ab) y dibujelo al lado del label ldolares, borrele la propiedad Caption (que quede en blanco) y cambie la propiedad name a tdolares. Con el mismo procedimiento cree un textbox llamado tpesos al lado del label lpesos. Luego arrastre un boton de la caja de herramientas (el rectangulo sin nombre) y dibujelo en el formulario, luego cambiele la propiedad Caption a Borrar. Si ha llegado hasta el punto que muestra la figura ya tiene la mitad del programa listo.

Note que en ste ejemplo cambi la propiedad Backcolor del formulario y la propiedad Font de los labels a Bold y 10 pt. Aqu tenemos nuestra pantalla rudimentariamente dibujada. Ahora nos falta poner el cdigo, para ello debemos pensar que es lo que queremos que haga el programa. En ste caso yo deseoque cuando escriba una cifra en el textbos de dolares aparezca su equivalencia en el textbox pesos y viceversa. O sea que el programa debe actuar cada vez que escribamos algo en uno de los textbox y luego de presionar Enter. En otras palabras tenemos que poner un cdigo a cada uno de los textbox indicando que deseamos que ocurra cada vez que escribimos algo y apretamos Enter. Para poner cdigo en el textbox de tdolares simplemente hacemos doble click sobre l y aparecer la ventana de cdigos con dos ventanillas en la parte superior; la de la izquierda dir ldolares (el nombre del objeto) y en la derecha una lista deplegable con todos los eventos permitidos para ese objeto (change, click, mousedown, etc). De esa lista escogemos el evento Exit (que significa que presionamos la tecla Enter) y escribimos en la ventana el siguiente cdigo: Private Sub tdolares_Exit(ByVal Cancel As MSForms.ReturnBoolean) tpesos.text = Val(tdolares.text) * 500 End Sub

(lo que aparece en negrita lo escribe solo el sistema, hay que escribir nada ms que el texto normal) Es decir que cuando escribimos algo en el textbox llamado tdolares y luego presionamos Enter se calcular el varol equivalente en pesos. Ntese que lo que escribimos en el textbox llamado tdolares queda almacenado en la propiedad tdolares.text,, le extraemos su valor con val(tdolares), multiplicamos este valor por 500 y lo asignamos como propiedad text al textbox llamado tdolares. Al principio puede parecer enredado pero una vez que nos acostumbramos a los objetos a los que les cambiamos sus propiedades esto se convierte en pan comido. Para salir de la ventana de cdigos y volver al formulario simplemente hacemos click en UserForm1 del explorador de proyectos (ventana superior izquierda) Para el otro textbox (tpesos) tambin hacemos doble click, escogemos el evento exit y escribimos: Private Sub tpesos_Exit(ByVal Cancel As MSForms.ReturnBoolean) tdolares.text = Val(tpesos.text) /500 End Sub Finalmente volvemos al formulario y programamos (agregamos cdigo) al botn Borrar haciendo doble click sobre l y escribiendo adivinan que?claro: Private Sub CommandButton1_Click() tdolares.Text = tpesos.Text = End Sub Nuestro primer programa est listo y nuestra ventana de cdigos debe verse ms o menos as: Private Sub CommandButton1_Click() tdolares.Text = tpesos.Text = End Sub Private Sub tdolares_Change() End Sub Private Sub tdolares_Exit(ByVal Cancel As MSForms.ReturnBoolean) tpesos = Val(tdolares) * 500 End Sub Private Sub tpesos_Exit(ByVal Cancel As MSForms.ReturnBoolean) tdolares = Val(tpesos) / 500 End Sub Si est todo correcto no sera mala idea que lo grabaran, haciendo click sobre el icono del diskette. Y lleg el momento de probar nuestra primera obra de arte!. Si se fijan en la barra de herramientas hay tres botones similares a los de una grabadora. Para que parta el programa simplemente presionen el boton correspondiente al Play o bien presionen F5 (da lo mismo). Disfrutenlo!, y si les da error o no les funciona como es debido entretenganse buscando donde est la falla. Ese ha sido mi pasatiempo de los ltimos 5 aos con el VB.

Otra aplicacin muy simple


Imaginen que tenemos una gran hoja de clculo como la de este ejemplo, con datos sobre las universidades chilenas, y nos reculta complicado comparar lod datos de dos universidades porque tenemos que hacer gran desplazamineto en la plantilla. Basta que hagamos un formulario como este

Con tres ComboBox, dos TextBox y dos CommandButtom y le agregamos cdico al evento Form_Activate para que lea y llene los ComboBox al cargar el formulario, luego programamos el CommandButtom1 para que ubique los datos que queremos comparar y los muestre en los TextBox correspondientes. Lo bueno de este ejemplo es que nos muestra como usar los ndices de los ComboBox y como referenciar celdas especficas de una planilla Excel, el cdigo es el siguiente

Ms adelante entendern como funciona, por mientras pueden copiarlo y usarlo como ejercicio, son apenas 22 lneas de cdigo

APRENDER HACIENDO
Algo muy prctico: como hacer un formulario automtico en Word usando VBA Tambin podran entretenerse haciendo algunos Prototipos en Visual Basic
Ahora en serio, de que se trata El Visual Basic para Aplicaciones VBA, es un subconjunto casi completo de VB 6.0 Profesional Edition, que viene incluido GRATIS en los componentes de Microsoft Office 97; Word, Excel, Power Point y Acces. Practicamente cualquier cosa que se pueda programar en VB6.0 se puede hacer tambin dentro de un documento de Office,

con la sola limitacin que el producto final no se puede compilar separadamente del documento, hoja o base de datos en que fue creado. Es decir que se convierte en una macro (super macro mas bien) que se puede instalar o distribuir con solo copiar el documento, presentacin o base de datos. Suena enredado? veamos con un ejemplo. Yo tengo una plantilla de Word llamada egresos.doc. Al abrirlo se ve como un escrito comn y corriente pero que solo tiene un encabezado y una tabla vacia. Pero si miramos la barra de herramientas veremos un botn con el icono cara sonriente. Al hacer click sobre ese icono aparece un programa en Visual Basic dentro del documento. La figura siguiente muestra como vemos el documento al abrirlo:

Si hacemos click sobre el botn de cara sonriente aparece la siguiente pantalla dentro del documento

Para los que conocen Visual Basic esta pantalla les parecera familiar; es una form, con textbox para entrada de datos y con un botn de comando. La diferencia es que est codificada DENTRO de un documento de Word y nos permitir crear un comprobante contable de manera muy sencilla para el operador Y al terminar de ingresar los datos se generar un comprobante de egreso como se muestra a continuacin

Se va entendiendo?. Como pueden ver el potencial es enorme, ya que se programan aplicaciones con las que prcticamente todos los usuarios estn familiarizados. Adicionalmente la programacin en si es sencillsima para cualquiera que conozca el Visual Basic. Y como se hace?. Bueno, como se programa en VBA ser el tema de las siguientes lecciones de ste curso rpido Puedes bajarte el archivo egresos.dot desde aqu

Comenzando a programar en VBA


Nota Preliminar: Al abrir macros en Word97 aparece una pantalla de advertencia sobre la posibilidad de virus (como VBA es un lenguaje completo, ahora se puede encapsular facilmente un virus dentro de un documento de Office), les recomiendo que hagan caso omiso de esta advertencia y coloquen el botn para permitir la ejecucin de macros para este documento. Para hacer un programa en VBA necesitas desde el Office 97 en adelante. En este ejemplo programaremos un documento de Word. Para ello solo debemos abrir un nuevo documento de Word y escoger Herramientas, Macros, Editor de Visual Basic, con lo que aparecer una pantalla como esta:

Para los que conocen el VB 6.0 esta pantalla les resultar muy familiar, para los que conocen versiones anteriores es lo mismo, solo que el mapa del proyecto y la ventana de propiedades estn a la izquierda siempre visibles. La primera diferencia con VB esta en el mapa del proyecto que aparece en la ventana superior izquierda y muestra un rbol de directorios con Normal, Project(Documento1), Referencia a Microsoft Word, etc..(a veces aparecen ms ramas segn la instalacin del Office). En esta ventana nosotros escogemos donde se va a guardar nuestro proyecto y tenemos dos alternativas; si nos ubicamos en Normal nuestro macro ser accesible para cualquier documento que abramos en Word. Si nos ubicamos en Project(Documento 1) el macro solo estar disponible para el documento especfico que estamos creando. En nuesto ejemplo grabaremos un macro solo en nuestro documento, por lo que nos colocamos en Project(Documento 1). El primer paso al crear un macro en VBA es darle un nombre, para ello tenemos que ir a Insertar, Modulo del men con lo cual aparecer en el mapa de proyecto un Modulo1. Nos vamos a la ventana de propiedades (abajo izquierda) y le cambiamos la propiedad (Name) a Prueba1 (podemos colocar cualquier nombre por supuesto). Este ser el nombre de llamada del macro. Hacemos doble click sobre el y aparecer la ventana para ingresar el cdigo de la macro. En nuestro ejemplo (as como en la mayora de los casos) queremos que nuestro programamuestre una Form al iniciarse as es que escribimos: Sub prueba1() UserForm1.show End Sub Luego tenemos que crear nuestra form, usando Insertar, UserForm, con lo que aparecer lo siguiente:

Con las herramientas de la caja arrastramos las textbox, labels y CommandButtom para obtener una form del tipo

Para hacerlo rpidamente usamos las opciones Copiar, Pegar, Formato, Alinear a la izquierda, Espacio Horizontal, Igualar, etc.. Una vez que tenemos creada nuestra UserForm pasamos a programarla, primero haremos click sobre cada text box para que las entradas se conviertan automticamente a maysculas al colocar Enter. Para ello hacemos doble click sobrte las textbox, nos cambiamos a Exit y ponemos Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) TextBox1.Text = UCase(TextBox1.Text) End Sub Nota para los que conocen versiones anteriores al VB5.0: En las versiones anteriores si queramos que el foco pasara hacia el textbox de abajo al colocar Enter usabamos Keypress y luego hacamos un If Keyascii=13 then. En la versin 5.0 se usa Exit y el foco pasa automticamente hacia abajo. Otra importante diferencia con las versiones anteriores es que el rden en que pasa el foco al colocar Enter puede ser especificado usando Ver, Orden de Tabulacin. As puedes colocar el orden como quieras pasando hacia arriba o abajo los distintos elementos del UserForm. Para poder usar esta opcin tiene que estar la UserForm visible (no la ventana de cdigos). Bueno, hasta aqu no hay ninguna novedad con respecto a VB5.0. La programacin especfica de VBA la colocaremos en el botn OK (CommandButton1). Hacemos doble click sobre este botn y escribimos: Private Sub CommandButton1_Click() With Selection . Font.Size = Val(10) . ParagraphFormat.LineSpacingRule = wdLineSpaceSingle . TypeParagraph . Font.Name = arial black . ParagraphFormat.Alignment = wdAlignParagraphCenter . TypeText Text:=vbTab & Programa de Prueba . ParagraphFormat.Alignment = wdAlignParagraphLeft . TypeParagraph . TypeParagraph

Font.Name = Arial TypeText Text:=vbTab & NOMBRE & vbTab & TextBox1.Text TypeParagraph TypeText Text:=vbTab & DIRECCION & vbTab & TextBox2.Text . TypeParagraph . TypeText Text:=vbTab & TELEFONO & vbTab & TextBox3.Text . TypeParagraph . TypeParagraph End With End Sub . Y ya tenemos listo nuestro primer programa!. ahora lo grabamos haciendo click en el icono del diskette de la barra de herramientas del VBA y le colocamos un nombre (en este caso yo lo grab como Prueba 1 VBA) Luego cerramos todo.. Para ejecutarlo ingresamos abrimos el documento Prueba 1 VBA.doc y escogemos Herramientas, Macros, Macros, iluminamos el macro prueba1 y hacemos doble click. Deber aparecer la pantalla siguiente:

Al ingresar los datos y hacer click en el botn Ok, se crear el documento. Este ejemplo es muy bsico por su propsito didctico. Despus de pulsar el Botn Ok tendremos que cerrar la UserForm1 Clickeando en la X de la esquina superior, posteriormente veremos que prcticamente todo puede ser automatizado. Lo ms bonito de todo esto es que si copian el documento prueba 1 de VBA.doc en un pendrive USB y lo colocan en CUALQUIER computador que tenga Office 97, el programa funciona igual sin importar cuan complejo sea siempre y cuando no use componentes especiales como veremos ms adelante. Es decir CERO trabajo de instalacin. Les adjunto este primer documento programado, para que lo examinen y lo comparen con el que han hecho ustedes mismos en este ejercicio. Eso si cambienle el nombre si lo van a grabar en el mismo directorio del disco duro donde escribirn la prueba, para evitar regrabarlo..

Bueno, ya hicimos un programa y seguramente tendrn serias dudas por los chorizos de cdigo del tipo .ParagraphFormat.Alignment = wdAlignParagraphCente y otras lindezas que colocamos en el botn Ok. La pregunta del milln es tendr que aprenderme ESOS comandos antes de programar en VBA?, la respuesta es que afortunadamente no es necesario. No hay que saber nada de la Microsoft Foundation Classes para programar pues hay un truco muy sencillo que nos entrega de manera automtica todos los comandos que necesitemos. Pero eso ser tema de la prxima sesin. Espero que todo les resulte Ok y no se hayan aburrido

Como programar en VBA sin conocer el modelo de objetos


La complejidad del cdigo en VBA (entendiendo por complejidad el uso de instrucciones largusimas y muy estructuradas en lugar de instrucciones simples) nace de la decisin de Microsoft de convertir sus programas en modelos de objetos permitiendo un cdigo ms limpio con una sntaxis y semntica ms consistente. Una eleccin poco afortunada para los programadores antiguos que nos complica la codificacin, en fin, las nuevas generaciones se sentirn ms confortables con esto supongo.. La idea de estudiar el modelo de objetos de Microsoft (la Microsoft Foundation Classes) me parece una tontera para un programador casual (como yo), ms an considerando que cuando se llega a dominar algo tan especializado, esto ya comienza a caer en desuso por obsolecencia. Todo este largo prembulo para indicarles un truco que les permitir conocer el cdigo para programar cualquier cosa en VBA sin necesidad de estudiar nada (que rico no?). Un ejemplo prctico: en nuestro ejercicio anterior abrimos una form que nos permiti ingresar nombre, direccin y apellido y luego los escribi en un formulario del Word. Ahora vamos a colocar un encabezado con el nombre y un pie de pgina con la leyenda pgina # de #. Para conocer el cdigo hacemos lo siguiente: Abrimos una pgina en blanco y nos vamos a Herramientas, Macros, Grabar nueva macro y Aceptar (quedar con el nombre por defecto Macro1). Aparecer una imagen de grabadora que indica que estamos grabando la macro. Entonces nos vamos a Ver, Encabezados y pies de pgina, escribimos el encabezado y el pie de la manera deseada y apretamos el botn que detiene la grabadora. Luego nos vamos a Herramientas, Macros, Macros, Editar y all tenemos TODO el codigo, listo para ser cortado y pegado en nuestra aplicacin, que en ste caso es: Sub Macro2() Macro2 Macro Macro grabada el 24-12-98 por TOMAS BRADANOVIC If ActiveWindow.View.SplitSpecial <> wdPaneNone Then ActiveWindow.Panes(2).Close End If If ActiveWindow.ActivePane.View.Type = wdNormalView Or ActiveWindow. _ ActivePane.View.Type = wdOutlineView Or ActiveWindow.ActivePane.View.Type _ = wdMasterView Then ActiveWindow.ActivePane.View.Type = wdPageView End If ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader Selection.TypeText Text:= _ Toms Bradanovic, Consultora en Proyectos de Inversin Pbl Selection.TypeText Text:=ica Selection.TypeParagraph Selection.HeaderFooter.Shapes.AddLine(72#, 93.6, 540#, 93.6).Select If Selection.HeaderFooter.IsHeader = True Then ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageFooter Else ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader End If Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldNumPages Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldNumPages Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldPage NormalTemplate.AutoTextEntries(Pgina X de Y).Insert Where:=Selection. _ Range

ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument End Sub Que tal?, ahora podran por ejemplo sustituir el string Toms Bradanovic. por TextBox1.Text o cualquier otra variable y el asunto funciona igual. Como ejercicio (y entretencin) les recomiendo que obtengan con ste mtodo el cdigo para colocar doble espacio, para imprimir, para modificar el tamao de papel, el tipo y seteo de la impresora, los tipos de letraen fin todo lo que se les ocurra, luego pueden cortar y pegar el cdigo en el ejercicio de la clase anterior a ver como les queda. Bueno, con este dato yo creo que tienen entretencin para rato y adems es una manera indolora de aprenderse el modelo de objetos de Microsoft, practiquen y diviertanse

Cdigo para tareas usuales


Del feedback recibido (y que agradezco mucho) he notado que incluso personas que no conocen el Visual Basic pueden beneficiarse del VBA usando sus caractersticas bsicas. Para ellos les incluyo un resumen de cdigos que pueden cortar y pegar en sus programas para las tareas que se usan frecuentemente. Aqu van: 1. Para que el form desaparezca del documento despus de clickear un botn. Al final del cdigo del botn se agrega lo siguiente: Unload UserForm1 (o, el nombre de la form que estan usando, si lo han cambiado) 2. Para que un documento se imprima automticamente despus de clickear un botn. Se agrega el siguiente cdigo: Application.PrintOut FileName:=Permiso.doc, Range:=wdPrintCurrentPage, Item:= _ wdPrintDocumentContent, Copies:=1, Pages:=", PageType:=wdPrintAllPages, _ Collate:=True, Background:=True, PrintToFile:=False Selection.WholeStory Selection.Delete Unit:=wdCharacter, Count:=1 Unload UserForm1 (en este caso el documento se llama permiso.doc, en lugar de ese nombre se coloca el nombre del documento que estn usando) 3. Para cambiar el tamao y tipo de font Selection.Font.Size = 10 Selection.Font.Name=Arial 4. Para colocar espacio simple, doble, etc. Selection.ParagraphFormat.LineSpacingRule = wdLineSpaceSingle 5. Para alinear a izquierda, derecha, centro o justificado completo Selection.ParagraphFormat.Alignment = wdAlignParagraphJustify (justificado completo) Selection.ParagraphFormat.Alignment = wdAlignParagraphRight (justificado derecha) etc.. 6. Para escribir una linea de texto (con wordwrap automtico)

Selection.TypeText Text:=este texto (imprime la palabra este texto, si la palabra es muy larga hace el wordwrap automticamente) Selection.TypeText Text:=TextBox1.Text (escribe el contenido de TextBox1.Text) 7. Para pasar a la lnea siguiente (equivale a poner enter) Selection.TypeParagraph En general, para saber cualquier cdigo basta con grabar una macro, hacer lo que deseamos codificar y luego examinar la macro en editor de Visual Basic El cdigo aparecer solito! 8. Para no escribir selection a cada rato Si se fijan, muchas instrucciones especificas del VBA empiezan con Selection, para no repetirlo a cada rato se puede usar with end with as: (ojo con los puntitos antes de Font.Size, Font.Name, etc, en esta pantalla no se notan muy bien, pero deben escribirse) With Selection .Font.Size = 10 .Font.Name=Arial End With 9. Como cambiar las propiedades (solo para principiantes) Para los que no manejan el Visual Basic, pero ya han hecho el primer ejemplo, les propongo que exploren la ventana de propiedades que aparece en la esquina inferior izquierda. Cada vez que seleccionamos un objeto de nuestra form (por ejemplo una textbox, un commandbutton, a la propia userform) cambia la lista de propiedades. Modificando valores de esta lista tambin podemnos modificar el aspecto y comportamiento de los objetos. Por ejemplo si hacemos doble click en la propiedad backcolor podemos cambiar el color de fondo del objeto. Con forecolor cambiamos el color del texto, con font cambiamos el font y sus caractersticas, etc. Yo mismo aprend a programar en Visual Basic jugando con las propiedades, es muy fcil e interesante explorar lo que significa cada propiedad. En Visual Basic cada objeto tiene propiedades (colores, altura, posicin, visible o invisible, y otras que dependen del objeto) y eventos. Los eventos aparecen cuando hacemos doble click sobre un objeto. En la parte superior derecha de la ventana de programacin aparece la lista de eventos. Al hacer doble click aparece el evento por defecto (p.ej si es un botn el evento por defecto es click, si es un textbox, el evento por defecto es change, etc.). Para programar un objeto escogemos el evento de la lista y luego escribimos el cdigo en la pantalla. Por eso en nuestro primer ejemplo programamos el Commandbutton1 con el evento click (es decir cuando se haga click con el mouse sobre este objeto, ejecute el siguiente cdigo) Bueno, a la prxima colocar algo sobre VBA con Excell, nos vemos (y si no nos vemos vamos al oculista), chau

Tal vez ya es tiempo de revisar unas pocas Buenas Prcticas de Programacin Un Ejemplo Sencillo de Programacin en Excel
Siguiendo el esquema de introducir el VBA mediante ejemplos simples y fciles de reproducir, esta vez les presento una macro que permite crar un documento tipo factura en una hoja de clculo. Se trata de un ejemplo rudimentario al que se le han sacado todos los detalles para hacer ms fcil su comprensin y se puede programar con facilidad en un rato.

Primero que nada abrimos el Excel y entramos al editor de Visual Basic con Alt-F11 (esta es una forma abreviada que nos evita usar Herramienta, Macro, Editor de Visual Basic). Luego insertamos un nuevo modulo (mantenemos el nombre por defecto Mdulo1) y escribimos en el: Sub ejemplo() UserForm1.Show End Sub Enseguida insertamos un nuevo formulario (mantenemos el nombre por defecto UserForm1) y le creamos 6 textbox, 6 labels y 1 botn de comando como muestra la figura:

Esta vez me pondre un poco ms ordenado para colocar los nombres, a los labels les coloco los siguientes nombres: fecha, cliente, direccion, RUT, articulo, precio, cantidad (modificando su propiedad Name en la ventana de propiedades abajo a la izquierda). A los textbox les coloco los nombres de : tfecha, tcliente, tdireccion, trut, tarticulo, tprecio, tcantidad. Luego usando Formato, Igualar Tamao, Ambos, dejo a todos los textbox del mismo tamao y usando Formato, Alinear, Izquierda los dejo bien alineados. Tambin puedo usar Espaciado Vertical, Igualar para que queden bien espaciados. Enseguida usando Ver, Orden de tabulacin me aseguro que cada vez que coloco enter el foco se corra correctamente al textbox que corresponda. Asi el ordern de tabulacin debe quedar: tcliente, tdireccion, trut, tarticulo, tcantidad y luego todos los dems en cualquier orden. Ahora haciendo doble click sobre el commandbutton1 lo programo (evento click) de manera que quede as: Private Sub CommandButton1_Click() Hoja1.Cells(linea, 2) = tarticulo.Text Hoja1.Cells(linea, 3) = Val(tprecio.Text) Hoja1.Cells(linea, 4) = Val(tcantidad.Text) Hoja1.Cells(linea, 5) = Val(tprecio.Text) * Val(tcantidad.Text) Range(E19).Select ActiveCell.FormulaR1C1 = =SUM(R[-10]C:R[-1]C) Range(E20).Select tarticulo.Text = tprecio.Text = tcantidad.Text = linea = linea + 1 End Sub

Como se ve en el cdigo anterior, para llenar la celda A1 por ejemplo usamos Hoja1.Cells(1,1)=texto, para la A2 Hoja1.Cells(2,1) etc. Noten que podemos llenar no solo la hoja activa en este momento sino que culquiera del libro activo (recuerden que en excel un libro puede tener varias hojas simultaneamente). La variable linea la inicializo cuando se carga el UserForm1 al valor 9 pues los datos deben escribirse a partir de la linea 9. Luego tena que calcular el total sumando la columna de los subtotales. Como yo no sabia el cdigo para programar una suma, simplemente me fui a Herramientas, Macro, Grabar Macro y luego hice la operacin de forma manual (escribiendo la frmula en la celda deseada). Luego volv a Herramientas, Detener Grabacin y examin el cdigo que apareci en un nuevo mdulo, que era el siguiente: Range(E19).Select ActiveCell.FormulaR1C1 = =SUM(R[-10]C:R[-1]C) Range(E20).Select Lo cort y lo pegue donde corresponda. Finalmente agregu el cdigo que limpia los textos de los textbox tarticulo, tprecio y tcantidad e increment la variable linea en una unidad (para que los siguientes datos se graben una linea ms abajo) Enseguida hice doble click sobre el UserForm1 y program algunos valores para cuando se cargue el Form (initialize), colocando lo siguiente: linea = 9 cliente.Caption = Nombre direccion.Caption = direccion articulo.Caption = Articulo precio.Caption = precio cantidad.Caption = cantidad RUT.Caption = RUT Columns(B:B).ColumnWidth = 8 Columns(B:B).ColumnWidth = 45 Columns(C:C).ColumnWidth = 10 Columns(D:D).ColumnWidth = 10 Columns(E:E).ColumnWidth = 10 Inicializ el valor de linea=9, coloqu los valores caption a los label (tambin podra haberlo hecho directamente modificasndoles la propiedad, us esta forma solo para mostrarla) y defin los anchos de las columnas. Luego borr el macro recientemente creado Iluminando Modulo2, Archivo, quitar Modulo 2 y No exportar, volv a Herramientas, Macros, Grabar Macro y Escrib los ttulos, coloqu los cuadriculados, centrados, negrita, etc. Luego Herramientas, Macros, Detener Grabacin y cort y pegu a continuacin el cdigo resultante que fue el siguiente: Macro grabada el 15-08-99 por TOMAS BRADANOVIC Range(C1).Select ActiveCell.FormulaR1C1 = FACTURA Range(A3).Select ActiveCell.FormulaR1C1 = Fecha Range(A4).Select ActiveCell.FormulaR1C1 = Cliente Range(A5).Select ActiveCell.FormulaR1C1 = Rut Range(A6).Select ActiveCell.FormulaR1C1 = Direccin Range(B8).Select ActiveCell.FormulaR1C1 = Artculo Range(C8).Select ActiveCell.FormulaR1C1 = Precio Unitario Range(D8).Select ActiveCell.FormulaR1C1 = Cantidad Range(E8).Select ActiveCell.FormulaR1C1 = Subtotal Range(B8).Select Range(A3:B6).Select Selection.Borders(xlDiagonalDown).LineStyle = xlNone

Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlInsideVertical) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlInsideHorizontal) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With Range(B8:E18).Select Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlInsideVertical) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlInsideHorizontal) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With Range(E19).Select Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone

With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With Range(D19).Select ActiveCell.FormulaR1C1 = Total Range(D2).Select Range(B3).Select With Selection .HorizontalAlignment = xlLeft .VerticalAlignment = xlBottom .WrapText = False .Orientation = 0 .IndentLevel = 0 .ShrinkToFit = False .MergeCells = False End With Range(C8:E8).Select With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlBottom .WrapText = False .Orientation = 0 .ShrinkToFit = False .MergeCells = False End With Range(B8:E8).Select Selection.Font.Bold = True Range(A3:A6).Select Selection.Font.Bold = True Range(B1).Select With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlBottom .WrapText = False .Orientation = 0 .ShrinkToFit = False .MergeCells = False End With Selection.Font.Bold = True Como nos ahorra trabajo la grabadora de macros!. Con Archivo, Quitar Mdulo, borramos el macro recin creado (para que nos quede un cdigo limpio) En fin, el ejemplo est casi completo, solo falta declarar la variable linea como global para que pueda traspasar su valor desde initialize hasta el CommandButton1 sin problemas. Para ello creamos un mdulo y escribimos global linea

Tambin podemos aprovechar de colocar algunos comentarios con propaganda o lo que se nos ocurra en ste mdulo. Y ya tenemos listo nuestro ejemplo, solo falta programar un atajo para lanzarlo de manera rpida. En el Excel nos vamos a Herramientas, Macros, Macros, Opciones y programamos las teclas Ctrl-E para lanzar el macro. Cada vez que pulsemos Ctrl-E el macro parte. El ejemplo completo est en la hoja Ejemplo7.xls que se adjunta a esta leccin. Ahora les dejo las siguientes tareas para la casa:

agregar validaciones tales como largo total permitido, tipo (caracter o numerico), formatear los datos numricos, etc. grabar cada una de las entradas en una base de datos Acces, para esto supongo que solo hay que agregar algo de cdigo de inicializacin al Modulo2 y ajustar las propiedades ControlSource y ControlTipText.

El que las haga que me la mande y se hace famoso pues lo publicamos ac mismo.

Algunos trucos de Microsoft para VBA con Excel


En algunos detalles el VBA para Excel no es muy obvio que digamos. Buscando en el help de Microsoft me encontr con estos datos que me fueron bastante tiles en mi trabajo. En algunos adjunto un comentario de con mi aplicacin prctica:

Algunas funciones de hoja de clculo no tienen utilidad en Visual Basic. Por ejemplo, la funcin Concatenar no se necesita, ya que en Visual Basic puede usar el operador & para unir varios valores de texto. o Dim miRango As Range o Set miRango = Worksheets(Hoja1).Range(A1:C10) Llamar a una funcin de hoja de clculo desde Visual Basic: En Visual Basic, las funciones de hoja de calculo de Microsoft Excel pueden ejecutarse mediante el objeto WorksheetFunction. El siguiente procedimiento Sub usa la funcin Mn para obtener el valor ms pequeo de un rango de celdas. En primer lugar, se declara la variable miRango como un objeto Range y, a continuacin, se establece como el rango A1:C10 de la Hoja1. Otra variable, respuesta, se asigna al resultado de aplicar la funcin Mn a miRango. Por ltimo, el valor de respuesta se muestra en un cuadro de mensaje. Sub UseFunction() respuesta = Application.WorksheetFunction.Min(miRango)

MsgBox respuesta End Sub Comentario: el sentido comn nos dira que podemos inclur la funcin de Excel en nuestro programa VBA sin ms pero no es as, hay que definir primero el rango (Set miRango en este ejemplo) y luego colocar la funcin usando Application.WorksheetFunction. Por ejemplo con: Set miRango = Worksheets(Hoja2).Range(B11:B21) Hoja2.Cells(22, 2) = Application.WorksheetFunction.Sum(miRango) Set miRango = Worksheets(Hoja2).Range(C11:C21) Hoja2.Cells(22, 3) = Application.WorksheetFunction.Sum(miRango) Se suman las celdas C11 a la C21 y el resultado se coloca en la celda(22,3) miVar = Application.WorksheetFunction _ Si usa una funcin de hoja de clculo que requiere como argumento una referencia de rango, deber especificar un objeto Range. Por ejemplo, puede usar la funcin de hoja de clculo Coincidir para efectuar una bsqueda en un rango de celdas. En una celda de hoja de clculo, podra introducir una frmula como

=COINCIDIR(9;A1:A10;0). No obstante, en un procedimiento de Visual Basic, para obtener el mismo resultado debe especificar un objeto Range. Sub FindFirst() . Match(9, Worksheets(1).Range(A1:A10), 0) MsgBox miVar End Sub Nota Las funciones de Visual Basic no usan el calificador WorksheetFunction. Una funcin puede tener el mismo nombre que una funcin de Microsoft Excel y, sin embargo, dar otros resultados. Por ejemplo, Application.WorksheetFunction.Log y Log dan resultados diferentes.

Insertar una funcin de hoja de clculo en una celda Para insertar una funcin de hoja de clculo en una celda, especifique la funcin como el valor de la propiedad Formula del objeto Range correspondiente. En el siguiente ejemplo, la funcin ALEATORIO (que genera un nmero aleatorio) se asigna a la propiedad Formula del rango A1:B3 de la Hoja1 del libro activo. Sub InsertFormula() Worksheets(Hoja1).Range(A1:B3).Formula = =ALEATORIO() End Sub

Puede identificar las hojas por su nombre, utilizando las propiedades Worksheets y Charts. Las siguientes instrucciones activan varias hojas del libro activo. Worksheets(Hoja1).Activate Charts(Grfico1).Activate DialogSheets(Dilogo1).Activate Puede utilizar la propiedad Sheets para devolver una hoja de clculo, de grficos, de mdulo o de cuadro de dilogo, incluidos todos en el conjunto Sheets. El siguiente ejemplo activa la hoja denominada Grfico1 del libro activo. Sub ActivarGrfico() Sheets(Grfico1).Activate End Sub Nota Los grficos incrustados en una hoja de clculo son miembros del grupo ChartObjects, aunque los grficos que poseen sus propias hojas pertenecen al conjunto Charts. Puede hacer referencia a una celda o rango de celdas del estilo de referencia A1 utilizando el mtodo Range. El siguiente procedimiento Sub cambia el formato de las celdas A1:D5 a negrita. Sub FormatoRango() Workbooks(Libro1).Sheets(Hoja1).Range(A1:D5) _Font.Bold = True End Sub La siguiente tabla muestra algunas referencias de estilo A1 utilizando el mtodo Range. Referencia Significado Range(A1) Celda A1 Range(A1:B5) Celdas de la A1 a la B5 Range(C5:D9,G9:H16) Seleccin de varias reas Range(A:A) Columna A Range(1:1) Fila uno Range(A:C) Columnas de la A a la C Range(1:5) Filas de la uno a la cinco Range(1:1,3:3,8:8) Filas uno, tres y ocho Range(A:A,C:C,F:F) Columnas A, C y F

Al utilizar Visual Basic, con frecuencia necesitar ejecutar el mismo bloque de instrucciones en cada una de las celdas de un rango. Para ello, combine una instruccin de repeticin y uno o ms mtodos para identificar cada celda, una a la vez, y ejecutar la operacin. Una manera de ejecutar un bucle en un rango es utilizar el bucle ForNext con la propiedad Cells. Al utilizar la propiedad Cells, puede sustituir el contador del bucle, u otras variables o expresiones, por el nmero de ndice de las celdas. En el siguiente ejemplo se sustituye la variable contador por el ndice de fila. El procedimiento ejecuta un bucle en el rango C1:C20, estableciendo en 0 (cero) cualquier nmero cuyo valor absoluto sea menor que 0.01. Sub RedondeoACero1() For contador = 1 To 20 Set Celda_a = Worksheets(Hoja1).Cells(contador, 3) If Abs(Celda_a.Value) < 0.01 Then Celda_a.Value = 0 Next contador End Sub Otra manera sencilla de ejecutar un bucle en un rango es utilizar el bucle For EachNext en el conjunto de celdas devuelto por el mtodo Range. Visual Basic establece automticamente una variable de objeto para la siguiente celda cada vez que se ejecuta el bucle. El siguiente procedimiento realiza un bucle en el rango A1:D20, estableciendo en 0 (cero) cualquier nmero cuyo valor absoluto sea menor que 0.01. Sub RedondeoACero2() For Each c In Worksheets(Hoja1).Range(A1:D10).Cells If Abs(c.Value) < 0.01 Then c.Value = 0 Next End Sub Comentario: esto sirve, por ejemplo para programar la suma de dos columnas (B y C, desde la fila 11 a la 22 en este ejemplo) as Dim miRango As Range For contador = 11 To 22 Set celda_a = Worksheets(Hoja2).Cells(contador, 2) Set celda_b = Worksheets(Hoja2).Cells(contador, 3) Hoja2.Cells(contador, 4) = celda_a +celda_b Next contador Si no conoce los lmites del rango en que desea ejecutar el bucle, puede utilizar la propiedad CurrentRegion para devolver el rango que rodea la celda activa. Por ejemplo, el siguiente procedimiento, cuando se ejecuta desde una hoja de clculo, ejecuta un bucle en el rango que rodea la celda activa, estableciendo en 0 (cero) todos los nmeros cuyo valor absoluto sea menor que 0.01. Sub RedondeoACero3() For Each c In ActiveCell.CurrentRegion.Cells If Abs(c.Value) < 0.01 Then c.Value = 0 Next End Sub Al aplicar la propiedad Cells a una hoja de clculo sin especificar un nmero de ndice, el mtodo devuelve un objeto Range que representa todas las celdas de la hoja de clculo. El siguiente procedimiento Sub borra el contenido de todas las celdas de la Hoja1 del libro activo. Sub BorrarHoja() Worksheets(Hoja1).Cells.ClearContents End Sub Una manera de trabajar con una celda relacionada con otra es utilizar la propiedad Offset. El siguiente ejemplo asigna un formato de doble subrayado al contenido de la celda situada una fila ms abajo y a tres columnas de la hoja de clculo activa. Sub Subrayar() ActiveCell.Offset(1, 3).Font.Underline = xlDouble End Sub

Nota Puede grabar macros que utilicen la propiedad Offset en lugar en referencias absolutas. En el men Herramientas, seale Grabar macro y, a continuacin, haga clic en Usar referencias relativas. Para ejecutar un bucle en un rango de celdas, utilice en el rango una variable con la propiedad Cells. El siguiente ejemplo rellena las primeras 20 celdas de la tercera columna con valores entre 5 y 100, en incrementos de 5. La variable contador se utiliza como ndice de fila para la propiedad Cells. Sub BucleAtravs() Dim contador As Integer For contador = 1 To 20 Worksheets(Hoja1).Cells(contador, 3).Value = contador * 5 Next contador End Sub Si establece una variable de objeto para un objeto Range, puede manipular fcilmente el rango utilizando el nombre de la variable. El siguiente procedimiento crea la variable de objeto miRango y, a continuacin, asigna la variable al rango A1:D5 de la Hoja1 del libro activo. Las instrucciones posteriores modifican las propiedades del rango, sustituyendo el nombre de la variable por el objeto del rango. Sub Aleatorio() Dim miRango As Range Set miRango = Worksheets(Hoja1).Range(A1:D5) miRango.Formula = =ALEATORIO() miRango.Font.Bold = True End Sub Utilice la funcin Array para identificar un grupo de hojas. El siguiente ejemplo selecciona tres hojas del libro activo. Sub Varias() Worksheets(Array(Hoja1, Hoja2, Hoja4)).Select End Sub Utilice la propiedad Rows o Columns para trabajar con filas o columnas enteras. Estas propiedades devuelven un objeto Range que representa un rango de celdas. En el siguiente ejemplo, Rows(1) devuelve la fila uno de la Hoja1. A continuacin, la propiedad Bold del objeto Font del rango se establece en True. Sub FilaNegrita() Worksheets(Hoja1).Rows(1).Font.Bold = True End Sub La siguiente tabla muestra algunas referencias de fila y columna, utilizando las propiedades Rows y Columns. Referencia Significado Rows(1) Fila uno Rows Todas las filas de la hoja de clculo Columns(1) Columna uno Columns(A) Columna uno Columns Todas las columnas de la hoja de clculo Para trabajar con varias filas o columnas al mismo tiempo, cree una variable de objeto y utilice el mtodo Union, combinando varias llamadas a la propiedad Rows o Columns. El siguiente ejemplo cambia a negrita el formato de las filas uno, tres y cinco de la hoja de clculo uno del libro activo. Sub VariasFilas() Worksheets(Hoja1).Activate Dim miUnin As Range Set miUnin = Union(Rows(1), Rows(3), Rows(5))

miUnin.Font.Bold = True End Sub Bueno, creo que con eso hay para entretenerse durante un tiempo, espero que practiquen y que les sirva, Suerte!

Combinar macros con campos de formulario en Word


Hace poco tuve un problema prctico, necesitaba crear alrededor de 50 plantillas de Word y la sola idea de programar lnea a lnea usando Select.Typetext Text:= me daba dolor de estmago. No sera mejor escribir las plantillas en Word e insertar los campos de formulario, que luego se conectaran con la una macro de entrada de datos?. Eso me ahorrara mucho trabajo y permitira hacer una macro estndar que sirviese para varias plantillas con solo modificaciones menores. Pero no encontraba la forma de hacerlo, finalmente se me ocurri repasar el curso de un tal Toms Bradanovic y ahi encontre la solucin, como lo hice? siguiendo mis propios consejos grab un macro y luego estudi el cdigo generado. Le saqu las lneas superfluas y listo. Entrando en materia el procedimiento es el siguiente: Abrir una plantilla con el documento que queremos crear, usando Ver, Barras de Herramientas, colocamos las barras Visual Basic y Formularios, luego escrib normalmente el documento y usando el botn para insertar campo de formulario, fui colocando los campos variables, aqu est el ejemplo. Noten las barras de Visual Basic y de formularios en la ltima fila, con el primer botn (ab) de la barra de formularios se insertan los campos:

Una vez escrito e insertados los campos le ponemos nombres, seleccionando cada campo, click con botn derecho, Propiedades, Nombre. As los campos quedan con nombres descriptivos como: tribunal, ciudad, fecha, medico, proceso, fallecido, etc. Luego hacemos click sobre la barra de Visual Basic para entrar al editor, y creamos la ventana estndar de ingreso de datos as

Luego programamos la form con el evento initialize con Private Sub UserForm_Initialize() UserForm1.Caption = Autopsia Label1.Caption = MEDICO combo1 Label2.Caption = JUEZ combo2 Label3.Caption = SECRETARIO combo3 Label4.Caption = MOVIMIENTO combo4 Label5.Caption = FECHA textbox1 Label6.Caption = FALLECIDO textbox2 Label7.Caption = ROL textbox3 Label8.Caption = textbox4 Label9.Caption = textbox5 Label10.Caption = textbox6 TextBox4.Visible = False TextBox5.Visible = False TextBox6.Visible = False TextBox1.Text = Date ComboBox4.Text = SUM SOLICITA INF AUTOPSIA ComboBox1.AddItem CARLOS VILLAVICENCIO SILVA ComboBox1.AddItem ADRIANA BARRIENTOS ESPINOZA ComboBox2.AddItem JORGE QUIONES GARAT ComboBox2.AddItem HECTOR GUTIERREZ MASSARDO ComboBox3.AddItem HECTOR GUTIERREZ MASSARDO ComboBox3.AddItem JULIO MAZUELOS RAMOS ComboBox1.Text = ComboBox1.List(0) ComboBox2.Text = ComboBox2.List(0) ComboBox3.Text = ComboBox3.List(0) End Sub Y lo importante, en el botn de comando escribimos: Private Sub CommandButton1_Click() Selection.GoTo What:=wdGoToBookmark, Name:=tribunal Selection.TypeText Text:=PRIMER Selection.GoTo What:=wdGoToBookmark, Name:=ciudad Selection.TypeText Text:=ARICA Selection.GoTo What:=wdGoToBookmark, Name:=fecha Selection.TypeText Text:=TextBox1.Text Selection.GoTo What:=wdGoToBookmark, Name:=medico Selection.TypeText Text:=ComboBox1.Text Selection.GoTo What:=wdGoToBookmark, Name:=rol Selection.TypeText Text:=TextBox3.Text Selection.GoTo What:=wdGoToBookmark, Name:=fallecido Selection.TypeText Text:=TextBox2.Text Selection.GoTo What:=wdGoToBookmark, Name:=juez Selection.TypeText Text:=ComboBox2.Text Selection.GoTo What:=wdGoToBookmark, Name:=secretario Selection.TypeText Text:=ComboBox3.Text Selection.GoTo What:=wdGoToBookmark, Name:=medico2 Selection.TypeText Text:=ComboBox1.Text Unload UserForm1 End Sub Como pueden ver, todo se reduce a una instruccin Selection.GoTo What:=wdGoToBookmark, Name:=nombre de variable y luego escribimos en el campo con Selection.TypeText Text:=TextBox2.Text Algunas precauciones al programar plantillas

Si estn programando una plantilla (.dot) en lugar de un documento corriente hay que tener en cuenta que para modificarla debemos usar botn derecho y Abrir, si hacemos doble click no aparecer la plantilla sino un Doc1.doc. Tambin hay que tener cuidado de no probar el programa cuando est abierto como plantilla porque deesaparecern los campos (sern reemplazados) y perders el trabajo. Hay que cerrarla y luego abrirla con doble click para que aparezca como Doc1.doc. Los detalles y adornos no los coloco para no enredarlos, solo les muestro a modo de idea, que se puede colocar alguna propaganda en el programa, en este caso al hacer click sobre Toms Bradanovic Computacin aparece la ventana de propaganda:

Un ltimo dato, si abren la caja de herramientas y luego van a Herramientas, Controles Adicionales del men, pueden agregar el control Microsoft MonthView 6.0 con lo que pueden dotar de un calendario a sus aplicaciones VBA para los programas que requieran clculos con fecha, agendas, etc, miren que bonito es

El Modelo de Objetos: qu es y para qu sirve


En la primera parte del curso vimos como es posible programar en VBA sin saber nada acerca del Modelo de Objetos de Microsoft. Partimos de la base que ste era una complicacin innecesaria y algo incomprensible para las personas comunes y corrientes.

As lo era para mi al menos cuando comenc a trabajar en VBA, pero con el tiempo, las ideas subyacentes del Modelo de Objetos se terminan infiltrando y comienza la curiosidad por saber de que se trata y si realmente sirve para algo.

La clave para entender todo este asunto se encuentra en la ayuda del Word (asumire que estamos usando Word 2000, si no lo tiene no importa el ejemplo igual vale), vamos a Informacin de programacin, Referencia de Visual Basic para Word y Objetos de Microsoft Word. Aparecer un intrincado organigrama lleno de nombres mas o menos cripticos, partiendo en el tope de la jerarqua por el casillero llamado Aplication, y hacia abajo sale una gran cantidad de ramas (Microsoft dice que Word tiene alrededor de 108 objetos).

Al hacer click sobre un casillero (digamos, Document) aparecer la explicacin del objeto junto con los dems objetos de ms baja jerarqua, como muestra la figura

Si todo esto todava le resulta incomprensible, no se preocupe. As me pareci tambin a mi y, de hecho todava hay muchas ramas que no he explorado y no se para que sirven. Pero la razn de ser del Modelo de Objetos est en ese organigrama. Se supone que si alguien comprende el modelo no necesitar ms ayuda que eso para programar cualquier cosa que necesite en VBA. Se supone tambin que todas las capacidades del lenguaje estn representadas all, no habrn caractersticas indocumentadas como en los buenos viejos tiempos. A mi entender, ese es el objetivo esencial del Modelo de Objetos de Microsoft. Una vez que entendemos el secreto de los nmeros, podemos contar hasta el infinito sin necesidad de haberlo hecho nunca antes, igual cosa para multiplicar, sumar, etc. porque entendemos el modelo de los nmeros decimales y los algoritmos respectivos. De manera similar, alguien que entiende el Modelo de Objetos no necesitar conocerlo en detalle (como los antiguos expertos que conocan todas las intrincadas sutilezas de un lenguaje de programacin), bastar con que tenga a mano la referencia (el organigrama), para poder inferir cualquier procedimiento. El haber modelado el lenguaje de manera lgica, permite adems la programacin automtica, esa misma que cuando grabamos un macro nos escribe automticamente el cdigo correspondiente, y que nos permiti programar en la primera parte del curso sin saber nada acerca del Modelo de Objetos Todo esto es la explicacin en trminos generales, entremos ahora a los detalles especficos. En beneficio de la comprensin ser algo liberal con la fraseologa y tal vez a veces mis trminos no sean los exactos, pero hay que tener en cuenta que es el rigor semntico lo que hace tan dificil de comprender el dichoso modelo, asi que me tomar mis libertades sin mayor remordimiento. Para fines didcticos consideraremos los objetos del Word solamente. Word es una aplicacion de Microsoft, as como lo son Excel, Power Point, Access, etc.O sea que existe un objeto llamado Aplication, que representa al Word mismo, en general. Cuando queremos programar algo que tenga que ver con el Word en general, y no con un documento especifico, usamos el objeto Aplication.

Por ejemplo With Application .WindowState = wdWindowStateNormal .Height = 450 .Width = 600 End WithHace partir al Word en una ventana normal, con un tamao de 450500 pixeles Fijense bien: el objeto es Aplication y tiene mtodos y propiedades como WindowState, Heigth y Width (acuerdense que en el curso anterior vimos que WithEnd With se usa para evitarnos tener que repetir palabras, en este caso la palabra Aplication) As si nos vamos al organigrama de los objetos del Word y hacemos click en el cuadro Aplication, aparecern todos los mtodos y todas las propiedades que podemos usar con el objeto. En las lecciones siguientes iremos analizando los principales objetos con sus mtodos ms usados. Los ejemplos de cdigo los he obtenido del excelente artculo de Microsoft llamado Microsoft Word Objects.obtenido del Microsoft Office Developer Forum de Internet. Una referencia de primera que actualmente estoy traduciendo para mi uso personal

El Objeto Document
En la leccin anterior vimos nuestro primer objeto Aplication, en el tope de la jerarqua, que representaba a la aplicacin Word en general, de este objeto salen todos los dems y el segundo objeto que estudiaremos (en orden de utilidad) sera Document Sin pensar mucho podemos intuir que Document es un documento que se abre usando la aplicacin Word, como podemos tener varios documentos abiertos existe adems la coleccin Documents (con s al final) que representa a todos los documentos abiertos en una sesin. Para programar con el modelo de objetos usamos el objeto y su propiedad o mtodo separado por puntos, como el nombre y los apellidos, cuando un objeto es una rama de inferior jerarqua tambin colocamos su objeto padre por ejemplo Aplication.Document.Open Pero el objeto Document es global, lo que significa que no es necesario que vaya antecedido por su objeto padre Aplication, as podemos escribir Document.Open Y no aparecer ningn error. Podemos, por ejemplo abrir el documento TEXT.DOC (que est en la carpeta actual) desde un programa usando Set miDocumento = Documents.Open(FileName:=TEST.DOC) Analizando el ejemplo anterior podemos ver como se programa en el modelo de objetos Set miDocumento = sirve para recuperar el documento, asignndolo a una variable, as cada vez que nos referimos a miDocumento estaremos accesando al documento abierto llamado TEST.DOC. Con Documents.Open(Filename=TEXT:DOC) tenemos que de la coleccin Documents usamos el mtodo Open con la constante Filename a la cual le hemos dado el valor de TEST.DOC Ahora podemos modificar a miDocumento como por ejemplo: miDocumento.PageSetup.TopMargin = InchesToPoints(1.25) En este caso usamos el mtodo PageSetup y la propiedad TopMargin para ajustar el margen superior a 1.25 pulgadas. A estas alturas creo que ya se puede ir comprendiendo las ventajas del modelo de objetos y la forma ms o menos mecnica en que se puede programar sin necesidad de recurrir a trucos de ingenio como en los viejos tiempos. Veremos a continuacin algunos ejemplos de lo que podemos hacer usando el objeto Document, la coleccin Documents, sus mtodos, propiedades y constantes Ejemplo 1: Muestra el nombre del documento activo; si no hay documentos abiertos, el ejemplo muestra un mensaje If Documents.Count >= 1 Then

MsgBox ActiveDocument.Name Else MsgBox No documents are open End If Ejemplo 2: Abre el archivo Test.doc (de la carpeta actual) y activa el control de los cambios Set myDoc = Documents.Open(FileName:=TEST.DOC) myDoc.TrackRevisions = True Ejemplo 3: Muestra propiedades y mtodos del objeto FileSearch para determinar si un archivo llamado Test.doc existe en la carpeta por defecto. Si el archivo es encontrado (FoundFiles.Count = 1), se abre, de otro modo se mostrar un mensaje defaultDir = Options.DefaultFilePath(wdDocumentsPath) With Application.FileSearch .FileName = Test.doc .LookIn = defaultDir .Execute If .FoundFiles.Count = 1 Then Documents.Open FileName:=defaultDir & Application.PathSeparator & TEST.DOC Else MsgBox Test.doc file was not found End If End With Ejemplo 4: Chequea el valor retornado por el mtodo Display.Si el usuario hace click en OK para cerrar la dialog box, se retorna el valor -1 y el archivo, cuyo nombre esta almacenado en la variable fSelected, se abre. Set dlg = Dialogs(wdDialogFileOpen) aButton = dlg.Display fSelected = dlg.Name If aButton = -1 Then Documents.Open FileName:=fSelected End If Ejemplo 5: Activa un documento llamado Sample.doc si ya est abierto; si no lo est, el ejemplo lo abre docFound = True For Each aDoc In Documents If InStr(1, aDoc.Name, sample.doc, 1) Then aDoc.Activate Exit For Else docFound = False End If Next aDoc If docFound = False Then Documents.Open _ FileName:=C:DocumentsSample.doc Estos ejemplos, sacados de la documentacin de Microsoft nos permiten ver como, de una manera bastante lgica podemos manipular desde un programa el objeto Document, en la prxima leccin seguiremos investigando que ms podemos hacer con las diferentes propiedades y mtodos de este importante objeto

Ms sobre el Objeto Document


Para imprimir un documento le aplicamos el mtodo printout Por ejemplo ActiveDocument.Printout Tambin podran usarse las opciones de impresin usando el objeto Options Options.PrintHiddenText = True ActiveDocument.PrintOut Range:=wdPrintFromTo, From:=1, To:=3

El objeto Close sirve para cerrar un documento, por ejemplo Documents(Prueba.doc).Close Se pueden agregar objetos, tales como notas al pie, comentarios o tablas a un documento usando el mtodo Add con una coleccin de objetos accesada desde el objeto Document. La siguiente instruccin, por ejemplo, agrega una tabla de 33 localizada por la variable myRange (myRange es una variable de objeto que contiene un objeto Range). ActiveDocument.Tables.Add Range:=myRange, NumRows:=3, NumColumns:=3 El siguiente ejemplo agrega una nota al pie en la localizacin especificada por la variable myRange. ActiveDocument.Footnotes.Add Range:=myRange, Text:=The Willow Tree Para una lista de la coleccin de objetos que soportan el mtodo Add, vea en la ayuda bajo el tpico Add Method El objeto Range permite seleccionar un rango dentro del documento, para entender el objeto Range hay que saber que existen 11 diferentes wsStoryTye correspondientes a diferentes partes de un documento que son wdCommentsStory, wdEndnotesStory, wdEvenPagesFooterStory, wdEvenPagesHeaderStory, wdFirstPageFooterStory, wdFirstPageHeaderStory, wdFootnotesStory, wdMainTextStory, wdPrimaryFooterStory, wdPrimaryHeaderStory, and wdTextFrameStory. Adems de objetos que pueden modificarse que son:

Words(index) Characters(index) Sentences(index) Paragraphs(index) Sections(index)

Range Range Range Paragraph Section

Algunos ejemplos de uso del objeto Range Crear un rango y almacenarlos en MiRango (las 10 primeras letras de un documento) Set miRango = ActiveDocument.Range(Start:=0, End:=10) Despus podramos ponerlo en cursiva con miRango.Italics = True Tambin podramos insertar una palabra antes de cierto rango con: ActiveDocument.Range(Start:=0, End:=0).InsertBefore Text:=Hola Si usamos Range.Select veremos el rango pintado tal como cuando seleccionamos con el mouse Set miRango = ActiveDocument.Range(Start:=0,_ End:=ActiveDocument.Paragraphs(3).Range.End) miRango.Select

Por ejemplo si queremos colocar varios atributos a un prrafo usamos Set myRange = ActiveDocument.Paragraphs(1).Range With myRange .Bold = True .ParagraphFormat.Alignment = wdAlignParagraphCenter .Font.Name = Arial End With El objeto Selection permite tambin hacer muchas de las operaciones que se hacen con Range, por ejemplo Para mostrar el nombre de cada marcador en un documento For Each aBook In Selection.Bookmarks MsgBox aBook.Name Next aBook Los objetos Find y Replace permiten, obviamente buscar y reemplazar texto, por ejemplo Para buscar la palabra Hola dentro de un documento With Selection.Find .Forward = True .Wrap = wdFindStop .Text = Hola .Execute End With Para reemplazar las palabras uno por dos dentro de un documento With Selection.Find .ClearFormatting .Text = uno .Replacement.ClearFormatting .Replacement.Text = dos .Execute Replace:=wdReplaceAll, Forward:=True, Wrap:=wdFindContinue End With Agregar y Editar campos en un documento Para agregar campos a un documento se aplica el mtodo Add a la coleccin Fields, por ejemplo para agregar el campo Fecha donde est la seleccin actual, usamos ActiveDocument.Fields.Add Range:=Selection.Range, Type:=wdFieldDate Luego de agregado el campo, se obtiene (o se asigna) el resultado de ese campo usando la propiedad Result o Code. El ejemplo siguiente cambia el cdigo del primer campo de la seleccin actual, lo actualiza y muestra el resultado en el campo. If Selection.Fields.Count >= 1 Then With Selection.Fields(1) .Code.Text = CREATEDATE *MERGEFORMAT .Update MsgBox .Result.Text End With End If
Modificar los Comandos del Word

Esta es una caracterstica importantsima para el desarrollador en Vba en lugar de hacer lo que tienen predeterminado, ejecuten la macro que diseemos Por ejemplo podramos escribir un macro llamado FileSave() que grabe una vez que este es grabado, as podramos registrar los cambios que se le ha los documentos sin que el usuario se de cuenta (suponemos un usuario no tambin tendrn pensamientos malignos en este punto. En fin, la manera e es: 1. En el men Herramientas, Macro, Macros 2. En Macros en, escoger Comandos del Word 3. En Nombre de Macro name, escoja el comando que quiere modificar (por ejemplo Archivo Guardar Todo). 4. En Macros en, seleccione la plantilla o ubicacion donde quiera guardar la macro. Si usa Normal.dot la macro funcionar en todos los documentos 5. Crear Se abrir un mdulo como por ejemplo: Sub FileSave() FileSave Mac Saves the a ActiveDocument.Save End Sub En este mdulo se pueden agregar comandos (para que adems de grabar haga otras operaciones o tambin podra borrar la lnea ActiveDocument.Save y programar requiera Eventos de Documento Los eventos de documento que se pueden programar en el Word son:

Close New Open

Ocurre cuando un documento es cerrado Ocurre cuando una plantilla genera un nuevo documento y lo abre Ocurre cuando un documento es abierto

Por ejemplo, para maximizar un documento cada vez que es abierto usamos Private Sub Document_Open() End Sub Eventos de Aplicacin

DocumentChange

Quit

Occurre cuando se crea un nuevo documento, cuando se abre uno existente, o cuando otro documento se hace activo Ocurre cuando el usuario sale del Word.

El siguiente ejemplo asegura que las toolbar Standard y Formatting sean visibles antes que el usuario salga del Word, para que queden visibles para el prximo uso Private Sub App_Quit() CommandBars(Forma End Sub Los Macros Auto Hay algunos nombres de macro especiales

AutoExec AutoNew AutoOpen AutoClose AutoExit

Cada vez que parte el Word o se inicia con la plantilla Global Cada vez que se crea un nuevo documento Cada vez que se abre un documento que ya existe Cada vez que se cierra un documento Cada vez que se sale del Word

El Modelo de Objetos Para Excel Como creo que ya tenemos prctica en trabajar con el modelo de objetos, me limitar a colocar los ejemplos y referencias entregadas por Microsoft respecto del Excel Para el objeto Aplication tenemos por ejemplo: Aplication.DisplayFormulaBar (True/False) Aplication.ScreenUpdating (True/False) Application.Calculate (recalcula todos los objetos de la aplicacin)

El Objeto Workbook El siguiente ejemplo abre la hoja Libro1.xls y muestra el valor de la celda A1 en una Msgbox Sub OpenBook1() Set myBook = Workbooks.Open(Filename:=Libro1.xls) MsgBox myBook.Worksheets(1).Range(A1).Value End Sub

Para guardar una plantilla Excell que contenga macros Micrososft recomienda hacerlo en el mismo directorio donde est el ejecutable de Excel, esto se recuperara con Sub OpenBook1() EXEPath = Application.Path &_ Application.PathSeparator fName = EXEPath & BOOK1.XLS Set myBook = Workbooks.Open(Filename:=fName) MsgBox myBook.Worksheets(1).Range(A1).Value End Sub Otra alternativa es guardarlo en un directorio que crea el Officce para estos efectos llamado Library, en este caso se recuperara con: Sub OpenBook1() LibPath = Application.LibraryPath &_ Application.PathSeparator fName = LibPath & BOOK1.XLS Set myBook = Workbooks.Open(Filename:=fName) MsgBox myBook.Worksheets(1).Range(A1).Value End Sub Para crear workbooks se usa el mtodo Add para grabarlo por primera vez se usa SaveAs y para grabarlo las veces siguientes Save Sub CreateAndSave() Set newBook = Workbooks.Add Do fName = Application.GetSaveAsFilename Loop Until fName <> False newBook.SaveAs Filename:=fName End Sub Para cerrar un workbook se usa el mtodo Close Sub OpenChangeClose() Do fName = Application.GetOpenFilename Loop Until fName <> False Set myBook = Workbooks.Open(Filename:=fName) Hacer cambios a myBook myBook.Close savechanges:=False End Sub El Objeto Range Los diferentes mtodos del objeto Range son: ActiveCell BottomRightCell

Cells ChangingCells CircularReference Columns CurrentArray CurrentRegion Dependents


DirectDependents DirectPrecedents

EntireColumn EntireRow Next Offset PageRange Precedents Range


RowFields RowRange

Rows Selection TableRange1 TableRange2 TopLeftCell UsedRange VisibleRange


Algunos ejemplos prcticos

Colocar el valor de la celda A1 en hoja1 Worksheets(hoja1).Range(A1).Value = 3


Colocar una frmula en la celda activa Range(B1).Formula = =5-10*RAND() Colocar el valor 6 en el rango C1:E3 de la hoja activa Range(C1:E3).Value = 6 Limpiar el contenido del rango A1:E3 en la hoja activa Range(A1, E3).ClearContents Colocar el atributo font.bold en el rango llamado miRango Range(miRango).Font.Bold = True Colocar un 3 en cada celda del rango llamado miRango de la hoja1 Range(Sheet1!miRango2).Value = 3 Establecer una variable de objeto para referir a un rango Set objRange = Range(miRango) Usando Nmeros de lnea o columna

Colocar el valor de la celda A1 en Sheet1 Worksheets(Sheet1).Cells(1, 1).Value = 3


Colocar la frmula en la celda B1 de la hoja activa Cells(1, 2).Formula = =5-10*RAND() Colocar una variable de objeto Set objRange = Worksheets(Sheet1).Cells(1, 1)

Para selecciones multicolumna se usan loops, el ejemplo siguiente busca en el rango A1:D10 de la hoja Sheet1 y si encuentra un valor menor que 0.001 lo reemplaza por 0 Sub RoundToZero() For rwIndex = 1 to 4 For colIndex = 1 to 10 If Worksheets(Sheet1).Cells(rwIndex, colIndex) < .01 Then Worksheets(Sheet1).Cells(rwIndex, colIndex).Value = 0 End If Next colIndex Next rwIndex End Sub

You might also like