UN EJEMPLO SENCILLO DE PROGRAMACION EN EXCEL

Siguiendo el esquema de introducir el VBA mediante ejemplos simples y fáciles de reproducir, esta vez les presento una macro que permite crar un documento tipo factura en una hoja de cálculo. Se trata de un ejemplo rudimentario al que se le han sacado todos los detalles para hacer más fácil su comprensión 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 Módulo1) 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 botón de comando como muestra la figura:

Esta vez me pondre un poco más 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 Tamaño, Ambos, dejo a todos los textbox del mismo tamaño y usando Formato, Alinear, Izquierda los dejo bien alineados. También puedo usar Espaciado Vertical, Igualar para que queden bien espaciados.

Enseguida usando Ver, Orden de tabulación me aseguro que cada vez que coloco enter el foco se corra correctamente al textbox que corresponda. Asi el ordern de tabulación debe quedar: tcliente, tdireccion, trut, tarticulo, tcantidad y luego todos los demás 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 código 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 tenía que calcular el total sumando la columna de los subtotales. Como yo no sabia el código para programar una suma, simplemente me fui a Herramientas, Macro, Grabar Macro y luego hice la operación de forma manual (escribiendo la fórmula en la celda deseada). Luego volví a Herramientas, Detener Grabación y examiné el código que apareció en un nuevo módulo, 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 correspondía. Finalmente agregué el código 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 más 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 (también podría 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 títulos, coloqué los cuadriculados, centrados, negrita, etc. Luego Herramientas, Macros, Detener Grabación y corté y pegué a continuación el código 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 = "Dirección"
Range("B8").Select
ActiveCell.FormulaR1C1 = "Artículo"
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 Módulo, borramos el macro recién creado (para que nos quede un código 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 módulo y escribimos

global linea

También podemos aprovechar de colocar algunos comentarios con propaganda o lo que se nos ocurra en éste módulo. Y ya tenemos listo nuestro ejemplo, solo falta programar un atajo para lanzarlo de manera rápida. 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.zip" que se adjunta a esta lección.

Ahora les dejo las siguientes tareas para la casa:

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

Suerte!

 

Autor: Tomás Bradanovic
http://members.spree.com/sip/tombrad

Entrega 1 - Entrega 2 - Entrega 3 - Entrega 4 - Entrega 5 - Entrega 6 - Entrega 7 - Entrega 8 - Entrega 9
Descargar