Está en la página 1de 66

Factura CBB 2012 en Excel

PRIMER POST ES MI ESTA ES UNA FACTURA CON LOS REQUISITOS FISCALES ACTUALIZADOS AL 2012 EL LIBRO NO ESTA PROTEGIDO SOLO LAS MACROS ESTAN PROTEGIDAS CON COTRASEAS QUE CARACTERISTICAS TIENE 1. DAR DE ALTA CLIENTES DESDE LA PAGINA DONDE SE FACTURA 2. BUSQUEDA DE CLIENTES SIN NECESIDAD DE CAMBIAR DE PAGINA CON TABLAS DINAMICAS(SOLO HAY QUE ACTUALIZAR CADA VEZ QUE INGRESA UNO NUEVO) 3.-REALIZA UN LISTADO DE FACTURAS EMITIDAS 4.-REALIZA LISTA DE MERCANCIAS FACTURADAS POR SEPARADA TIENE PARA REALIZAR REMISIONES TIENE LAS MISMAS FUNCIONES ADICIONALMENTE DENTRO DE PAGINA MERCANCIA EN REMISION SE PUEDE FACTURAR TODAS LAS REMISIONES DE UN CLIENTE O UNA REMISION PUEDE FACATURAR HASTA 30 REMISIONES EN UNA SOLA FACTURA RESUME LAS OPERACIONES DE TODAS LOS DETALLES DE LAS REMISIONES Y LAS CONCENTRA EN LA FACTURA DE MANERA AUTOMATICA. CON A LIMITACIN QUE SI REBASA 25 ARTICULOS SE TENDRAN QUE HACER EN DOS FACTURAS DIFERENTES. DESVENTAJAS: TIENES QUE SABER MANEJAR EXCEL EN UN NIVEL BASICO VENTAJAS: ES GRATIS ES DE MI AUTORIA.

Excel + VBA - Formulario de Captura


Eso de estar capturando en excel cien mil registros donde hay que poner el raton en una celda, luego en otra. Eso de estar perdiendo la celda activa y luego buscarla... son cosas que se pueden corregir usando un formulario de captura. En este ejemplo vamos a implementar una pequea ventana de captura en la cual vamos a observar que VBA para excel es muy facil y rapido de usar. Mi pc: Windows 7 home basic Office 2010

Ejemplo de creacion de una ventana para capturar datos en excel. - abre excel y de inmediato guarda el libro como captura.xls o captura.xlsm si usas office 2010 debes guardar el libro como habilitado para ejecutar macros. en 2007 creo que solo tenias que darle permisos. en anteriores de 2007 lo guardas como un libro normal pero hay que deshabilitar la seguridad. - renombra las dos primeras hojas que te crea automaticamente el libro como: hoja1 = CATALOGO hoja2 = CAPTURA - la tercera hoja eliminala asi debe quedar

- pasate a CATALOGO y escribe lo siguiente en las celdas indicadas: A1 = producto, B1 = precio - pasate a CAPTURA y escribe lo siguiente en las celdas indicadas A1 = nota, B1 = producto, C1 = precio, D1 = fecha ponle un sombreado pa que quede mu' bonito. asi deberia quedar: catalogo

captura

IMPORTANTE: los encabezados deben ir en las celdas indicadas y las hojas no deben tener otro nombre. Si cambias la ubicacion de los encabezados o el nombre de las hojas probablemente tengas errores en la ejecucion. bien, ahora que ya tenemos la "base de datos", vamos por lo mas encantador de este asunto. - Pulsa ALT + F11 y se abrira la ventana de VBA de Excel. Si tienes experiencia en programacion de inmediato sabras de que se trata, si eres novato entonces no te asustes. vba es un aliado, no un enemigo. - ahora inserta un UserForm o formulario. esto lo puedes hacer desde el menu insertar o desde el boton insertar del toolbar.

Nota - antes de cambiar una propiedad del UserForm hay que seleccionarlo dandole click el mismo. - Cambiale el nombre al UserForm a frmCaptura eso lo haces en la ventana de propiedades que est abajo del explorador de proyecto. en donde dice name le quitas UserForm1 y le pones frmCaptura. - Cambiale el texto mostrado en el titulo del form. esto lo haces en la misma ventana de propiedades. en donde dice caption le pones [Ejemplo de captura] - tu_nombre

- Haz click de nuevo en el form y debe aparecer el cuadro de herramientas del form. si no aparece entonces haces click en Ver>>Cuadro de Herramientas. - Desde el cuadro de Herramientas arrastra el boton ETIQUETA o LABEL al formulario. (es el que tiene una A mayuscula) - Repite la operacion pero con el boton CUADRO DE TEXTO o TEXTBOX. (el que tiene ab| en minusculas) - Selecciona la etiqueta que insertaste y le cambias el nombre por lblNota y el texto mostrado por No. Nota esto lo haces seleccionando la etiqueta y luego en la ventana de propiedades cambias name y caption. - Selecciona el cuadro de texto y cambiale solo el nombre por txtNoNota. Esto lo haces igual que en la etiqueta pero solo vas a cambiar la propiedad name. - ajusta los tamaos de la etiqueta y del cuadro de texto para que se vean mejor. Para ajustar el tamao y posicion se hace igual que en power point. as debe quedar en primera instancia:

como podras ver, los nombres de los controles se crean usando un prefijo que explique su tipo + una palabra corta que explique su funcion o dato a almacenar. Los nombres no deben llevar espacios ni caracteres especiales. los prefijos usados en este ejemplo son: lbl = etiqueta txt = cuadro de texto cmd = boton de comando o CommandButton bien. ahora, de la misma manera vamos a insertar 3 etiquetas mas y 3 cuadros de texto y les vamos a poner las propiedades siguientes: Etiquetas: name, caption respectivamente lblProducto Producto lblPrecio Precio lblFecha Fecha Cuadro de Texto: name txtProducto txtPrecio txtFecha ahora inserta dos botones de comando o commandbutton y les pones las siguientes propiedades: Boton de Comando: name, caption cmdAceptar Aceptar

cmdCancel Cancelar - ajusta los tamaos y las posiciones para que queden bien a la vista de los usuarios. deberia quedar algo parecido a esto:

