miércoles, 13 de mayo de 2009

Prototipos en VBA

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.


martes, 12 de mayo de 2009

Ejemplo 1 Programación de 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

lunes, 11 de mayo de 2009

Ejemplo 2, programación de 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

sábado, 9 de mayo de 2009

Ejemplo 3, prototipo de 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