Vous êtes sur la page 1sur 15

Formularios en VBA

Por Moiss Ortz el 14 agosto, 2012

Los formularios en VBA no son ms que un cuadro de dilogo de Excel donde podremos colocar controles que nos ayudarn a solicitar informacin del usuario. Podremos colocar cajas de texto, etiquetas, cuadros combinados, botones de comando, etc.

Crear un formulario en Excel


Los formularios de Excel son creados desde el Editor de Visual Basic donde debemos seleccionar la opcin de men Insertar y posteriormente la opcin UserForm.

Inmediatamente se mostrar un formulario en blanco y de igual manera podrs observar el Cuadro de herramientas:

Si no ves el Cuadro de herramientas puedes seleccionar el men Ver y la opcin Cuadro de herramientas.

Agregar controles al formulario


Para agregar un control al formulario debes seleccionarlo del Cuadro de herramientas y dibujarlo sobre el formulario. En mi formulario he agregado etiquetas y cuadros de texto as como un par de botones de comando:

El texto de las etiquetas se modifica en la propiedad llamada Caption. Para realizar este cambio solamente selecciona el control y se mostrar la ventana de Propiedades donde podrs hacer la modificacin. De igual manera el texto desplegado en los botones de comando se modifica en su propiedad Caption.

Cdigo para el botn Cancelar


El botn cancelar cerrar el formulario sin guardar la informacin capturada en ningn lugar. El cdigo que debemos utilizar es el siguiente:
Private Sub CommandButton2_Click() Unload Me End Sub

Para agregar este cdigo puedes hacer doble clic sobre el control. La sentencia Unload Me cerrar el formulario.

Cdigo para el botn Aceptar


A diferencia del botn Cancelar, el botn Aceptar colocar los datos de las cajas de texto en las celdas A1, B1 y C1. El cdigo utilizado es el siguiente:
Private Sub CommandButton1_Click() Worksheets("Hoja1").Range("A1").Value = Me.TextBox1.Value Worksheets("Hoja1").Range("B1").Value = Me.TextBox2.Value Worksheets("Hoja1").Range("C1").Value = Me.TextBox3.Value End Sub

Al pulsar el botn Aceptar se transferirn los valores de los controles TextBox hacia las celdas de la Hoja1.

Botn para abrir formulario

Para facilitar la apertura del formulario puedes colocar un botn ActiveX en la hoja con el siguiente cdigo:
Private Sub CommandButton1_Click() UserForm1.Show End Sub

Probar el formulario
Observa cmo cada uno de los botones realiza la accin correcta al pulsarlos:

Ejemplo: Libro Mayor en Excel desde el CONCAR mediante SQL y Macros


Antes de exponer los aplicativos mencionados en la parte introductoria, la idea es que el usuario contable o aquellos que deseen iniciarse en programacin de software contables mediante VBA de Excel, observen de modo prctico lo potente y til que puede resultar obtener conocimientos sobre manejo de base de datos y aplicarlo a su trabajo diario.

Es conocido que en el actual mercado laboral uno de los softwares contables ms utilizados es el CONCAR de la empresa Real System. Por ello, este primer ejemplo estar relacionado a este software.

Ms adelante en este mismo blog publicare conexiones al SAP, Siscont, Starsoft, etc. Todo en ello fines didcticos y en base a la experiencia acumulada en las diferentes empresas en donde he laborado. Obviamente estas empresas cuentan con las licencias originales correspondientes y el cdigo de programacin expuesto en este blog es creacin particular de quien suscribe.

Para quienes tienen experiencia utilizando CONCAR saben que los reportes que genera en formato Excel contiene los datos columnados pero muchas veces con espacios adicionales, por ejemplo: Si el nmero de la cuenta de caja chica chica es "10201" el reporte en excel muestra "10201 ".

Para quienes desean analizar cuentas, efectuar consistencias antes de declaraciones de impuestos o revisar los reportes antes de presentarlos, tratar de cruzar los datos usando frmulas de bsqueda, tablas dinmicas, etc; y llegar al formato correcto, puede significar un tiempo adicional.

Adems para generar el libro Mayor de 2 ms empresas y/o para generar reportes de 2 ms periodos es necesario abrir 2 ms instancias (Ventanas) del CONCAR.

