El curso escrito


Esta es una reescritura del Curso Básico de VBA que publiqué hace unos 15 años atrás. Como el VBA sigue vigente pensé que sería bueno hacer una nueva versión del curso que elimine la palabrería inútil y muchos contenidos de relleno que tenía el curso anterior. Aquí vamos:

Para que sirve el VBA

En pocas palabras, para programar los componentes de Microsoft Office tales como Word, Excel, Access, Poower Point y Visio. En este curso los ejemplos serán solo de Word y Excel. Es un subconjunto casi completo del lenguaje de programación Visual Basic 6.0. O sea, si tienen instalado el Office o cualquiera de sus componentes, no necesitan más para programar en VBA.

La advertencia de seguridad: Al abrir macros en Word97 puede negar acceso por la configuración de seguridad presdeterminada. En este caso hay que ir a Herramientas, Macros, Seguridad y se cambia a nivel medio como muestra la figura.

Nivel medio significa que avisará antes de ejecutar un macro mostrando una pantalla de advertencia sobre la posibilidad de virus (como VBA es un lenguaje completo, se puede encapsular virus dentro de un documento de Office). Cuando ejecutamos nuestros macros simplemente ponemos "Habilitar macros" después de la advertencia. 

Luego en el Word -por ejemplo- escogeremos Herramientas, Macros, Editor de Visual Basic y aparecerá lo siguiente:


Este es el entorno de trabajo donde podemos distinguir:

Explorador de proyectos. El explorador de proyectos es una herramienta de exploración y gestión que muestra una lista jerárquica de cada proyecto abierto. También muestra cada una de las componentes asociadas con los proyectos, como los documentos de Word, formularios, módulos de clase y referencias. En palabras sencillas hay que dejarlo tal como está. A medida que agreguemos objetos a nuestro progranma irán 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 alfabéticamente o por categorías. En palabras sencillas, cuando agregamos un objeto este tiene varias “propiedades” como su color, tamaño, 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 menús que tiene los menús con todas las opciones del Visual BAsic Area de trabajo. Es donde colocamos nuestros objetos (Formularios o controles) y les agregamos código

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 código a los objetos

Primer ejemplo: convertidor de monedas

Para este ejemplo primero dibujaremos las pantallas que en VBA se llaman Formularios de Usuario (User Forms), asi es que usando la barra de menús procedemos a Insertar, UserForm, nos aparece lo siguiente:


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 (UserForm1) escribiendo encima de eso “Convertidor de Dolares a Pesos)”. Vean como cambia el título de nuestro formulario.

Seguidamente cambiemos la propiedad “Back color” haciendo click en ella y luego un click sobre el botón 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. Busquen otras propiedades y cambien sus valores. Si no notan ningún efecto restauren la propiedad a su valor original (con el tiempo se familiarizarán con cada una de las propiedades disponibles para cada componente de la caja de herramientas).