- probando el formulario [je je je] pulsa f5, entonces observaras(si miras muy rapidamente) que la ventana de VBA se minimiza y te regresas a excel, pero con el formulario ejecutado. Cuando un formulario se esta ejecutando, excel queda en segundo plano y solo se puede usar el formulario y lo que tenga dentro. A eso se llama estar en MODAL. En este nivel puedes desplazarte y escribir en los cuadros de texto pero los botones no funcionan!!! eso es porque tenemos que decirles lo que deben hacer al oprimirse. Mientras no programemos cada boton, estos seran solo objetos inutiles ocupando memoria. y bueno, aqui nadie quiere inutiles y es por eso que vamos a la parte mas sencilla del post: la implementacion del codigo :p - Si aun esta ejecutando el formulario, cierralo y regresate al entorno de VBA. - Haz doble click en el boton de comando cmdAceptar - se debe abrir una nueva ventana parecida a un editor de textos. en esta ventana vamos a escribir algunos comandos que se van a ejecutar cuando se presione el boton. estos comandos deben ser correctos, de lo contrario el form no se ejecutara y marcara error. tratare de poner sintaxis de lo mas basico para que sea entendido. - en la ventana codigo, debe estar escrito el encabezado y el final del evento click del boton cmdAceptar este encabezado debe decir algo como Private Sub cmdAceptar_Click() y el final debe decir End Sub. entre el encabezado y el final vamos a escribir lo siguiente: Private Sub cmdAceptar_Click() If Me.txtFechadeIngreso.text = "" Then MsgBox ("Fecha de Ingreso no puede

estar vacio" ): Exit Sub If Me.txtCodContribuyente.text = "" Then MsgBox ("Cod. Contribuyente no puede estar vacio" ): Exit Sub If Me.txtNombresyApellidos.text = "" Then MsgBox ("Nombres y Apellidos no puede estar vacio" ): Exit Sub If Me.CeduladeIdentidad.text = Then MsgBox (Cedula de Identidad no puede estar vacio): Exit Sub If Me.txtDireccion.text =Then MsgBox (Direccion no puede estar vacio): Exit Sub If Me.BarrioComarca.text = Then MsgBox (Barrio/Comarca no puede estar vacio): Exit Sub If Me.Municipio.text = Then MsgBox (Municipio no puede estar vacio): Exit Sub If Me.MicroRegiontext=Then MsgBox(Micro Region no puede estar vacio):Exit Sub If Me.NTelefono.text = Then MsgBox (N Telefono no puede estar vacio): Exit Sub If Me.Debe.text = : Exit Sub If Sheets("CONTR.IBI").Range("A4"). Value = "" Then Sheets("CONTR.IBI").Range("A4"). Value = Me.txtFechadeIngreso.text Sheets("CONTR.IBI).Range("B4"). Value = Me.txtCodContribuyente.text Sheets("CONTR.IBI").Range("C4"). Value = Me.txtNombresyApellidos.text Sheets(CONTR.IBI).Range(D4). Value= Me.txtCeduladeIdentidad.text Sheets("CONTR.IBI").Range("E4"). Value = Me.txtDireccion.text Sheets(CONTR.IBI).Range(F4). Value= Me.txtBarrioComarca.text Sheets(CONTR.IBI).Range(G4). Value= Me.txtMunicipio.text Sheets(CONTR.IBI).Range(H4). Value= Me.txtMicroRegion.text Sheets(CONTR.IBI).Range(I4). Value= Me.txtNdeTelefono.text Sheets(CONTR.IBI).Range(N4). Value= Me.txtDebe.text Else Sheets("CONTR.IBI" ).Range("A1" ).End(xlDown)(xlDropDown).Value = Me.txtFechadeingreso.text Sheets("CONTR.IBI" ).Range("A1" ).End(xlDown).Next.Value = Me.txtCodContribuyente.text Sheets("CONTR.IBI" ).Range("A1" ).End(xlDown).Next.Next.Value = Me.txtNombresyApellidos.text Sheets("CONTR.IBI" ).Range("A1" ).End(xlDown).Next.Next.Next.Value = Me.txtCeduladeIdentidadDireccion.text Sheets(CONTR.IBI).Range(A1 ).End(xIDOWN).Next.Next.Next.Next.Value = Me.txtDireccion.text Sheets(CONTR.IBI).Range(A1.End(xIDOWN).Next.Next.Next.Next.Next.V alue= Me.txtBrrioComarca.text Sheets(CONTR.IBI).Range(A1).End(xIDOWN).Next.Next.Next.Next.Next.N ext.Value= Me.txtMunicipio.text Sheets(CONTR.IBI).Range(A1).End(xIDOWN).Next.Next.Next.Next.Next.N ext.Next.Value= Me.txtMicroRegion.text Sheets(CONTR.IMI).Range(A1).End(xIDOWN).Next.Next.Next.Next.Next. Next.Next.Next.Value= Me.txtNTelefono.text Sheets(CONTR.IMI).Range(A1).End(xIDOWN). Next.Next.Next.Next.Next.Next.Next.Next.Next.Next.Next.Next.Next.Value= Me.txtDebe.text

End If Me.txtFechadeIngreso.text Me.txtCodContribuyente.text Me.txtNombresyApellidos.text Me.txtCeduladeIdentidad.text Me.txtDireccion.text Me.txtBarrioComarca.text Me.txtMunicipio.text Me.txtCeduladeIdentidad.text Me.txtefono.text Me.txtActividadComercial.text Me.txtRazonSocial.text Me.txtFechadePago.text Me.txtMesPagado.text Me.txtFechaPO.text Me.txtMatricula.text Me.txtMensual.text Me.txtRotulo.text Me.txtFechadeIngreso.SetFocus End Sub Private Sub cmdAceptar_Click() If Me.txtFechadeIngreso.text = "" Then MsgBox ("Fecha de Ingreso no puede estar vacio" ): Exit Sub If Me.txtCodContribuyente.text = "" Then MsgBox ("Cod. Contribuyente no puede estar vacio" ): Exit Sub If Me.txtNombresyApellidos.text = "" Then MsgBox ("Nombres y Apellidos no puede estar vacio" ): Exit Sub If Me.CeduladeIdentidad.text = Then MsgBox (Cedula de Identidad no puede estar vacio): Exit Sub If Me.txtDireccion.text =Then MsgBox (Direccion no puede estar vacio): Exit Sub If Me.BarrioComarca.text = Then MsgBox (Barrio/Comarca no puede estar vacio): Exit Sub If Me.Municipio.text = Then MsgBox (Municipio no puede estar vacio): Exit Sub If Me.MicroRegiontext=Then MsgBox(Micro Region no puede estar vacio):Exit Sub If Me.NTelefono.text = Then MsgBox (N Telefono no puede estar vacio): Exit Sub If Me.Debe.text = : Exit Sub If Sheets("CONTR.IBI").Range("A4"). Value = "" Then Sheets("CONTR.IBI").Range("A4"). Value = Me.txtFechadeIngreso.text Sheets("CONTR.IBI).Range("B4"). Value = Me.txtCodContribuyente.text Sheets("CONTR.IBI").Range("C4"). Value = Me.txtNombresyApellidos.text Sheets(CONTR.IBI).Range(D4). Value= Me.txtCeduladeIdentidad.text Sheets("CONTR.IBI").Range("E4"). Value = Me.txtDireccion.text Sheets(CONTR.IBI).Range(F4). Value= Me.txtBarrioComarca.text Sheets(CONTR.IBI).Range(G4). Value= Me.txtMunicipio.text

Sheets(CONTR.IBI).Range(H4). Value= Me.txtMicroRegion.text Sheets(CONTR.IBI).Range(I4). Value= Me.txtNdeTelefono.text Sheets(CONTR.IBI).Range(N4). Value= Me.txtDebe.text Else Sheets("CONTR.IBI" ).Range("A1" ).End(xlDown)(xlDropDown).Value = Me.txtFechadeingreso.text Sheets("CONTR.IBI" ).Range("A1" ).End(xlDown).Next.Value = Me.txtCodContribuyente.text Sheets("CONTR.IBI" ).Range("A1" ).End(xlDown).Next.Next.Value = Me.txtNombresyApellidos.text Sheets("CONTR.IBI" ).Range("A1" ).End(xlDown).Next.Next.Next.Value = Me.txtCeduladeIdentidadDireccion.text Sheets(CONTR.IBI).Range(A1 ).End(xIDOWN).Next.Next.Next.Next.Value = Me.txtDireccion.text Sheets(CONTR.IBI).Range(A1).End(xIDOWN).Next.Next.Next.Next.Next. Value= Me.txtBarrioComarca.text Sheets(CONTR.IBI).Range("A1).End(xIDOWN).Next.Next.Next.Next.Next. Next.Value= Me.txtMunicipio.text Sheets(CONTR.IBI).Range(A1).End(xIDOWN).Next.Next.Next.Next.Next. Next.Next.Value= Me.txtMicroRegion.text Sheets(CONTR.IBI).Range(A1).End(xIDOWN).Next.Next.Next.Next.Next. Next.Next.Next.Value= Me.txtNTelefono.text Sheets(CONTR.IBI).Range(A1).End(xIDOWN). Next.Next.Next.Next.Next.Next.Next.Next.Next.Next.Next.Next.Next.Value= Me.txtDebe.text End If Me.txtFechadeIngreso.text Me.txtCodContribuyente.text Me.txtNombresyApellidos.text Me.txtCeduladeIdentidad.text Me.txtDireccion.text Me.txtBarrioComarca.text Me.txtMunicipio.text Me.txtMicroRegion.text Me.txtNTelefono.text Me.txtDebe.text Me.txtFechadeIngreso.SetFocus End Sub asi debe verse en el editor:

bien, ahora ya puedes cerrar esa horrenda ventana de codigo pero falta el boton de cancelar. - Haz doble click en el boton cmdCancel y se abrira su respectiva ventana de codigo... bueno, no es su respectiva ya que la comparte con los demas controles, pero el nombre de su evento y el final aparece ya insertado.

bueno, este boton de cancelar lo unico que debe hacer es, como dice su

nombre, cancelar la captura actual y eso significa limpiar todas las cajas de texto y enfocar la primera para la siguiente captura. Tons, entre el encabezado y el final ponemos las siguientes lineas: Private Sub cmdCancel_Click() Me.txtNoNota.text = "" Me.txtProducto.text = "" Me.txtPrecio.text = "" Me.txtFecha.text = "" Me.txtNoNota.SetFocus End Sub asi debe quedar el codigo

ya ya tenemos los dos botones funcionales. ahora pulsa F5 y el formulario se va a ejecutar. captura unos registros de prueba. bien hasta aqui, pero puede ser un poco incomodo que cada vez que quieras ejecutar el formulario tengas que abrir VBA para darle F5. Por eso vamos a crear una macro que nos permita llamar a esa ventana de captura desde el mismo excel. - en la ventana VBA, cHaz click en insertar(ya sea en el menu o desde el toolbar) y escoges MODULO - se va a crear un modulo nuevo que no es mas que una ventana de codigo pero que no esta ligada a ningun formulario y ademas esta en blanco, no tiene ningun encabezado ni final. - ahi vamos a escribir lo siguiente: Public Sub iniciar_Captura() frmCaptura.Show End Sub

y eso es todo. Antes de terminar con la ventana de VBA, asegurate que el orden de los controles sea el correcto, osea, que cuando pulses enter o tab se debe activar el control de abajo inmediato y no el de arriba o el ultimo. Si el orden es incorrecto, entonces, tienes que cambiar la propiedad TABINDEX de cada control para corregirlo. tabindex es un valor que va de 0 en adelante y, obviamente, es el orden de los controles. solo debes corregir el orden de los controles interactivos, las etiquetas no importan pero los cuadros de texto y botones ponlos en el orden que desees. para este ejemplo el orden es el siguiente: txtNoNota 0 txtProducto 1 txtPrecio 2 txtFecha 3 cmdAceptar 4 cmdCancel 5 ahora ya puedes cerrar el VBA y quedarte solo con excel guarda el archivo. tons vamos a probarlo. - estando en excel pulsa ALT + F8 y te va a aparecer la ventana de macros con una macro que se llama Iniciar_captura - ejecuta esa macro y te va a aparecer la ventana de captura.

- como bien dije al principio, el codigo es muy basico pero se puede hacer robusto para mayor comodidad del usuario. - una base de datos + lenguaje de programacion es mejor, incluso access, pero en algunos lugares no te permiten usar nada excepto excel y word, y puedes hacerte la vida mas facil y rapida de esta manera. - la hoja de catalogo es para una proxima implementacion de autocompletado al momento de capturar - el ejemplo es basico pero puedes modificar la hoja y el formulario para poner mas campos. - las cajas de texto podrian buscar contenido automatico para disminuir la carga de trabajo del usuario. - limitar el numero de caracteres de cada caja de texto - etc etc etc etc etc etc etc el libro de ejemplo lo pueden descargar desde aqui: https://skydrive.live.com/? cid=6a76bcfd39519eae&resid=6A76BCFD39519EAE! 379&id=6A76BCFD39519EAE%21379#!/? cid=6A76BCFD39519EAE&id=6A76BCFD39519EAE%21380

Excel + VBA - Ejemplo de Facturacion. Segundo post dedicado a excel. Hoy me he levantado muy temprano y de buen humor. Y es por eso mismo que en vez de meterle mano al formulario del post anterior, he decidido brincarme todo el rollo y publicar una propuesta de un archivo que nos permita imprimir una factura, incluyendo su modulo de clientes y productos. Antes de empezar, la configuracin de mi pc: - Windows Home Basic. - Office 2010 Consideraciones - el cdigo VBA es el mismo de Visual basic 6, por lo que debe funcionar tambin en versiones anteriores a excel 2010. De todos modos, el cdigo que vamos a escribir ser de lo ms sencillo para brincar esa cuestion. Se podra escribir un cdigo bastante robusto y optimo pero eso incrementara las lneas al triple y podra causar confusin a los lectores novatos en programacin. En el post anterior tenemos un ejemplo de cmo insertar datos en hoja desde un formulario. Esa es la misma mecnica que vamos usar, con la nica diferencia que ahora vamos a leer datos de la hoja y a pasarlos al formulario. FORMATEANDO LAS HOJAS bueno, tons, primero abre excel y de inmediato guardas el libro como factura.xls o factura xlsm. En excel 2010 debes guardarlo como libro con ejecucin de macros ( xlsm ) en 2007 creo que solo tienes que habilitar las macros. En anteriores a 2007 da igual.

Ahora, el libro nos crea automticamente 3 hojas. Vamos a cambiarles el nombre como sigue: hoja1 = clientes hoja2 = productos hoja3 = facturas bien, ahora inserta una hoja mas y le pones el nombre de impresin - lo siguiente son los encabezados. En la hoja clientes vamos a escribir lo siguiente es las celdas siguientes: A1 = razn, B1 = rfc, C1 = direccin ingrsale unos cuantos datos

la hoja productos A1 = clave, B1 = descripcin, C1 = precio

ingresale unos cuantos datos

la hoja facturas A1 = factura, B1 = fecha, C1 = razon, D1 = descripcion, E1 = precio, F1 = cantidad, G1 = total

- ahora va la hoja de la impresin. Aqu deberas hacer una rplica de tu factura de papel en la hoja de Excel, pero solo vamos a tomar en cuenta los lugares que hay que llenar, ya que en el papel estn marcados las lneas. En pocas palabras, Excel solo va a imprimir lo que deberas escribir a mano. Por ejemplo, supongamos que nuestra factura de papel en blanco es la siguiente:

AJUSTANDO LA HOJA DE IMPRESION entonces, en excel vamos a hacer una plantilla idntica a la factura, la llenamos con datos ficticios y luego la imprimimos en una hoja reciclada (no en la hoja de la factura). Luego transparentamos la hoja reciclada con la factura y checamos que los espacios que llenamos estn en el lugar correcto que corresponde al papel de la factura.

Este paso hay que repetirlo hasta que, cuando transpongamos la hoja reciclada con la factura original, los lugares queden perfectamente alineados. Finalmente, para comprobar que la plantilla de Excel corresponde al papel de tu factura, scale una copia fotosttica a tu factura e imprimimos la plantilla de Excel en la copia. Si todo corresponde, entonces podemos pasar al siguiente paso.

Guarda el archivo para que no pierdas los cambios, (murphy dice que windows solo falla cuando tienes algo sin guardar en pantalla) DISEO DE LOS FORMULARIOS Pulsa ALT + F11 y se abre la ventana de VBA.

Los formularios a crear son: - captura de clientes - captura de productos - impresin de factura - catalogo de productos - catalogo de clientes - men

sin embargo, la captura de datos simples esta explicado en mi post anterior, por lo que la captura de clientes y de productos la vamos a omitir para centrarnos en la impresin de la factura. La creacin de los formularios omitidos la debes hacer tu mismo. la manera de cambiar las propiedades tambin esta explicado en el post anterior, tambin vamos a omitir esa explicacin. La creacin de formularios e insercin de controles tambin ser omitida, pues esta en el post anterior. los prefijos que vamos a usar para los controles son: lbl = etiqueta o label txt = cuadro de texto o textbox cmb = cuadro combinado o combobox lst = cuadro de lista o listview grb = marco o frame (grb de groupbox, no se nota la influencia de .net) chk = casilla de verificacin o checkbox (el cuadrito que le pones o quitas una palomita) Quiero hacer notar que existe un control grid que facilita la tarea de almacenar datos, pero dado que hay que encontrar su referencia, y a que tambin varia su uso, ubicacin y existencia con el uso de cada versin de windows, no lo vamos a usar. No vamos a agregar ningn control externo para hacer ms compatible este archivo entre ordenadores con diferentes sistemas operativos. bueno, una vez aclarados los puntos anteriores, vamos por el form mas culero: FACTURACION - agrega un nuevo formulario y le pones el nombre de frmFacturacion y caption - IMPRESION DE FACTURA

- inserta los siguientes controles con los siguientes nombres/propiedades: grbDatosCliente con caption = Datos del Cliente, width = 444 y height = 78 (estira el form para que quepa) -- dentro de grbDatosCliente vas a insertar 5 etiquetas y 5 cuadros de texto -----lblRazon con caption = Razon -----lblDireccion con caption = Direccin

-----lblRFC con caption = RFC -----lblFecha con caption = Fecha -----lblNoFactura con caption = No. Factura -----txtRazon -----txtDireccion -----txtRFC -----txtFecha -----txtNoFactura recuerda que a una etiqueta le corresponde a su lado un cuadro de texto con el mismo nombre, por ejemplo, txtRazon va ubicado al lado derecho de lblRazon. Acomoda los espacios de manera que todo quede bien a la vista del usuario:

- ahora inserta 4 cuadros de lista afuera y por debajo del grbDatos Cliente con los siguientes atributos lstCantidad con width = 54 y height = 162 lstDescripcion con width = 227.25 y height = 162 lstPrecio con width = 67.55 y height = 162 lstImporte con width = 77.25 y height = 162 en el orden de creacin, ubcalos a la misma altura uno junto de otro. adems, inserta una etiqueta arriba de cada lista para que el usuario sepa que contiene cada columna: arriba de lstCantidad pones una lblCantidad con caption Cantidad arriba de lst Descripcin pones un lblDescripcion con caption descripcin y as con las otras dos listas restantes. mira nomas que chulo est quedando el form:

- continuamos con la ultima parte de su diseo: inserta tres cuadros de texto debajo inmediato de lstImporte con los siguientes atributos: txtSubtotal con width = 61.5 y enabled = false txtIVA con width = 61.5 y enabled = false (estoy en Mxico, se nota????) txtTotal con width = 61.5 y enabled = false (cuando enabled es falso el control est bloqueado para su uso, cuando es true se puede usar) -estos tres txt's ponles sus correspondientes etiquetas, osea al txtSubtotal le pones a su izquierda un lblSubtotal con caption = Subtotal, y asi con los tres txt's -ademas, inserta un txtLetras debajo del lstCantidad y estiras su tamao hacia la derecha hasta llegar a la lblSubtotal y luego estiras hacia abajo hasta coincidir con lblIVA. Le pones multiline = true, enabled = false. Este txt no lleva etiqueta.

-Agregar un botn de comando llamado cmdBuscar con caption = Buscar Cliente y lo ubicamos en la parte de ms abajo del formulario a la izquierda. -agrega un botn de comando llamado cmdProductos con caption = Productos y ubcalo a la derecha de cmdBuscar -agrega un botn de comando llamado cmdAceptar con caption = Aceptar y ubcalo a la derecha de cmdProductos -agrega una casilla de verificacin o checkbox con nombre chkImprimir y caption = Imprimir al aceptar y ubicala a la derecha de cmdCancel este es el aspecto final que debera tener el formulario:

PROGRAMANDO LOS EVENTOS - haz doble click encima del form en alguna regin donde no tenga ningn control. - aparece la ventana de cdigo. Si te fijas, en la parte de arriba del lado izquierdo tiene el nombre de todos los controles que contiene el formulario, incluyendo el propio formulario pero con el nombre de UserForm, y del lado derecho estn los eventos de los mismos. tons para programar un evento, escogemos en el lado izquierdo el control y del lado derecho el evento a programar.

- escoge el control UserForm (osea, el formulario)

- luego escoge el evento ACTIVATE

- VBA te va a insertar el encabezado y final del evento activate. Las lineas de codigo que pongamos en ese espacio se van a ejecutar cuando formulario se active.

Las lneas de abajo del evento clic las podemos eliminar para no causar confusin. y bueno, escribimos dentro del evento actvate del formulario las siguientes

lneas: Private Sub UserForm_Activate() Me.txtFecha.Text = Date End Sub a continuacin pulsa F5 y verifica que en el txtFecha se ha escrito la fecha automticamente. si hasta aqu todo va bien, continuamos con los eventos de los dems controles como sigue: control cmdAceptar, evento Click Private Sub cmdAceptar_Click() If MsgBox( finalizar la captura de la factura?", vbQuestion + vbYesNo) = vbNo Then Exit Sub guardarFactura MsgBox (chkImprimir.Value) If Me.chkImprimir.Value = True Then ImprimirFactura End Sub control cmdBuscar, evento Click Private Sub cmdBuscar_Click() frmBuscarCliente.Show ' mostrar el formulario de buscar clientes End Sub control cmdProductos, evento Click Private Sub cmdProductos_Click() frmAgregarProducto.Show ' mostrar el formulario de agregar productos End Sub control UserForm, evento activate Private Sub UserForm_Activate() Me.txtFecha.Text = Date ' para poner la fecha cuando se ejecute el form End Sub '-- al final de la ventana de cdigo, vamos a crear tres procedimientos que no estn ligados al evento de ningn control, y que pueden ser ejecutados cuando se requiera, aun sin ejecutar ningn evento. Public Sub sumarImporte() ' suma solo la ltima lista, sea, los importes Dim i As Integer Dim dTotal As Double dTotal = 0 For i = 0 To Me.lstImporte.ListCount - 1 dTotal = dTotal + Val(Me.lstImporte.List(i)) Next Me.txtSubtotal.Text = dTotal If dTotal > 0 Then ' aqui se hacen los calculos para el subtotal, iva y total Me.txtIVA.Text = Round((Val(Me.txtSubtotal.Text) / 100) * 16, 2) Me.txtTotal.Text = Val(Me.txtSubtotal.Text) + Val(Me.txtIVA.Text)

End If End Sub Private Sub guardarFactura() Dim i As Integer Sheets( "facturas ).Activate ' activamos la hoja en la que vamos a trabajar If Trim(Range( "A2" ).Value) = "" Then ' localizamos la celda en donde vamos a empezar a insertar Range( "A2" ).Activate Else Range( A1 ).End(xlDown)(xlDropDown).Activate End If ActiveCell.Value = Me.txtNoFactura.Text ' insertamos los datos ActiveCell.Next.Value = Me.txtFecha.Text ActiveCell.Next.Next.Value = Me.txtRazon.Text For i = 0 To Me.lstCantidad.ListCount ActiveCell.Next.Next.Next.Value = Me.lstDescripcion.List(i) ActiveCell.Next.Next.Next.Next.Value = Me.lstPrecio.List(i) ActiveCell.Next.Next.Next.Next.Next.Value = Me.lstCantidad.List(i) ActiveCell.Next.Next.Next.Next.Next.Next.Value = Me.lstImporte.List(i) Next End Sub Private Sub ImprimirFactura() ' esta hace lo mismo pero con la hoja de impresin Dim i As Integer Sheets( IMPRESION ).Activate Range( "a1:h25" ).ClearContents ' limpiamos la hoja para la nueva impresin (esta linea es necesaria) Range( g2 ).Value = Me.txtFecha.Text Range( C2 ).Value = Me.txtRazon.Text Range( C3 ).Value = Me.txtDireccion.Text Range( b8 ).Select For i = 0 To Me.lstCantidad.ListCount - 1 ActiveCell.Value = Me.lstCantidad.List(i) ActiveCell.Next.Value = Me.lstDescripcion.List(i) ActiveCell.Next.Next.Value = Me.lstPrecio.List(i) ActiveCell.Next.Next.Next.Next.Value = Me.lstPrecio.List(i) ActiveCell.Next.Next.Next.Next.Next.Value = Me.lstImporte.List(i) ActiveCell(xlDropDown).Activate Next Range( g19 ).Value = Me.txtSubtotal.Text Range( g20 ).Value = Me.txtIVA.Text Range( g21 ).Value = Me.txtTotal.Text Range( b20 ).Value = Me.txtLetras.Text ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False End Sub - aqui las capturas

-- NOTACION - en el ejemplo no estoy incluyendo la funcion para convertir los numeros en texto porque es muy largo, sin embargo, en el archivo de ejemplo que dejo al final si esta implementada. y eso es todo con respecto a la facturacion. CARGAR CLIENTES - cierra el formulario frmFacturacion - agrega otro formulario llamado frmBuscarCliente con caption = Buscar Cliente - agregale los siguientes controles. lblClientes con caption = Clientes cmbClientes con style = 2 frmStyleDropDownList (lista para escoger items) cmdAceptar con caption = Aceptar

ubicalos de la siguiente manera: lblClientes en la parte mas arriba, luego abajo el cmbClientes y abajo de este pones el cmdAceptar.

los eventos: control cmdCONTRIBUYENTE, evento Change Private Sub cmbCONTRIBUYENTE_Change() Cells.Find(What:=Me.cmbClientes.Text, After:=ActiveCell, LookIn:= _ xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _ xlNext, MatchCase:=False, SearchFormat:=False).Activate End Sub control cmdNCONTRIBUYENTE, evento Change Private Sub cmbNCONTRIBUYENTE_Change() Cells.Find(What:=Me.cmbNContribuyente.Text, After:=ActiveCell, LookIn:= _ xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _ xlNext, MatchCase:=False, SearchFormat:=False).Activate End Sub control cmdAceptar, evento Click Private Sub cmdAceptar_Click() With frmFacturacion .txtRazon.Text = ActiveCell.Value .txtRFC.Text = ActiveCell.Next.Value .txtDireccion.Text = ActiveCell.Next.Next.Value End With Unload Me End Sub control UserForm, evento Activate Private Sub UserForm_Activate() Dim sUltimaCelda As String Me.cmbClientes.Clear Sheets( CLIENTEs ).Activate If Trim(Range( A2 ).Value) = "" Then Exit Sub

If Trim(Range( A3 ).Value) = "" Then Me.cmbClientes.AddItem (Range( A2 ).Value) Exit Sub End If sUltimaCelda = Range( A1 ).End(xlDown).Address For Each f In Range( A2:" & sUltimaCelda).Cells Me.cmbClientes.AddItem (f.Value) Next End Sub asi se debe ver en la ventana de codigo

y con eso ya podemos cargar a los clientes en la factura. AGREGAR PRODUCTOS a la factura es similar a cargar los clientes, solo que vamos a llenar las listas. - cierra los formularios abiertos - agrega un nuevo formulario llamado frmAgregarProducto y le pones caption

= Agregar Productos - insertale los siguientes controles: cmbClave con style = 2 frmStyleDropDownList txtDescripcion con enabled = false txtPrecio con enabled = false txtCantidad cmdAgregar con caption = Agregar a los txt's y al cmb les pones sus respectivos lbl's asi podria verse el diseo:

y ahora el codigos de los eventos: Private Sub cmbClave_Change() If Me.cmbClave.Value = "" Then Exit Sub Dim sUltimaCelda As String Me.txtDescripcion.Text = "" Me.txtPrecio.Text = "" If Me.cmbClave.ListCount > 1 Then sUltimaCelda = Range( A1 ).End(xlDown).Address Else sUltimaCelda = "A2" End If Range( A2:" & sUltimaCelda).Select Selection.Find(What:=Trim(Me.cmbClave.Text), After:=ActiveCell, LookIn:=xlValues _ , LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _ xlNext, MatchCase:=False, SearchFormat:=False).Activate With Me .txtDescripcion.Text = ActiveCell.Next.Value .txtPrecio.Text = ActiveCell.Next.Next.Value End With End Sub

Private Sub cmdAgregar_Click() If Trim(Me.txtCantidad.Text) = "" Then MsgBox ( Debes ingresar la cantidad!! ): Exit Sub If Me.txtDescripcion.Text = "" Then MsgBox ( Debes elegir un producto!! ): Exit Sub With frmFacturacion .lstCantidad.AddItem (Me.txtCantidad.Text) .lstDescripcion.AddItem (Me.txtDescripcion.Text) .lstPrecio.AddItem (Me.txtPrecio.Text) .lstImporte.AddItem (Str(Val(Me.txtCantidad.Text) * Val(Me.txtPrecio.Text))) End With frmFacturacion.sumarImporte Me.txtDescripcion.Text = "" Me.txtPrecio.Text = "" Me.txtCantidad.Text = "" Me.cmbClave.ListIndex = -1 Me.cmbClave.SetFocus End Sub Private Sub txtCantidad_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) ' esto es para que el textbox solo acepte numeros If KeyAscii < 48 Or KeyAscii > 57 Then KeyAscii = 0 End If End Sub Private Sub UserForm_Activate() Dim sUltimaCelda As String Me.cmbClave.Clear Sheets( PRODUCTOS" ).Activate If Trim(Range( A2 ).Value) = "" Then Exit Sub If Trim(Range( A3 ).Value) = "" Then Me.cmbClave.AddItem (Range( A2 ).Value) Exit Sub End If sUltimaCelda = Range( A1 ).End(xlDown).Address For Each f In Range( A2:" & sUltimaCelda).Cells Me.cmbClave.AddItem (f.Value) Next End Sub - aqui estan las capturas pa que vean la identacion

- EL MENU es para finalizar el ejemplo: - inserta un form con nombre frmMenu y caption = Menu -inserta tres botones cmdFacturar con caption = Facturar cmdCapturaCliente con caption = Agregar Cliente cmdCapturaProducto con caption = Agregar Producto - ubicalos en el orden de creacion uno al lado de otro este es el aspecto que podria tener:

- en el evento Click del control cmdFacturar escribe lo siguiente: Private Sub cmdFacturar_Click() frmFacturacion.Show End Sub y hasta aqui. PARA FINALIZAR - en la hoja de impresion, debes quitar las lineas y texto que sirvieron para checar la factura con la plantilla sin mover los tamaos de las celdas.

- como podras observar, el codigo hace referencia directa a ciertas celdas y hojas. Si cambias el nombre de una hoja, tambien lo debes hacer en el codigo. - el nombre del libro no importa LO QUE DEBES IMPLEMENTAR TU MISMO - una macro o boton para ejecutar el formulario menu desde excel - el formulario de captura de clientes - el formulario de captura de productos - al hacer click en una lista, las otras tres listas deben activar el item que esta en la misma direccion. TIPS - te molesta que los cambios de hojas e insercion sean visibles detras del formulario?? entonces en el evento activate del menu ponle application.screenupdating = false. esto desconecta la pantalla de excel y se queda congelada mientras trabajas en el formulario. No olvides poner en true de nuevo esta opcion en el evento queryunload del formulario, sino no vas a poder descongelar la pantalla. - la funcion application.visible = false, es igual a la anterior pero esta esconde definitivamente a excel de windows dejando solo el formulario activo. Tambien tienes que activarla cuando cierres el formulario. - para ejecutar el formulario de manera automatica al abrir el libro, en el entorno de VBA, en el explorador de objetos das doble click en el objeto Thisworkbook y en el evento open le pones frmMenu.show - para cerrar el libro cuando cierres el menu pones en el evento queryunload del menu la siguiente linea: activeworkbook.save ' para guardar los cambios hechos application.quit - para controlar el texto que aparece en el statusbar de excel, usas la funcion application.statusbar = "lo que quieras escribir"

MODIFICACION PARA DESCONTAR EXISTENCIAS CUANDO SE IMPRIMA O GUARDE LA FACTURA - en la hoja de productos, agrega una encabezado mas con el titulo existencia

metele algunos datos, estos deben ser numeros (pues es existencia)

ahora, hay que agregar un procedimiento mas al formulario de facturacion, ese procedimiento sera el encargado de que por cada producto que se encuentre en la factura, sus existencia sea descontada de la hoja. ese procedimiento es sencillo: Private Sub descontarExistencia(ByVal sDescripcion As String, ByVal nCantidad As Integer) Dim sUltimaCelda As String Dim hojaActiva As String hojaActiva = ActiveSheet.Name ' para recordar la hoja activa Sheets("PRODUCTOS" ).Activate ' nos pasamos a la hoja de productos ' aqui nomas fijamos los rangos, pa que no marque error si no hay nada en la lista If Trim(Range("b2" ).value) <> "" Then sUltimaCelda = Range("b1" ).End(xlDown).Address Else sUltimaCelda = "b2" End If 'seleccionamos el rango de busqueda, para hacer mas rapido el proceso

Range("b2:" & sUltimaCelda).Select ' esto es para localizar la clave que nos interesa... mmm estoy pensando que ' esta parte deberia ser mas corta. Selection.Find(What:=sDescripcion, After:=ActiveCell, LookIn:=xlValues _ , LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _ xlNext, MatchCase:=False, SearchFormat:=False).Activate ' una vez localizada la clave, solo hacemos la resta With Me ActiveCell.Next.Next.value = Val(ActiveCell.Next.Next.value) - nCantidad End With 'finalmente, regresamos a la hoja anterior, esto es para evitar errores ActiveWorkbook.Sheets(hojaActiva).Activate End Sub ' aqui esta la pantalla pa que vean la identacion

y luego, en el mismo formulario de facturacion, en el evento click del boton cmdAceptar modificamos el codigo para que " trabaje " este nuevo procedimiento. esta modificacion consta de agregar solamente una linea dentro del bucle, asi

nos aseguramos de que se ejecute por cada producto de la lista: Private Sub guardarFactura() Dim i As Integer Sheets("facturas" ).Activate ' activamos la hoja en la que vamos a trabajar If Trim(Range("A2" ).value) = "" Then ' localizamos la celda en donde vamos a empezar a insertar Range("A2" ).Activate Else Range("A1" ).End(xlDown)(xlDropDown).Activate End If ActiveCell.value = Me.txtNoFactura.Text ' insertamos los datos ActiveCell.Next.value = Me.txtFecha.Text ActiveCell.Next.Next.value = Me.txtRazon.Text For i = 0 To Me.lstCantidad.ListCount - 1 ActiveCell.Next.Next.Next.value = Me.lstDescripcion.List(i) ActiveCell.Next.Next.Next.Next.value = Me.lstPrecio.List(i) ActiveCell.Next.Next.Next.Next.Next.value = Me.lstCantidad.List(i) ActiveCell.Next.Next.Next.Next.Next.Next.value = Me.lstImporte.List(i) descontarExistencia Me.lstDescripcion.List(i), Val(Me.lstCantidad.List(i)) Next End Sub

Excel + VBA - Formulario de Captura eso de estar capturando en excel cien mil registros donde hay que poner el raton en una celda, luego en otra. eso de estar perdiendo la celda activa y luego buscarla... son cosas que se pueden corregir usando un formulario de captura. En este ejemplo vamos a implementar una pequea ventana de captura en la cual vamos a observar que VBA para excel es muy facil

y rapido de usar. Mi pc: Windows 7 home basic Office 2010 Ejemplo de creacion de una ventana para capturar datos en excel. - abre excel y de inmediato guarda el libro como captura.xls o captura.xlsm si usas office 2010 debes guardar el libro como habilitado para ejecutar macros. en 2007 creo que solo tenias que darle permisos. en anteriores de 2007 lo guardas como un libro normal pero hay que deshabilitar la seguridad. - renombra las dos primeras hojas que te crea automaticamente el libro como: hoja1 = CATALOGO hoja2 = CAPTURA - la tercera hoja eliminala asi debe quedar

- pasate a CATALOGO y escribe lo siguiente en las celdas indicadas: A1 = producto, B1 = precio - pasate a CAPTURA y escribe lo siguiente en las celdas indicadas A1 = nota, B1 = producto, C1 = precio, D1 = fecha ponle un sombreado pa que quede mu' bonito. asi deberia quedar: catalogo

captura

IMPORTANTE: los encabezados deben ir en las celdas indicadas y las hojas no deben tener otro nombre. Si cambias la ubicacion de los encabezados o el nombre de las hojas probablemente tengas errores en la ejecucion. bien, ahora que ya tenemos la "base de datos", vamos por lo mas encantador de este asunto. - Pulsa ALT + F11 y se abrira la ventana de VBA de Excel. Si tienes experiencia en programacion de inmediato sabras de que se trata, si eres novato entonces no te asustes. vba es un aliado, no un enemigo. - ahora inserta un UserForm o formulario. esto lo puedes hacer desde el menu insertar o desde el boton insertar del toolbar.

Nota - antes de cambiar una propiedad del UserForm hay que seleccionarlo dandole click el mismo. - Cambiale el nombre al UserForm a frmCaptura eso lo haces en la ventana de propiedades que esta abajo del explorador de proyecto. en donde dice name le quitas UserForm1 y le pones frmCaptura. - Cambiale el texto mostrado en el titulo del form. esto lo haces en la misma ventana de propiedades. en donde dice caption le pones [Ejemplo de captura] - tu_nombre

- Haz click de nuevo en el form y debe aparecer el cuadro de herramientas del form. si no aparece entonces haces click en Ver>>Cuadro de Herramientas. - Desde el cuadro de Herramientas arrastra el boton ETIQUETA o LABEL al formulario. (es el que tiene una A mayuscula) - Repite la operacion pero con el boton CUADRO DE TEXTO o TEXTBOX. (el que tiene ab| en minusculas) - Selecciona la etiqueta que insertaste y le cambias el nombre por lblNota y el texto mostrado por No. Nota esto lo haces seleccionando la etiqueta y luego en la ventana de propiedades cambias name y caption. - Selecciona el cuadro de texto y cambiale solo el nombre por txtNoNota. esto lo haces igual que en la etiqueta pero solo vas a cambiar la propiedad name. - ajusta los tamaos de la etiqueta y del cuadro de texto para que se vean mejor. para ajustar el tamao y posicion se hace igual que en power point. asi debe quedar en primera instancia:

como podras ver, los nombres de los controles se crean usando un prefijo que explique su tipo + una palabra corta que explique su funcion o dato a almacenar. Los nombres no deben llevar espacios ni caracteres especiales. los prefijos usados en este ejemplo son: lbl = etiqueta txt = cuadro de texto cmd = boton de comando o CommandButton bien. ahora, de la misma manera vamos a insertar 3 etiquetas mas y 3 cuadros de texto y les vamos a poner las propiedades siguientes: Etiquetas: name, caption respectivamente lblProducto Producto lblPrecio Precio lblFecha Fecha Cuadro de Texto: name txtProducto txtPrecio txtFecha

ahora inserta dos botones de comando o commandbutton y les pones las siguientes propiedades: Boton de Comando: name, caption cmdAceptar Aceptar cmdCancel Cancelar - ajusta los tamaos y las posiciones para que queden bien a la vista de los usuarios. deberia quedar algo parecido a esto:

- probando el formulario [je je je] pulsa f5, entonces observaras(si miras muy rapidamente) que la ventana de VBA se minimiza y te regresas a excel, pero con el formulario ejecutado. Cuando un formulario se esta ejecutando, excel queda en segundo plano y solo se puede usar el formulario y lo que tenga dentro. A eso se llama estar en MODAL. En este nivel puedes desplazarte y escribir en los cuadros de texto pero los botones no funcionan!!! eso es porque tenemos que decirles lo que deben hacer al oprimirse. Mientras no programemos cada boton, estos seran solo objetos inutiles ocupando memoria. y bueno, aqui nadie quiere inutiles y es por eso que vamos a la parte mas sencilla del post: la implementacion del codigo :p - Si aun esta ejecutando el formulario, cierralo y regresate al entorno de VBA. - Haz doble click en el boton de comando cmdAceptar - se debe abrir una nueva ventana parecida a un editor de textos. en esta ventana vamos a escribir algunos comandos que se van a ejecutar cuando se presione el boton. estos comandos deben ser correctos, de lo contrario el form no se ejecutara

y marcara error. tratare de poner sintaxis de lo mas basico para que sea entendido. - en la ventana codigo, debe estar escrito el encabezado y el final del evento click del boton cmdAceptar este encabezado debe decir algo como Private Sub cmdAceptar_Click() y el final debe decir End Sub. entre el encabezado y el final vamos a escribir lo siguiente: Private Sub cmdAceptar_Click() If Me.txtNoNota.text = "" Then MsgBox ("Numero de nota no puede estar vacio" ): Exit Sub If Me.txtProducto.text = "" Then MsgBox ("Producto no puede estar vacio" ): Exit Sub If Me.txtPrecio.text = "" Then MsgBox ("Precio no puede estar vacio" ): Exit Sub If Sheets("CAPTURA" ).Range("A2" ) .Value = "" Then Sheets("CAPTURA" ).Range("A2" ) .Value = Me.txtNoNota.text Sheets("CAPTURA" ).Range("B2" ) .Value = Me.txtProducto.text Sheets("CAPTURA" ).Range("C2" ) .Value = Me.txtPrecio.text Sheets("CAPTURA" ).Range("D2" ) .Value = Me.txtFecha.text Else Sheets("CAPTURA" ).Range("A1" ).End(xlDown)(xlDropDown).Value = Me.txtNoNota.text Sheets("CAPTURA" ).Range("A1" ).End(xlDown).Next.Value = Me.txtProducto.text Sheets("CAPTURA" ).Range("A1" ).End(xlDown).Next.Next.Value = Me.txtPrecio.text Sheets("CAPTURA" ).Range("A1" ).End(xlDown).Next.Next.Next.Value = Me.txtFecha.text End If Me.txtNoNota.text = "" Me.txtProducto.text = "" Me.txtPrecio.text = "" Me.txtFecha.text = "" Me.txtNoNota.SetFocus End Sub asi debe verse en el editor:

bien, ahora ya puedes cerrar esa horrenda ventana de codigo pero falta el boton de cancelar. - Haz doble click en el boton cmdCancel y se abrira su respectiva ventana de codigo... bueno, no es su respectiva ya que la comparte con los demas controles, pero el nombre de su evento y el final aparece ya insertado.

bueno, este boton de cancelar lo unico que debe hacer es, como dice su nombre, cancelar la captura actual y eso significa limpiar todas las cajas de texto y enfocar la primera para la siguiente captura. Tons, entre el encabezado y el final ponemos las siguientes lineas: Private Sub cmdCancel_Click() Me.txtNoNota.text = "" Me.txtProducto.text = "" Me.txtPrecio.text = "" Me.txtFecha.text = "" Me.txtNoNota.SetFocus End Sub asi debe quedar el codigo

ya ya tenemos los dos botones funcionales. ahora pulsa F5 y el formulario se va a ejecutar. captura unos registros de prueba. bien hasta aqui, pero puede ser un poco incomodo que cada vez que quieras ejecutar el formulario tengas que abrir VBA para darle F5. Por eso vamos a crear una macro que nos permita llamar a esa ventana de captura desde el mismo excel.

- en la ventana VBA, cHaz click en insertar(ya sea en el menu o desde el toolbar) y escoges MODULO - se va a crear un modulo nuevo que no es mas que una ventana de codigo pero que no esta ligada a ningun formulario y ademas esta en blanco, no tiene ningun encabezado ni final. - ahi vamos a escribir lo siguiente: Public Sub iniciar_Captura() frmCaptura.Show End Sub

y eso es todo. Antes de terminar con la ventana de VBA, asegurate que el orden de los controles sea el correcto, osea, que cuando pulses enter o tab se debe activar el control de abajo inmediato y no el de arriba o el ultimo. Si el orden es incorrecto, entonces, tienes que cambiar la propiedad TABINDEX de cada control para corregirlo. tabindex es un valor que va de 0 en adelante y, obviamente, es el orden de los controles. solo debes corregir el orden de los controles interactivos, las etiquetas no importan pero los cuadros de texto y botones ponlos en el orden que desees. para este ejemplo el orden es el siguiente: txtNoNota 0 txtProducto 1 txtPrecio 2

txtFecha 3 cmdAceptar 4 cmdCancel 5 ahora ya puedes cerrar el VBA y quedarte solo con excel guarda el archivo. tons vamos a probarlo. - estando en excel pulsa ALT + F8 y te va a aparecer la ventana de macros con una macro que se llama Iniciar_captura - ejecuta esa macro y te va a aparecer la ventana de captura.

- como bien dije al principio, el codigo es muy basico pero se puede hacer robusto para mayor comodidad del usuario. - una base de datos + lenguaje de programacion es mejor, incluso access, pero en algunos lugares no te permiten usar nada excepto excel y word, y puedes hacerte la vida mas facil y rapida de esta manera. - la hoja de catalogo es para una proxima implementacion de autocompletado al momento de capturar - el ejemplo es basico pero puedes modificar la hoja y el formulario para poner mas campos. - las cajas de texto podrian buscar contenido automatico para disminuir la carga de trabajo del usuario. - limitar el numero de caracteres de cada caja de texto - etc etc etc etc etc etc etc

Lista de macros tiles para excel.


Hola amigos, en esta ocasin os traigo un post que espero que os guste, os sea util y sobretodo se pueda aprovechar lo suficiente. Muchos de vosotros seguro que al igual que yo, utilizais el Office en cualquiera de sus versiones, bien puede ser la 2003 / 2007 / 2010 o en breves seguro que saldr la version 2011 si es que no ha salido ya. Pues bein en esta ocasin voy a adentrarme en uno de los programas ms potenentes como ex la hoja de clculo Excel. Vamos a hablar de algo que por mi experiencia pocos conocen y que me parece algo que todos deberiamos aprender cada da un poco ms para sacarle realmente partido a este magnfico programa. Las macros en excel y la aplicacion de Visual Basic para Aplicaciones (VBA). Qu es una macro?

Una macro en un lenguaje para que todos lo entendamos son instrucciones que mediante lenguaje de programacin, se le dan a un programa o aplicacin, en este caso Excel, para que realice una serie de operaciones de forma automtica. A continuacin os dejo una imagen de Visual Basic para aplicaciones, el cual podremos acceder a el a travs de la combinacin de teclas ALT + F11.

Para trabajar con macros en excel 2007 o 2010 debemos tener a la vista la ficha programador en la cinta de opciones, la cual se saca a travs de: Botn de Office > Opciones de Excel > Activar ficha programador.

Una vez hecho esto en la ficha programador podemos simplemente agregar un boton de comando a traves de la opcion Insertar que nos aparece en dicha ficha. Hacemos clik en el boton de comando y dibujamos un botn. Haciendo doble clik en ese botn, podemos acceder tambien al entorno de programacin vba.

Ahora os voy a dejar una serie de macros creo que bastante tiles para ciertas ocasiones. Espero que os sirvan y os sean tiles: Macro que busca un valor en una columna de una hoja y muestra en un msgbox los datos solicitados. Vamos a suponer que tenemos que buscar en la columna A de una hoja de excel llamada hoja1 un dato que debemos colocar en un textbox de un formulario, llamado TextBox1 de la misma hoja: Sub buscar() ActiveSheet.Range("A1" ).Activate Set dato = Workbooks("libro1.xls" ).Sheets("Hoja1" ).Range("a:a" ).Find(What:=Textbox 1.Value, _ LookIn:=xlFormulas, _ LookAt:=xlPart, _ SearchOrder:=xlByRows, _ SearchDirection:=xlNext, _ MatchCase:=False) 'Si se encuentra el dato, entonces.... If Not dato Is Nothing Then 'Pasamos a una variable los datos encontrados variable1 = dato 'Esto coloca en la variable llamada variable1 el dato encontrado.

variable2 = dato.Offset(0, 1).Value 'Esto coloca el dato de la celda de la derecha al dato encontrado variable llamada variable2 variable3 = dato.Offset(0, 3).Value ' Hace lo mismo con el dato colocado dos columnas a la derecha del dato encontrado 'Muestra un msgbox con los datos encontrados. MsgBox "Las existencias que quedan en el almacn del producto" & " " & descripcion & " " & "cuya referencia es" & " " & referencia & " " & "son" & " " & unidades, vbInformation, "UNIDADES EXISTENTES" Workbooks("INVENTARIO.XLS" ).Close False 'Cierra el libro sin guardar los cambios Else 'Si el dato no se encuentra en la lista, entonces... 'Muestra un mensaje diciendo que no se encontro el dato MsgBox "El producto no se encuentra en el inventario", vbInformation, "PRODUCTO NO ENCONTRADO" End If End Sub Macro que encuentra la primera celda vacia de una columna: Sub celda_vacia() 'Siempre partimos en este caso del libro activo y teniendo en cuenta que la macro est en la misma hoja donde se realizan las operaciones. 'Mientras la celda activa no este vacia, baja una fila. Activesheet.range("a1" ).Activate Do While Not isEmpty(Activecell) Activecell.offset(1,0).Activate Loop 'En la celda activa, la cual esta vacia, escribe Hola. Activecell.value= "Hola" End Sub Macro que abre un libro llamado librodiferente.xls, el cual es diferente al que contiene la macro pero se encuentra la misma carpeta que el libro que contiene la macro. Sub abrir_libro_en_la_misma_carpeta() Workbooks.Open Thisworkbook.Path & "librodiferente.xls" End sub

Abrir el libroempresa.xls especificando la ruta por ejemplo vamos a abrir un libro que este en la ubicacion "c:empresa Sub abrir_libro Workbooks.Open Filename:="c:empresalibroempresa.xls" End sub Macro que abre un libro cuyo nombre se encuentra en una variable: Sub abrir_libro_variable 'Colocamos el nombre del libro en un inputbox AbrirLibro=Inputbox("Teclea el libro que desea abrir", "Libro para abrir" ) 'Abrimos el libro con extensin xls Workbooks.Open ThisWorkbook.Path & "" & AbrirLibro End Sub Macro para guardar un libro. Sub Guardar() 'Workbooks("nombre del libro.xls" ).Save End Sub Macro Guardar como... Sub GuardarComo() 'Esta macro guarda el libro en la misma carpeta que contiene la macro con un nombre diferente Guardar=inputbox("Guardar Como", Guardar como) Workbook.SaveAs ThisWorkbook.Path & "" & Guardar & ".xls" End Sub Macro que guarda un libro con otro nombre en la ruta que queramos, por ejemplo en c:macrosExcel

Sub GuardarComo() Guardar=inputbox("Guardar Como", Guardar como) Workbook.SaveAs Filename:="c:maroxExcel" & Guardar End Sub Espero que os sean utiles estas macros.

Espero comentarios y puntos!!!!


Nota: Hay algunos espacios entre "" y ) para evitar los emoticonos, pero las macros funcionan y estn probadas por mi.