Por otro lado, el CONCAR muestra el plan de cuentas sin los saldos, es decir cuentas con movimientos y sin movimientos, resulta ms til para el usuario mostrar slo las cuentas que tienen registros y luego proceder a generar el libro Mayor.

Tambin es conocido si Ud. cuenta con la versin DBase del CONCAR primero tiene que Consolidar, tal vez primero haya tenido que Reindexar, etc.

Pues con cuatro Controles Active X y una conexin SQL puede obtener los movimientos de cuenta bien columnados sin la necesidad de formatear, reindexar, consolidar, abrir varias instancias del CONCAR y todo ello En segundos!

Para lograr esto sigue el siguiente procedimiento:

1.

Ejecuta Excel e inserta un libro vacio, guarda el archivo con el nombre MAYOR (Aplicacin) [Si trabajas con Excel 2007 o superior debes de guardar el archivo como Libro de Excel habilitado para Macros]

2.

Cambia el nombre de la hoja a: MAYOR

3.

Digita los encabezados desde las celda A8 hasta la celda O8, tal como se muestra en la siguiente figura:

4.

Desde la ficha Programador (para la versin Excel 2007 o superior) o desde la barra de herramientas Cuadro de Controles (para la versin Excel 2003 o inferior) inserta 3 cuadros combinados y 1 botn de comando en la hoja de clculo MAYOR

5.

Selecciona el 1er. cuadro combinado, Presiona el botn derecho del mouse, Seleccione Propiedades, Cambie el valor de la propiedad (Name) ComboBox1 por cbo_Empresa

6.

Selecciona el 2do. cuadro combinado, Presiona el botn derecho del mouse, Selecciona Propiedades, Cambia el valor de la propiedad (Name) ComboBox2 por cbo_Ao

7.

Selecciona el 3er. cuadro combinado, Presiona el botn derecho del mouse, Selecciona Propiedades, Cambia el valor de la propiedad (Name) ComboBox3 por cbo_Cta

8.

Seleccione el botn de comando, Presiona el botn derecho del mouse, Selecciona Propiedades, Cambia el valor de la propiedad (Name) CommandButton1 por cmd_Mayor y el valor de la propiedad Caption CommandButton1 por EJECUTAR

9.

En la ficha programador presiona Modo Diseo para desactivarlo

10.

Presiona Alt + F11 para ejecutar el Editor de Visual Basic

11.

Presiona Ctrl + R para ejecutar el explorador de proyectos

12. Presiona Doble Click sobre ThisWorkbook (Este libro), asegrese de presionar doble click sobre el objeto ThisWorkbook del libro MAYOR (Aplicacin) [Cada libro de Excel contiene un objeto ThisWorkbook]. Copia el siguiente cdigo y pegalo en el mdulo que acaba de abrir al presionar doble click sobre ThisWorkbook:

Private Sub Workbook_Open() Sheets("MAYOR").cbo_Empresa.Clear Sheets("MAYOR").cbo_Ao.Clear Sheets("MAYOR").cbo_Cta.Clear Sheets("MAYOR").cbo_Empresa Sheets("MAYOR").cbo_Ao Sheets("MAYOR").cbo_Cta = "" Set con = CreateObject("adodb.connection") Set rs = CreateObject("adodb.recordset") con.Open "Provider=Microsoft.Jet.OLEDB.4.0; Source=C:\Concar80;Extended Properties = dBase 5.0;" Data

= =

"" ""

rs.Open "SELECT CT_CIA, CT_NOMBRE FROM CTCIAS ORDER BY CT_CIA", con Do While Not rs.EOF Sheets("MAYOR").cbo_Empresa.AddItem Right(rs![CT_CIA].Value, 2) & " " & rs![CT_NOMBRE].Value rs.MoveNext Loop

Set rs = Nothing Set con = Nothing End Sub

13.

Presiona Doble Click sobre Hoja1 (MAYOR). Copia el siguiente cdigo y pegalo en el mdulo que acaba de abrir al presionar doble click sobre Sheet1 (MAYOR):

Private Sub cbo_Empresa_Change() If Sheets("MAYOR").cbo_Empresa <> "" Then Sheets("MAYOR").cbo_Ao.Clear Dim Archivo As String Archivo = Dir("C:\Concar80\CCO*.dbf") Do Until Archivo = "" If Left(Archivo, 5) = "CCO" & Left(Sheets("MAYOR").cbo_Empresa, 2)Then Sheets("MAYOR").cbo_Ao.AddItem Left(Right(Archivo, 6), 2) End If