Si, se pierde la caja de herramientas, la podrán recuperar fácilmente con “Ver” “Caja de Herramientas” de la barra del menú. Si no encuentran alguna propiedad (por ejemplo “Name” recuerden que la ventana de propiedades las puede mostrar en orden alfabetico o por categorías, busque en ambos lados pulsando en la ventana correspondiente en la parte superior de las propiedades.

Usaremos tres clases de controles en nuestro proyecto: labels (etiquetas), textboxes (cajas de dialogo o de texto) y un commandbutton (botón de comando), todas estos controles se sacan de la caja de herramientas de abajo del formulario y cada uno tiene sus propiedades.

Los labels son los marcados con la letra “A” en la caja de herramientas, haciendo click sobre el icono y luego colocándose sobre el formulario se dibuja, arrastrando el mouse cambia el tamaño 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. También 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 código, para ello debemos pensar “que es lo que queremos que haga el programa”. En éste caso yo deseo que “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.

Para eso tenemos que poner un código a cada uno de los textbox indicando que deseamos que ocurra cada vez que escribimos algo y apretamos Enter (eso se llama un "evento"). Para poner código en el textbox de “tdolares” hacemos doble click sobre él y aparecerá la “ventana de códigos” 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 código:

Private Sub tdolares_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    tpesos.text = Val(tdolares.text) * 500
End Sub


Es decir que cuando escribimos algo en el textbox llamado tdolares y luego presionamos Enter se calculará el varol equivalente en pesos. Nótese 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 códigos y volver al formulario simplemente hacemos click en “UserForm1″ del explorador de proyectos (ventana superior izquierda)

Para el otro textbox (tpesos) también 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


Si está todo correcto no sería mala idea que lo grabaran, haciendo click sobre el icono del diskette.

Para probarlo, en la barra de herramientas hay tres botones similares a los de una grabadora. Para que parta el programa presionen el boton correspondiente al “Play” o bien presionen F5 (da lo mismo).

Para diseñar las pantallas rápidamente podemos Copiar, Pegar, Formato, Alinear a la izquierda, Espacio Horizontal, Igualar, etc.a nuestros componentes.

Segundo ejemplo: un Formulario en Word VBA 

La automatización de formularios en Word es una de las aplicaciones más útiles del VBA, mostraré paso a paso como hacer un ejemplo sencillo que puede modificarse y adaptarse a muchos otros formatos

Botón derecho
Nuevo
Nuevo documento del Word
Cambiar nombre a FormularioConMacros.doc
Herramientas
Opciones
Seguridad
Seguridad de macros (cambiar a medio)
Herramientas
Macro

Macros

Nombre de la macro: formulario1
Macros en: FormularioConMacros.doc (documento)
Crear

insertar
UserForm
(si el cuadro de herramientas no se ve) ver, Cuadro de Herramientas Crear Userform con 3 labels, 3 textboxes y 1 commandbuttom como muestra la figura siguiente


Volver a FormularioCon Macros.doc
Doble clic en CommandButton1

Debe aparecer
Private Sub CommandButton1_Click()

End Sub
Colocar cursor arriba de End Sub
Escribir el siguiente código (puede hacer un copy-paste)

With Selection
          .ParagraphFormat.LineSpacingRule = wdLineSpaceSingle      ‘Coloca espacio de líneas en “espacio simple”
          .TypeParagraph                        ‘Pasa a linea siguiente
          .TypeParagraph                        ‘Pasa a linea siguiente
          .Font.Bold = True                         ‘Coloca negrita
          .TypeParagraph                        ‘Pasa a linea siguiente
          .TypeParagraph                        ‘Pasa a linea siguiente
          .TypeParagraph                        ‘Pasa a linea siguiente
          .Font.Size = 16                       ‘Coloca tamaño de letra en 16
          .ParagraphFormat.Alignment = wdAlignParagraphCenter       ‘Alineado al centro
          .TypeText Text:=”CERTIFICADO”         ‘Escribe texto
          .Font.Size = 12                       ‘Coloca tamaño de letra en 12
          .TypeParagraph                        ‘Pasa a linea siguiente
          .Font.Bold = False                            ‘Desactiva negrita
          .ParagraphFormat.Alignment = wdAlignParagraphLeft         ‘alineacion a la izquierda
          .TypeParagraph                        ‘Pasa a linea siguiente
          .TypeText Text:=”Certifico que el señor “         ‘Escribe texto
          .Font.Bold = True  ‘Activa las negritas           ‘Escribe texto
          .TypeText Text:=TextBox1.Text                     ‘Escribe el contenido de textbox1.text
          .Font.Bold = False                        ‘Desactiva las negritas
          .TypeText Text:=”, domciliado en “                ‘Escribe texto
          .TypeText Text:=TextBox2.Text                 ‘Escribe el contenido de textbox2.text
          .TypeText Text:=” teléfono “                  ‘Escribe texto
          .TypeText Text:=TextBox3.Text                 ‘Escribe el contenido de textbox3.text
          .TypeText Text:=” es una persona honorable, de buenas costumbres, “           ‘Escribe texto
          .TypeText Text:=” que no consume alcohol y su comportamiento moral es intachable.”    ‘Escribe texto
          .TypeParagraph                        ‘Pasa a linea siguiente
          .TypeParagraph                        ‘Pasa a linea siguiente
          .TypeText Text:=” Se extiende el presente certificado a petición “            ‘Escribe texto
          .TypeText Text:=” del interesado con objeto de su postulación al Opus Dei”        ‘Escribe texto
          .TypeParagraph                        ‘Pasa a linea siguiente
          .TypeParagraph                        ‘Pasa a linea siguiente
          .Font.Name = “Arial”                      ‘Cambia el font a Arial
          .Font.Size = 10                       ‘Coloca tamaño en 10
          .TypeText Text:=”Arica “                  ‘Escribe texto
          .TypeText Text:=Date$                     ‘Escribe la fecha
          .TypeParagraph                        ‘Pasa a linea siguiente
          .TypeParagraph                        ‘Pasa a linea siguiente
          .TypeParagraph                        ‘Pasa a linea siguiente
          .TypeParagraph                        ‘Pasa a linea siguiente
          .TypeParagraph                        ‘Pasa a linea siguiente
          .TypeParagraph                        ‘Pasa a linea siguiente
          .TypeParagraph                        ‘Pasa a linea siguiente
          .TypeParagraph                        ‘Pasa a linea siguiente
          .ParagraphFormat.Alignment = wdAlignParagraphCenter       ‘Alineación al centro
          .Font.Bold = True                     ‘Activa negritas
          .TypeText Text:=” RR. PP. TOMAS BRADANOVIC S.J. “     ‘Escribe texto
          .Font.Bold = False                        ‘Desactiva negritas
    End With                                ‘Termina el ciclo Selection
    Unload UserForm1
#160;

Clic en “Grabar”
Salir del editor e ir a la página en blanco de Word

Poner mouse sobre barra de herramientas
Boton derecho, personalizar
Macros
Guardar en: FormularioConMacros.doc
Project.NewMacros.formulrio1
Con la ventana “personalizar” abierta
Botón derecho, cambiar imagen del botón
Grabar la página

Eso es todo, haciendo click sobre el nuevo botón se comienza a ejecutar el macro. No explicaré el programa línea por línea porque se encuentra auto documentado en los comentarios

Tercer ejemplo: Prototipos en VBA-Excel

Los he llamado prototipos solo por poner un nombre. Se trata de pequeños programas hechos en Excel, con propósito pedagógico para mostrar como se codifican algunas tareas básicas de entrada y actualización de datos.

Se muestran tres ejemplos que pueden servir de base para otros programas funcionales: una agenda un pequeño programa de inventario y un pequeño programa de cuenta corriente. No se usan archivos pues se usa la misma hoja de Excel como soporte para almacenar los datos, esto muestra la versatilidad y posibilidades de uso del VBA integrado con Excel.

1.- Una Agenda

Se trata de programar una agenda, programa que pida datos personales tales como nombre, dirección, teléfono, etc. y los almacene en la misma hoja excel

En la hoja Excel se habilitan los macros cambando las opciones de seguridad si es necesario y se ingresa al entorno de programación con Herramientas, Macros, Editor de Visual Basic

Una vez allí se escoge Insertar, Userform y usando la caja de herramientas se colocan los textbox y el command button


En el Command Button se agrega el siguiente código

Private Sub CommandButton1_Click()
    indice = Hoja1.Cells(1, 1)
    If indice = "" Then
        indice = 1
        Hoja1.Cells(1, 1) = indice
    End If
    indice = indice + 1
    Hoja1.Cells(1, 1) = indice
    Hoja1.Cells(indice, 1) = TextBox1.Text
    Hoja1.Cells(indice, 2) = TextBox2.Text
    Hoja1.Cells(indice, 3) = TextBox3.Text
    Hoja1.Cells(indice, 4) = TextBox4.Text
    TextBox1.Text = ""
    TextBox2.Text = ""
    TextBox3.Text = ""
    TextBox4.Text = ""
    TextBox1.SetFocus
End Sub


Listo, eso es todo

2.- Un Inventario

Este prototipo ingresa nuevos artículos que deja guardados en la hoja Excel y permite hacer ventas rebajando el saldo. Consta de dos formularios, el principal tiene la ventana para rebajar las ventas (Insertar, User form)



La programación de los elementos de la form es la siguiente

Para el combobox (se cambió en nombre a ComboNombre)

Private Sub ComboNombre_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Rem al escoger un item del combobox hace lo siguiente
    Rem coloca el costo en textbox1
    TextBox1.Text = Hoja1.Cells(2, 2)
    Rem coloca el precio de venta (lista) en textbox2
    TextBox2.Text = Hoja1.Cells(2, 3)
End Sub


Para el Command Button 1 (Agregar artículo)

Private Sub CommandButton1_Click()
    Rem para agregar un nuevo articulo
    Rem se carga userform2
    Load UserForm2
    Rem se muestra userforrm2
    UserForm2.Show
End Sub


Para el Command Button 2 (Ingresar venta)

Private Sub CommandButton2_Click()
    Rem al ingresar la venta
    Rem el saldo esta en hoja1.cells de la linea de combo que elegimos
    Rem que en la hoja exel seria la posicion combonombre.listindex + 1
    Rem recordar el formato Hoja1.Cells(linea,columna)
    Rem luego toma el valor (cantidad) almacenado en esa celda y le resta el valor de textbox3.text
    Hoja1.Cells(ComboNombre.ListIndex + 1, 2) = Hoja1.Cells(ComboNombre.ListIndex + 1, 2) - TextBox3.Text
    Rem con eso deja la cantidad rebajada
    Rem luego limpia los textbox combo y pone el foco en combonombre
    TextBox1.Text = ""
    TextBox2.Text = ""
    TextBox3.Text = ""
    TextBox4.Text = ""
    ComboNombre.Text = ""
    ComboNombre.SetFocus
End Sub


Para Textbox3 (después de ingresar la cantidad vendida)

Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Rem calcula el total de la venta y lo coloca en textbox4.text
    TextBox4.Text = TextBox2.Text * TextBox3.Text
End Sub


Para cuando se cargue la User Form

Private Sub UserForm_Activate()
    Rem llena los valores del combo cada vez que parte el programa userform_activate
    Rem para ello primero parte de la posicion 2
    Rem y cambia los valores de z desde 1 a 500
    Rem y con el metodo additem llena al combo de valores (nombres de articulos)
    If Hoja1.Cells(1, 1) <> "" Then
        For z = 1 To 500
            ComboNombre.AddItem Hoja1.Cells(z, 1)
        Next z
        Rem deja en blanco el combo
        ComboNombre.Text = ""
    End If
End Sub


Luego se crea la segunda User From con Insertar, Userform



En este caso solos se programa el Command Buttom

Private Sub CommandButton1_Click()
    Rem posicion del indice en la celda 1,1
    indice = Hoja1.Cells(1, 1)
    Rem si el indice es cero se cambia a uno
    If indice = "" Then
        indice = 1
        Hoja1.Cells(1, 1) = indice
    End If
    Rem incrementa el indice en 1 lugar que es la fila donde debe grabar
    indice = indice + 1
    Rem coloca el nuevo valor del indice -incrementado- en la celda 1,1
    Hoja1.Cells(1, 1) = indice
    Rem escribe los contenidos de los textbox en la hoja 1
    Rem la fila es el valor del indice y la columna varia segun el contenido
    Hoja1.Cells(indice, 1) = TextBox1.Text
    Hoja1.Cells(indice, 2) = TextBox2.Text
    Hoja1.Cells(indice, 3) = TextBox3.Text
    Hoja1.Cells(indice, 4) = TextBox4.Text
    Rem limpia todos los textbox
    TextBox1.Text = ""
    TextBox2.Text = ""
    TextBox3.Text = ""
    TextBox4.Text = ""
    Rem coloca el foco en textbox1
    TextBox1.SetFocus
End Sub

3.- Una Cuenta Corriente


Este prototipo ingresa nuevas cuentas con sus datos, va ingresando movimientos, entrega los saldos y emite una cartola de movimientos

El primer form que se ingresa es el que entrega los saldos y permite ir a ingresar cuentas y cartolas, Insertar, Userform


La programación de los componentes de este form es:

Para el ComboNombre

Private Sub ComboNombre_Click()
Rem al escoger un item del combobox hace lo siguiente
    Rem coloca el costo en textbox1
    saldo = 0
    CodCliente = ComboNombre.ListIndex + 1
    TextBox1.Text = Hoja1.Cells(CodCliente, 2)
    Rem coloca el precio de venta (lista) en textbox2
    TextBox2.Text = Hoja1.Cells(CodCliente, 3)
    TextBox3.Text = Hoja1.Cells(CodCliente, 4)
    ultimo = Hoja2.Cells(1, 1)
    For z% = 2 To ultimo
        If CodCliente = Hoja2.Cells(z%, 1) Then
            monto = Hoja2.Cells(z%, 4)
            If Hoja2.Cells(z%, 5) = "Debe" Then
                monto = -1 * monto
            End If
            saldo = saldo + monto
        End If
    Next z%
    TextBox4.Text = saldo
End Sub



Para el Command Button 1 (Agregar nueva cuenta)

Private Sub CommandButton1_Click()
    Rem para agregar nueva cuenta
    Rem se carga userform3
    Load UserForm3
    Rem se muestra userforrm2
    UserForm3.Show
End Sub



Para el Command Button 3 (para ir agregando movimientos)

Private Sub CommandButton3_Click()
    Rem para agregar un nuevo movimiento
    Rem se carga userform2
    Load UserForm2
    Rem se muestra userforrm2
    UserForm2.Show
End Sub



Para el Command Button 4 (para emitir cartola)

Private Sub CommandButton4_Click()
    Rem para emitir cartola
    Rem se carga userform4
    Load UserForm4 Rem se muestra userforrm4    
    UserForm4.Show
End Sub



Para Text Box 3 (coloca total venta)

Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Rem calcula el total de la venta y lo coloca en textbox4.text
    TextBox4.Text = TextBox2.Text * TextBox3.Text
End Sub



Para cuando se activa la User Form

Private Sub UserForm_Activate()
    Rem llena los valores del combo cada vez que parte el programa userform_activate
    Rem para ello primero parte de la posicion 2
    Rem y cambia los valores de z desde 1 a 500
    Rem y con el metodo additem llena al combo de valores (nombres de articulos)
    If Hoja1.Cells(1, 1) <> "" Then
        For z = 1 To 500
            ComboNombre.AddItem Hoja1.Cells(z, 1)
        Next z
        Rem deja en blanco el combo
        ComboNombre.Text = ""
    End If
End Sub



Luego Insert, User form para el User Form de Insertar Movimiento



Cuyos componentes programables son

La User Form al activarse (ingresar el movimiento)

Private Sub UserForm_Activate()
    Rem llena los valores del combo cada vez que parte el programa userform_activate
    Rem para ello primero parte de la posicion 2
    Rem y cambia los valores de z desde 1 a 500
    Rem y con el metodo additem llena al combo de valores (nombres de articulos)
    If Hoja1.Cells(1, 1) <> "" Then
        For z = 1 To 500
            ComboNombre.AddItem Hoja1.Cells(z, 1)
        Next z
        Rem deja en blanco el combo
        ComboNombre.Text = ""
    End If
End Sub



El Comand Button1

Private Sub CommandButton1_Click()
    Rem posicion del indice en la celda 1,1
    indice = Hoja2.Cells(1, 1)
    Rem si el indice es cero se cambia a uno
    If indice = "" Then
        indice = 1
        Hoja2.Cells(1, 1) = indice
    End If
    Rem incrementa el indice en 1 lugar que es la fila donde debe grabar
    indice = indice + 1
    Rem coloca el nuevo valor del indice -incrementado- en la celda 1,1
    Hoja2.Cells(1, 1) = indice
    Rem escribe los contenidos de los textbox en la hoja 1
    Rem la fila es el valor del indice y la columna varia segun el contenido
    Hoja2.Cells(indice, 1) = ComboBox2.ListIndex + 1
    Hoja2.Cells(indice, 2) = TextBox1.Text
    Hoja2.Cells(indice, 3) = TextBox2.Text
    Hoja2.Cells(indice, 4) = TextBox3.Text
    Hoja2.Cells(indice, 5) = ComboBox1.Text
    Rem limpia todos los textbox
    TextBox2.Text = ""
    TextBox3.Text = ""
    Rem coloca el foco en textbox1
    ComboBox2.SetFocus
End Sub



Luego el User Form 3 para agregar nuevas cuentas, Insert, User Form



Cuyo código asl activarse es:

Private Sub UserForm_Activate()
    ComboBox1.AddItem "Haber"
    ComboBox1.AddItem "Debe"
    ComboBox1.Text = ComboBox1.List(1)
    TextBox1.Text = Date
    ComboBox2.SetFocus
    If Hoja1.Cells(1, 1) <> "" Then
        For z = 1 To 500
            ComboBox2.AddItem Hoja1.Cells(z, 1)
        Next z
        Rem deja en blanco el combo
        ComboBox2.Text = ""
    End If
End Sub


Para el Command Button 1 (ingresar cuenta)

Private Sub CommandButton1_Click()
    Rem posicion del indice en la celda 1,1
    indice = Hoja1.Cells(1, 1)
    Rem si el indice es cero se cambia a uno
    If indice = "" Then
        indice = 1
        Hoja1.Cells(1, 1) = indice
    End If
    Rem incrementa el indice en 1 lugar que es la fila donde debe grabar
    indice = indice + 1
    Rem coloca el nuevo valor del indice -incrementado- en la celda 1,1
    Hoja1.Cells(1, 1) = indice
    Rem escribe los contenidos de los textbox en la hoja 1
    Rem la fila es el valor del indice y la columna varia segun el contenido
    Hoja1.Cells(indice, 1) = TextBox1.Text
    Hoja1.Cells(indice, 2) = TextBox2.Text
    Hoja1.Cells(indice, 3) = TextBox3.Text
    Hoja1.Cells(indice, 4) = TextBox4.Text
    Rem limpia todos los textbox
    TextBox1.Text = ""
    TextBox2.Text = ""
    TextBox3.Text = ""
    TextBox4.Text = ""
    Rem coloca el foco en textbox1
    TextBox1.SetFocus
End Sub



Finalmente se inserta el User From 4 para emitir cartola Insert, User Form 

Solo contiene un Combo Box con el siguiente código

Private Sub UserForm_Activate()
    If Hoja1.Cells(1, 1) <> "" Then
        For z = 1 To 500
            ComboBox1.AddItem Hoja1.Cells(z, 1)
        Next z
        Rem deja en blanco el combo
        ComboBox1.Text = ""
    End If
End Sub
    indice = indice + 1
    Rem coloca el nuevo valor del indice -incrementado- en la celda 1,1
    Hoja1.Cells(1, 1) = indice
    Rem escribe los contenidos de los textbox en la hoja 1
    Rem la fila es el valor del indice y la columna varia segun el contenido
    Hoja1.Cells(indice, 1) = TextBox1.Text
    Hoja1.Cells(indice, 2) = TextBox2.Text
    Hoja1.Cells(indice, 3) = TextBox3.Text
    Hoja1.Cells(indice, 4) = TextBox4.Text
    Rem limpia todos los textbox
    TextBox1.Text = ""
    TextBox2.Text = ""
    TextBox3.Text = ""
    TextBox4.Text = ""
    Rem coloca el foco en textbox1
    TextBox1.SetFocus
End Sub


Y eso sería todo

Como programar en VBA sin conocer el modelo de objetos

El modelo de objetos de VBA (Microsoft Foundation Classes) contiene todas las funciones y herramientas que se necesitan para programar cualquier componente del Officce, el problema que es enorme y solo examinar el complicado árbol de objetos, clases y subclases tomaría montenes de tiempo.

Existe un truco que permite averiguar de manera rápida que objetos hay que usar y como para distintas tareas, esto se hace usando la grabadora de macros.

Abrimos un documento en blanco y nos vamos a Herramientas, Macros, Grabar Nueva Macro, Aceptar (quedará grabado son el nombre por defecto Macro1). Aparecerá la imagen de una mini "grabadora" que indica que estamos grabando el macro.

Supongamos que queremos ver como se programa para acceder a los encabezados y pies de página, como estamos grabando la macro hacemos la operación que queremos automatizar de modo manual, en este caso escogemos Ver, Encabezados y pies de página, escribimos un encabezado, nos cambiamos al pie, escribimos un pie (cualquiera, solo de ejemplo) y hacemos clic en el botón que detiene la grabadora.

Luego vamos a Herramientas, Macros, Macros, Editar y veremos todo el código ya hecho, listo para ser cortado y pegado en nuestro programa, en este caso sería:

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:= _
“Tomás Bradanovic, Consultoría en Proyectos de Inversión Públ”
    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(“Página X de Y”).Insert Where:=Selection. _
    Range
    ActiveWindow.ActivePane.View.SeekView =     wdSeekMainDocument
End Sub 

Como pueden ver la grabadora de macros escribió por nosotros todo el código que necesitamos, incluso ahora lo podemos analizar y oprimizar para nuestra aplicación en particular. Esata es una manera muy rápida y práctica de ir aprendiendo el modelo de objeto solo a medida que se va necesitando.

1 comentario:

  1. Buen aporte esperamos que sigas compartiendo mas informacion actualizada en especial los snippets

    ResponderEliminar