Archivo = Dir Loop End If End Sub

Private Sub cbo_Ao_Change() If Sheets("MAYOR").cbo_Ao <> "" Then Sheets("MAYOR").cbo_Cta.Clear Set con = CreateObject("adodb.connection") Set rs = CreateObject("adodb.recordset") con.Open "Provider=Microsoft.Jet.OLEDB.4.0; Source=C:\Concar80;Extended Properties = dBase 5.0;" Data

rs.Open "SELECT CT_FILE FROM CTCIAS WHERE CT_NOMBRE = '" & Right(Sheets("MAYOR").cbo_Empresa, Len(Sheets("MAYOR").cbo_Empresa) - 3) & "'", con Plan_de_Cuentas = Right(rs![CT_FILE], 2) rs.Close Correlativo = Sheets("MAYOR").cbo_Ao Left(Sheets("MAYOR").cbo_Empresa, 2) &

rs.Open "SELECT DCUENTA, CPL" & Plan_de_Cuentas & ".PDESCRI, SUM(IIF(CCD" & Correlativo & ".DDH='D',CCD" & Correlativo & ".DMNIMPOR,-CCD" & Correlativo & ".DMNIMPOR)) AS 'SALDO MN', SUM(IIF(CCD" & Correlativo & ".DDH='D',CCD" & Correlativo & ".DUSIMPOR,-CCD" & Correlativo & ".DUSIMPOR)) AS 'SALDO US' FROM CCD" & Correlativo & ", CPL" & Plan_de_Cuentas & " WHERE DSUBDIA <> '99' AND CCD" & Correlativo & ".DCUENTA = CPL" & Plan_de_Cuentas & ".PCUENTA GROUP BY DCUENTA, CPL" & Plan_de_Cuentas & ".PDESCRI", con Do While Not rs.EOF Soles = Format(rs!['SALDO MN'].Value, "#,##0.00") Dolares = Format(rs!['SALDO US'].Value, "#,##0.00") Sheets("MAYOR").cbo_Cta.AddItem rs![DCUENTA].Value rs![PDESCRI].Value & " S/. " & Soles & " US$ " & Dolares rs.MoveNext Loop Set rs = Nothing & " " &

Set con = Nothing End If End Sub

Private Sub cmd_Mayor_Click() If Sheets("MAYOR").cbo_Empresa <> "" And Sheets("MAYOR").cbo_Ao "" And Sheets("MAYOR").cbo_Cta <> "" Then Range("A9:IV65536").ClearContents If ActiveSheet.AutoFilterMode = True Then Range("A4").AutoFilter End If Set con = CreateObject("adodb.connection") Set rs = CreateObject("adodb.recordset") con.Open "Provider=Microsoft.Jet.OLEDB.4.0; Source=C:\Concar80;Extended Properties = dBase 5.0;" Data <>

rs.Open "SELECT CT_FILE FROM CTCIAS WHERE CT_NOMBRE = '" & Right(Sheets("MAYOR").cbo_Empresa, Len(Sheets("MAYOR").cbo_Empresa) - 3) & "'", con Plan_de_Cuentas = Right(rs![CT_FILE], 2) rs.Close Correlativo = Sheets("MAYOR").cbo_Ao Left(Sheets("MAYOR").cbo_Empresa, 2) &

rs.Open "SELECT DSUBDIA, DCOMPRO, DSECUE, DFECCOM2, DCUENTA, CPL" & Plan_de_Cuentas & ".PDESCRI, DCODANE, DCENCOS, DCODMON, DTIPDOC, DNUMDOC, DXGLOSA, IIF(CCD" & Correlativo & ".DDH='D',CCD" & Correlativo & ".DMNIMPOR,-CCD" & Correlativo & ".DMNIMPOR) AS 'SALDO MN', IIF(CCD" & Correlativo & ".DDH='D',CCD" & Correlativo & ".DUSIMPOR,-CCD" & Correlativo & ".DUSIMPOR) AS 'SALDO US', (YEAR(CCD" & Correlativo & ".DFECCOM2) & '-' & FORMAT(MONTH(CCD" & Correlativo & ".DFECCOM2),'00')) AS 'PERIODO' FROM CCD" & Correlativo & ", CPL" & Plan_de_Cuentas & " WHERE CCD" & Correlativo & ".DCUENTA = CPL" & Plan_de_Cuentas & ".PCUENTA AND DCUENTA = '" & Left(Sheets("MAYOR").cbo_Cta, Application.WorksheetFunction.Search(" ", Sheets("MAYOR").cbo_Cta) - 1) & "'", con Range("A9").CopyFromRecordset rs Set rs = Nothing

Set con = Nothing Cells.Columns.AutoFit Range("F1").ColumnWidth = 28 Range("A9").Select Else MsgBox "Complete los datos y Ejecute", vbInformation End If End Sub

14.

Importante: Desde el Editor de Visual Basic presiona Ctrl + H y reemplaza la ruta C:\Concar80 por la ubicacin de tu sistema contable (Por ejemplo W:\Concar80\REAL), en todo el Proyecto actual, algo similar a la siguiente figura:

15.

Presiona Alt + F4 para cerrar el editor de Visual Basic

16.

Guarde los cambios

17.

Cierre el libro y vuelva a abrirlo para probar su funcionamiento Si Ud. procedi con orden en todos los pasos anteriores y logro funcionar correctamente el aplicativo: FELICITACIONES! Eres ordenado! Sin embargo para quienes nunca han visto el editor de Visual Basic o han grabado una macro en su vida, esto puede parecer demasiado abrumador. La idea es que sigas los pasos mecnicamente para luego interesarte en el manejo de base de datos y la programacin aplicada al entorno contable.

Hasta aqu, y de golpe! Has podido conocer lo potente que resultaba Excel y el Editor de Visual Basic. Has interactuado con mdulos, el explorador de proyectos, Controles Active X, copiado y pegado sentencias que utilizan Manejadores de Eventos, Declaracin de variables Dim, Estructuras: If End If, Bucles o Ciclos: Do Until Loop y Do While Not Loop, Funcin Dir, programacin sobre la biblioteca de objetos de Excel, Conexiones ADO y para colmo Consultas SQL. Si te ha resultado interesante, deseas desarrollarte es este campo y adquirir una ventaja competitiva frente a tus colegas, te recomiendo participes del curso de Excel Avanzado, Macros y VBA que dictan varias Universidades e Institutos del pas. Asimismo, la lectura de bibliografa relacionada como por ejemplo: Microsoft Excel Visual Basic para Aplicaciones Paso a Paso de Reed Jacobson Microsoft Press. La siguiente entrada del blog tratar de exponer un aplicativo para: Calcular Detracciones Imprimir la constancia de clculo Migrar de manera masiva los lotes de detracciones hacia el portal web de SUNAT Luego de pagar las detracciones, registrarlas masivamente hacia el sistema contable Ello en concordancia con las normas tributarias, poltica contable, evitando errores en el clculo, minimizando costos (El pago de la detraccin individual es de S/. 3.50 por cada una) (El pago por n detracciones, a travs del pago masivo, es de S/. 10.50) y mejorando el proceso de registro contable: Sin errores y ms rpido!

Hola necesito intertar filas automaticamente en excel despues de terminar de rellenar una primera columna,no quisiera perder los enlaces a las demas hojas libro mayor y balance de sumas y saldo y plan general contable. el archivo no lo pude subir porque es de 258kb o algo asi. pero bueno intento explicarlo.el formato del libro diario es de la siguiente manera. n asiento...fecha....grupo...subgrupo...subcuenta.....concepto....debe....haber 1...............13-5....... 4....... 43.............430.............clientes.....300 2................14-5...... 4........40.............400.............proveedor.............300 ahora explico: -n de asiento es automatico donde a1 =1 y a2 = 1+a1 y asi sucesivamente para que se pongan automaticamente -subcuenta es el numero que pongo y luego automaticamente se rellena grupo,subgrupo y concepto(estan enlazadas con la hoja plan general contable) -luego debe y haber tambien los pongo yo - al final del todo hay un total de deb y total del haber que se utiliza para saber si el libro diario esta bien pues si el total del debe = al total del haber significa que esta bien. con lo cual las unicas celdas que no estan protegidas serian fecha,subcuenta,debe y haber bien pues me gustaria que al terminar de rellenar la primera fila automaticamente se inserte una para seguir rellenando datos de tal manera que guarde las formulas,asi solo usaria filas que necesite y teniendo en cuenta que hay veces que solo se rellenara la fila hasta el debe y otras veces hasta el haber