Excel + VBA - Ejemplo de Facturación

110
Excel + VBA - Ejemplo de Facturación. 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 configuracion de mi pc: - Windows Home Basic. - Office 2010 Consideraciones - el codigo VBA es el mismo de Visual basic 6, por lo que debe funcionar tambien en versiones anteriores a excel 2010. De todos modos, el codigo que vamos a escribir sera de lo mas sencillo para brincar esa cuestion. Se podria escribir un codigo bastante robusto y optimo pero eso incrementaria las lineas al triple y podria causar confusion a los lectores novatos en programacion. En el post anterior tenemos un ejemplo de como insertar datos en hoja desde un formulario. Esa es la misma mecanica que vamos usar, con la unica 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 ejecucion de macros ( xlsm ) en 2007 creo que solo tienes que habilitar las macros. en anteriores a 2007 da igual.

Transcript of Excel + VBA - Ejemplo de Facturación

Page 1: Excel + VBA - Ejemplo de Facturación

Excel + VBA - Ejemplo de Facturación.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 configuracion de mi pc: 

- Windows Home Basic. 

- Office 2010 

Consideraciones - el codigo VBA es el mismo de Visual basic 6, por lo que debe funcionar tambien en versiones

anteriores a excel 2010. De todos modos, el codigo que vamos a escribir sera de lo mas sencillo para brincar esa

cuestion. Se podria escribir un codigo bastante robusto y optimo pero eso incrementaria las lineas al triple y podria

causar confusion a los lectores novatos en programacion. 

En el post anterior tenemos un ejemplo de como insertar datos en hoja desde un formulario. Esa es la misma

mecanica que vamos usar, con la unica 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 ejecucion de macros ( xlsm ) 

en 2007 creo que solo tienes que habilitar las macros. 

en anteriores a 2007 da igual. 

Page 2: Excel + VBA - Ejemplo de Facturación

ahora, el libro nos crea automaticamente 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 impresion  

- lo siguiente son los encabezados. 

en la hoja clientes vamos a escribir lo siguiente es las celdas siguientes: 

A1 = razon, B1 = rfc, C1 = direccion 

ingresale unos cuantos datos 

Page 3: Excel + VBA - Ejemplo de Facturación

la hoja productos 

A1 = clave, B1 = descripcion, 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 impresion. 

aqui deberias hacer una replica 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 estan marcados las lineas. en pocas palabras, excel solo va a

imprimir lo que deberias escribir a mano. 

por ejemplo, supongamos que nuestra factura de papel en blanco es la siguiente: 

Page 4: Excel + VBA - Ejemplo de Facturación

 

AJUSTANDO LA HOJA DE IMPRESION 

entonces, en excel vamos a hacer una plantilla identica 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 estan 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, sacale una copia fotostatica

a tu factura e imprimimes la plantilla de excel en la copia. si todo corresponde, entonces podemos pasar al siguiente

paso. 

Page 5: Excel + VBA - Ejemplo de Facturación

Guarda el archivo para que no pierdas los cambios, (murphy dice que windows solo falla cuando tienes algo sin

guardar en pantalla) 

DISEÑO DE LOS FORMULARIOS 

Pulsa ALT + F11 y se abre la ventana de VBA. 

Page 6: Excel + VBA - Ejemplo de Facturación

Los formularios a crear son: 

- captura de clientes 

- captura de productos 

- impresion de factura 

- catalogo de productos 

- catalogo de clientes 

- menu 

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 impresion de la factura. 

La creacion de los formularios omitidos la debes hacer tu mismo. 

la manera de cambiar las propiedades tambien esta explicado en el post anterior, tambien vamos a omitir esa

Page 7: Excel + VBA - Ejemplo de Facturación

explicacion. 

la creacion de formularios e insercion de controles tambien sera 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 verificacion 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 tambien varia su uso, ubicacion y existencia con el uso de cada version de windows,

no lo vamos a usar. 

No vamos a agregar ningun control externo para hacer mas 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 etiquedas y 5 cuadros de texto 

-----lblRazon con caption = Razon 

-----lblDireccion con caption = Direccion 

-----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: 

Page 8: Excel + VBA - Ejemplo de Facturación

- 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 creacion, ubicalos a la misma altura uno junto de otro. 

ademas, 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 Descripcion pones un lblDescripcion con caption descripcion 

y asi con las otras dos listas restantes. 

mira nomas que chulo esta quedando el form: 

Page 9: Excel + VBA - Ejemplo de Facturación

- continuamos con la ultima parte de su diseño: 

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 en mexico, se nota????) 

txtTotal con width = 61.5 y enabled = false 

(cuando enabled es falso el control esta 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 tamaño 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 boton de comando llamado cmdBuscar con caption = Buscar Cliente y lo ubicamos en la parte de mas

abajo del formulario a la izquierda. 

Page 10: Excel + VBA - Ejemplo de Facturación

-agrega un boton de comando llamado cmdProductos con caption = Productos y ubicalo a la derecha de cmdBuscar 

-agrega un boton de comando llamado cmdAceptar con caption = Aceptar y ubicalo a la derecha de cmdProductos 

-agrega una casilla de verificacion o checkbox con nombre chkImprimir y caption = Imprimir al aceptar y ubicala a la

derecha de cmdCancel 

este es el aspecto final que deberia tener el formulario: 

PROGRAMANDO LOS EVENTOS 

- haz doble click encima del form en alguna region donde no tenga ningun control. 

- aparece la ventana de codigo. 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 estan 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) 

Page 11: Excel + VBA - Ejemplo de Facturación

- 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 lineas de abajo del evento click las podemos eliminar para no causar confusion. 

Page 12: Excel + VBA - Ejemplo de Facturación

y bueno, escribimos dentro del evento activate del formulario las siguientes lineas: 

Private Sub UserForm_Activate() 

Me.txtFecha.Text = Date 

End Sub 

a continuacion pulsa F5 y verifica que en el txtFecha se ha escrito la fecha automaticamente. 

si hasta aqui todo va bien, continuamos con los eventos de los demas 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 codigo, vamos a crear tres procedimientos que no estan ligados al evento de ningun

control, y que pueden ser ejecutados cuando se requiera, aun sin ejecutar ningun evento. 

Public Sub sumarImporte() ' suma solo la ultima lista, osea, 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 

Page 13: Excel + VBA - Ejemplo de Facturación

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 impresion 

Dim i As Integer 

Sheets( “IMPRESION” ).Activate 

Range( "a1:h25" ).ClearContents ' limpiamos la hoja para la nueva impresion (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 

Page 14: Excel + VBA - Ejemplo de Facturación
Page 15: Excel + VBA - Ejemplo de Facturación

-- 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 

Page 16: Excel + VBA - Ejemplo de Facturación

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 cmdClientes, evento Change 

Private Sub cmbClientes_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 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 

Page 17: Excel + VBA - Ejemplo de Facturación

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 diseño: 

Page 18: Excel + VBA - Ejemplo de Facturación

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 = "" 

Page 19: Excel + VBA - Ejemplo de Facturación

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 

Page 20: Excel + VBA - Ejemplo de Facturación
Page 21: Excel + VBA - Ejemplo de Facturación

- 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. 

Page 22: Excel + VBA - Ejemplo de Facturación

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 tamaños 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" 

Page 23: Excel + VBA - Ejemplo de Facturación
Page 24: Excel + VBA - Ejemplo de Facturación
Page 25: Excel + VBA - Ejemplo de Facturación
Page 26: Excel + VBA - Ejemplo de Facturación
Page 27: Excel + VBA - Ejemplo de Facturación
Page 28: Excel + VBA - Ejemplo de Facturación
Page 29: Excel + VBA - Ejemplo de Facturación
Page 30: Excel + VBA - Ejemplo de Facturación
Page 31: Excel + VBA - Ejemplo de Facturación

MODIFICACION PARA DESCONTAR EXISTENCIAS CUANDO SE IMPRIMA O GUARDE LA FACTURA 

- en la hoja de productos, agrega una encabezado mas con el titulo existencia 

Page 32: Excel + VBA - Ejemplo de Facturación

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 

Page 33: Excel + VBA - Ejemplo de Facturación

' 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: 

Page 34: Excel + VBA - Ejemplo de Facturación

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 

pruebenlo y me dicen que px. 

descargar el libro de ejemplo: 

https://skydrive.live.com/?cid=6A76BCFD39519EAE&id=6A76BCFD39519EAE

%21397#cid=6A76BCFD39519EAE&id=6A76BCFD39519EAE%21397 

Comentarios

Page 35: Excel + VBA - Ejemplo de Facturación

@Modjo hace 2 años

Page 36: Excel + VBA - Ejemplo de Facturación

Buenisimo! Seguí con estos post! 

Page 37: Excel + VBA - Ejemplo de Facturación

@nayarchis hace 2 años

Mejor explicado no se puede, Gracias.

Aprovechando tu que eres maestro en el excel, que tendria que hacer si quiero en el renglon de productos escribir

una descripcion larga donde se ocupan mas de 1 fila, algo asi como: Compresor High Power Motor de 3.5, color rojo,

garantia de 30 dias directamente con el vendedor y de un año en centro de servicio.................

@kill_spinal hace 2 años

las filas son registros, las columnas son los campos.

en cuanto a la captura, no hay problema porque las celdas tienen bastante espacio como para poner esa

descripcion.

en cuanto a la impresion, lo que tienes que hacer es configurar las celdas de la descipcion para que se ajusten a dos

o tres renglones de altura. de esta manera, tienes una fila con tres renglones en la descripcion pero un renglon para

cantidad, precio e importe.

aqui ya tienes que aplicar tu creatividad al diseño de la hoja.

@mariosss123 hace 2 años

+10 buen post

@kill_spinal hace 2 años

grax

@patyandsergi hace 2 años

Hola muy bueno el post pero no puedo ver las imagenes ni descargar el ejemplo, gracias

@kill_spinal hace 2 años

patyandsergi dijo:

Hola muy bueno el post pero no puedo ver las imagenes ni descargar el ejemplo, gracias

hola. eso se debe a que el fin de semana desconecte el servidor para hacer algunas mejoras. pero ahora ya esta en

linea y no debes tener ningun problema. saludos.

@patyandsergi hace 2 años

Page 38: Excel + VBA - Ejemplo de Facturación

Muchas gracias!!!

@xlalokpox hace 1 año

Y Los registros o la base de datos de toda la facturación como lo manejas? Se pueden obtener reportes a partir de

esa baso de datos como consumo por cliente o control de stock?

@kill_spinal hace 1 año

xlalokpox dijo:

Y Los registros o la base de datos de toda la facturación como lo manejas? Se pueden obtener reportes a

partir de esa baso de datos como consumo por cliente o control de stock?

La &quot;base de datos&quot; la manejas como se te pegue la gana, pues es una hoja de calculo y no creo que no

sepas algo tan basico como excel.

Claro que se pueden hacer reportes apartir de los datos obtenidos, tengo entendido que es una de las funciones de

excel. No me pasa por la cabeza a alguien que no se le haya ocurrido usar una tabla dinamica o filtros antes de

hacer tu pregunta.

Si tu pregunta es debido a que quieres manejar toda la informacion en formularios sin entrar a las hojas, es posible,

ya que la interfaz es solo un acceso directo a cada funcion de vba, por lo tanto, todo lo que haces manualmente en

una hoja tiene una segunda forma de hacerlo mediante el codigo vb. 

Bastaria crear las macros y formularios necesarios para este fin.

@sebaakira hace 1 año

Hola, tengo una duda, yo hice unas modificacones a tu archivo, y cuando pongo un producto con precio en numeros

decimales y lo multiplica por la cantidad del producto en el listbox lstimporte me pone un numero entero, es decir no

me toma los decimales y el total me lo calcula sin los decimales, que puede ser?

@kill_spinal hace 1 año

sebaakira dijo:

Hola, tengo una duda, yo hice unas modificacones a tu archivo, y cuando pongo un producto con precio en

numeros decimales y lo multiplica por la cantidad del producto en el listbox lstimporte me pone un numero

entero, es decir no me toma los decimales y el total me lo calcula sin los decimales, que puede ser?

Primero, en la hoja debes poner el formato correcto de las celdas, ya que estas traen por default el formato general.

aqui lo que debes hacer es cambiar el formato de las celdas de los precios o totales a formato de numero con dos

decimales.

La lista no debe tener problemas ya que solo &quot; capta &quot; el string de la celda.

pruebalo y me comentas.

saludos.

Page 39: Excel + VBA - Ejemplo de Facturación

@vyktox hace 1 año

Page 40: Excel + VBA - Ejemplo de Facturación

ya no esta disponible 

Page 41: Excel + VBA - Ejemplo de Facturación

@kill_spinal hace 1 año

vyktox dijo:

Page 42: Excel + VBA - Ejemplo de Facturación

ya no esta disponible 

Page 43: Excel + VBA - Ejemplo de Facturación

he estado teniendo unos problemas con mi servidor, el servicio es intermitente pero la mayor parte del tiempo esta

disponible.

saludos.

@Big_FidoX hace 1 año

Hola! Como haría para crear un stock y se me vaya descontando según los productos que venda?

@kill_spinal hace 1 año

Big_FidoX dijo:

Hola! Como haría para crear un stock y se me vaya descontando según los productos que venda?

disculpa la tardanza, pero estaba comiendo pib de dia de muertos con mi abuela y ahora que regrese a la compu he

leido tu comentario.

revisa de nuevo el post, pues lo he modificado con la respuesta a tu pregunta.

saludos.

@patyandsergi hace 1 año

Hola, tengo unos problemas cuando quiero ejecutar la factura, al principio tengo problemas con la fecha 

Private Sub UserForm_Activate()

Me.txtFecha.Text = Date ' para poner la fecha cuando se ejecute el form

End Sub

, despues si elimino la rutina de DATE me salta el depurador al buscar cliente y los productos me pone esto:

Private Sub UserForm_Activate()

Dim sUltimaCelda As String

Page 44: Excel + VBA - Ejemplo de Facturación

Me.cmbClave.Clear

Page 45: Excel + VBA - Ejemplo de Facturación

Sheets(&quot;PRODUCTOS&quot .Activate

Page 46: Excel + VBA - Ejemplo de Facturación

If Trim(Range(&quot;A2&quot .value) = &quot;&quot; Then Exit Sub

Page 47: Excel + VBA - Ejemplo de Facturación

If Trim(Range(&quot;A3&quot .value) = &quot;&quot; Then

Page 48: Excel + VBA - Ejemplo de Facturación

Me.cmbCl

Page 49: Excel + VBA - Ejemplo de Facturación

ve.AddItem (Range(&quot;A2&quot .value)

Page 50: Excel + VBA - Ejemplo de Facturación

Exit Sub

Page 51: Excel + VBA - Ejemplo de Facturación

End If

Page 52: Excel + VBA - Ejemplo de Facturación

sUltimaCelda = Range(&quot;A1&quot .End(xlDown).Address

Page 53: Excel + VBA - Ejemplo de Facturación

For Each f In Range(&quot;A2:

quot

&amp;

ltimaCelda).CellsMe.cmbClave.AddItem (f.v

@kill_spinal hace 1 año

patyandsergi dijo:

Hola, tengo unos problemas cuando quiero ejecutar la factura, al principio tengo problemas con la fecha 

Private Sub UserForm_Activate()

Me.txtFecha.Text = Date ' para poner la fecha cuando se ejecute el form

End Sub

, despues si elimino la rutina de DATE me salta el depurador al buscar cliente y los productos me pone esto:

Private Sub UserForm_Activate()

Dim sUltimaCelda As String

Page 54: Excel + VBA - Ejemplo de Facturación

Me.cmbClave.Clear

Page 55: Excel + VBA - Ejemplo de Facturación

Sheets(&quot;PRODUCTOS&quot .Activate

Page 56: Excel + VBA - Ejemplo de Facturación

If Trim(Range(&quot;A2&quot .value) = &quot;&quot; Then Exit Sub

Page 57: Excel + VBA - Ejemplo de Facturación

If Trim(Range(&quot;A3&quot .value) = &quot;&quot; Then

Page 58: Excel + VBA - Ejemplo de Facturación

Me.cmbCl

Page 59: Excel + VBA - Ejemplo de Facturación

ve.AddItem (Range(&quot;A2&quot .value)

Page 60: Excel + VBA - Ejemplo de Facturación

Exit Sub

Page 61: Excel + VBA - Ejemplo de Facturación

End If

Page 62: Excel + VBA - Ejemplo de Facturación

sUltimaCelda = Range(&quot;A1&quot .End(xlDown).Address

Page 63: Excel + VBA - Ejemplo de Facturación

For Each f In Range(&quot;A2:

quot

&amp;

ltimaCelda).CellsMe.cmbClave.AddItem (f.v

hola, es necesario que me digas el msg de error que te marca desde el principio, probablemente sea un pequeño

detalle pero que no permita que se ejecuten las sentencias siguientes.

aprovecho tambien para comentarte que el codigo hace referencia directa a hojas y rangos especificos, si

cambiamos los nombres de las hojas o movemos las columnas que usamos tendremos errores por doquier.

@mibabilonia hace 1 año

bueno

@POTTERSCAR hace 1 año

HOLA TENGO UN PROBLEMA CON EL VINCULO DE LAS HOJAS A LA HORA DE METER LOS CLIENTES Y

LOS PRODUCTOS ME SALE ERROR 91 ESTO ME PASA POR QUE NO ESTOY EN LA MISMA HOJA DE EXEL

QUE EN LA QUE ESTA TRABAJANDO LA MACRO SOLO QUE NO C COMO ACERLE PARA QUE LA LLAME

CUANDO LE DOY AL BOTON DE BUSCAR CLIENTES O AGREGAR ´PRODUCTO LA VERDAD NO C MUCHO

DE EXEL PERO TU GUIA ESTA MUY BIEN EXPLICADA Y SOLO ME FALTA ESO YA CREE LOS FORMULARIOS

DE CAPTURA AGRADESCO TU AYUDA

@tonys32 hace 1 año

@kill_spinal hace 1 año

POTTERSCAR dijo:

HOLA TENGO UN PROBLEMA CON EL VINCULO DE LAS HOJAS A LA HORA DE METER LOS CLIENTES Y

LOS PRODUCTOS ME SALE ERROR 91 ESTO ME PASA POR QUE NO ESTOY EN LA MISMA HOJA DE EXEL

QUE EN LA QUE ESTA TRABAJANDO LA MACRO SOLO QUE NO C COMO ACERLE PARA QUE LA LLAME

CUANDO LE DOY AL BOTON DE BUSCAR CLIENTES O AGREGAR ´PRODUCTO LA VERDAD NO C MUCHO

DE EXEL PERO TU GUIA ESTA MUY BIEN EXPLICADA Y SOLO ME FALTA ESO YA CREE LOS

FORMULARIOS DE CAPTURA AGRADESCO TU AYUDA

Hola, te recomiendo que cuando entres a un procedimiento o macro, lo primero que hagas es guardar el nombre de

Page 64: Excel + VBA - Ejemplo de Facturación

la hoja activa y al final del procedimiento, la ultima linea debe regresar a la hoja anterior, por ejemplo:

estamos en la hoja clientes y necesitas acceder a los datos de la hoja productos, entonces, en tu procedimiento lo

primero es declarar una variable que guarde el nombre de la hoja en la que estas actualmente ANTES DE

PASARTE A PRODUCTOS: 

dim sHojaActiva as string ' la variable para guardar el nombre

sHojaActiva = activesheet.name ' aqui guardamos el nombre la hoja

sheets(&quot;productos&quot; ).activate ' ahora si nos pasamos con tranquilidad a productos

' y aqui pones todo lo que quieres hacer en la hoja de productos

' y cuando termines, te regresas a la hoja clientes para que no te marque ese error

activeworkbook.sheets(sHojaActiva).activate 'esta debe ser la ultima linea.

pruebalo y comentalo para que los demas chequen si les sirve.

saludos.

@POTTERSCAR hace 1 año

gracias me sirvio se soluciono el problema solo que ahora tengo otro jeje espero me puedas ayudar mira en guardar

factura

Page 65: Excel + VBA - Ejemplo de Facturación

me dice error de compilacion: no se puede encontrar proyecto o la biblioteca y me señala trim esta parte no la e

modificado nada pero parece que no me reconoce el objeto esto lo ace justo despues que pongo aceptar en el

cuadro de facturacion

y aparte de ese en la opcion de

Private Sub UserForm_Activate()

Me.txtFecha.Text = Date 

me sale error de compilacion : no se puede encontrar proyecto o la biblioteca y me señala date prove cambiarla por

otra ras como calendar o hoy() pero no funciona jeje mi office es 2010

gracias espero respuesta

@POTTERSCAR hace 1 año

ya resolvi el error al guardar factura solo quite la funcion trim y ya no me dio error falta lo de la fecha y si me puedes

decir como quitar el redondeo en el subtotal para que me de cantidades exactas x favor gracias

@kill_spinal hace 1 año

POTTERSCAR dijo:

Page 66: Excel + VBA - Ejemplo de Facturación

gracias me sirvio se soluciono el problema solo que ahora tengo otro jeje espero me puedas ayudar mira en

guardar factura

me dice error de compilacion: no se puede encontrar proyecto o la biblioteca y me señala trim esta parte no

la e modificado nada pero parece que no me reconoce el objeto esto lo ace justo despues que pongo aceptar

en el cuadro de facturacion

y aparte de ese en la opcion de

Private Sub UserForm_Activate()

Me.txtFecha.Text = Date 

me sale error de compilacion : no se puede encontrar proyecto o la biblioteca y me señala date prove

cambiarla por otra ras como calendar o hoy() pero no funciona jeje mi office es 2010

gracias espero respuesta

pasame tu archivo por mail, enviame un mp para darte mi direccion.

@Edward_cd hace 1 año

Excelente aporte + 10

Page 67: Excel + VBA - Ejemplo de Facturación

@natgok hace 1 año

gracias amigo eres increible me acabas de salvar un dia de proyecto que no se me ocurria que hacer +5 y +5 en el

otro post

@kill_spinal hace 1 año

natgok dijo:

gracias amigo eres increible me acabas de salvar un dia de proyecto que no se me ocurria que hacer +5 y +5

en el otro post

Grax, si tienes dudas no vaciles en comentarmelo.

@natgok hace 1 año

hermano tengo un problemota... no logro poner agregar clientes y agregar productos...

@kill_spinal hace 1 año

natgok dijo:

hermano tengo un problemota... no logro poner agregar clientes y agregar productos...

cual es el error o cual es la falla?

@natgok hace 1 año

hermano la cosa es que cree las agregar clientes y agregar productos... pero cuando intento meter la informacion y

darle aceptar para que la guarde me dice se ha producido el error 9 en tiempo de ejecucion subindice fuera del

Page 68: Excel + VBA - Ejemplo de Facturación

intervalo y le doy depurar y me aparece esto en amariyo

Page 69: Excel + VBA - Ejemplo de Facturación

If Sheets(&quot;CAPTURA&quot .Range(&quot;A2&quot .value = &quot;&quot; Then

Page 70: Excel + VBA - Ejemplo de Facturación

la cosa es que soy nuevo en esto de excel y no se s

Page 71: Excel + VBA - Ejemplo de Facturación

Private Sub cmdAceptar_Click()

Page 72: Excel + VBA - Ejemplo de Facturación

If Me.txtRazon.Text = &quot;&quot; Then MsgBox (&quot; Razon no puede estar vacio&quot : Exit Sub

Page 73: Excel + VBA - Ejemplo de Facturación

If Me.txtRFC.Text = &quot;&quot; Then MsgBox (&quot;RFC no puede estar vacio&quot : Exit Sub

Page 74: Excel + VBA - Ejemplo de Facturación

If Me.txtDireccion.Text = &quot;&quot; Then MsgBox (&quot;Direccion no puede estar vacio&quot : Exit Sub

Page 75: Excel + VBA - Ejemplo de Facturación
Page 76: Excel + VBA - Ejemplo de Facturación

If Sheets(&quot;CAPTURA&quot .Range(&quot;A2&quot .value = &quot;&quot; Then

Page 77: Excel + VBA - Ejemplo de Facturación

Sheets(&quot;CAPTURA&quot .Range(&quot;A2&quot .value = Me.txtRazon.Text

Page 78: Excel + VBA - Ejemplo de Facturación
Page 79: Excel + VBA - Ejemplo de Facturación

heets(&quot;CAPTURA&quot .Range(&quot;B2&quot .value = Me.txtRFC.Text

Page 80: Excel + VBA - Ejemplo de Facturación
Page 81: Excel + VBA - Ejemplo de Facturación

heets(&quot;CAPTURA&quot .Range(&quot;C2&quot .value = Me.txtDireccion.Text

Page 82: Excel + VBA - Ejemplo de Facturación
Page 83: Excel + VBA - Ejemplo de Facturación

Else

Page 84: Excel + VBA - Ejemplo de Facturación

Sheets(&quot;CAPTURA&quot .Range(&quot;A1&quot .End(xkdown)(xlDropDown).value = Me.txtRazon.Text

Page 85: Excel + VBA - Ejemplo de Facturación

Sheets(&quot;CAPTURA&quot .Range(&quot;A1&quot .End(xlDown).Next.value = Me.txtRFC.Text

Page 86: Excel + VBA - Ejemplo de Facturación

Sheets

&quot;CAPTURA&quot.Range(&quo

;A1&quot.End(xlDown).Next.N

xt.value = Me.txtDireccion.TextEnd

IfMe.txtRazon.Text

&quot;&

ot;Me.txtRFC.Text = &quot;&quot;Me.txtDireccion.Text = &quot;&quot;Me.txtRazon.SetFoc

@natgok hace 1 año

por aquello lo que quiero poner es una forma de ingresar datos nuevos en el menu 

poner agregar clientes y agregar productos

@natgok hace 1 año

@kill_spinal hace 1 año

natgok dijo:

hermano la cosa es que cree las agregar clientes y agregar productos... pero cuando intento meter la

informacion y darle aceptar para que la guarde me dice se ha producido el error 9 en tiempo de ejecucion

Page 87: Excel + VBA - Ejemplo de Facturación

subindice fuera del intervalo y le doy depurar y me aparece esto en amariyo If Sheets(&quot;CAPTURA&quot

Page 88: Excel + VBA - Ejemplo de Facturación

.Range(&quot;A2&quot .value = &quot;&quot; Then la cosa es que soy nuevo en esto de excel y no se

Page 89: Excel + VBA - Ejemplo de Facturación

si Private Sub cmdAceptar_Click() If Me.txtRazon.Text = &quot;&quot; Then MsgBox (&quot; Razon no puede

Page 90: Excel + VBA - Ejemplo de Facturación

estar vacio&quot : Exit Sub If Me.txtRFC.Text = &quot;&quot; Then MsgBox (&quot;RFC no puede estar

Page 91: Excel + VBA - Ejemplo de Facturación

vacio&quot : Exit Sub If Me.txtDireccion.Text = &quot;&quot; Then MsgBox (&quot;Direccion no puede

Page 92: Excel + VBA - Ejemplo de Facturación

estar vacio&quot : Exit Sub If Sheets(&quot;CAPTURA&quot .Range(&quot;A2&quot .value =

Page 93: Excel + VBA - Ejemplo de Facturación

&quot;&quot; Then Sheets(&quot;CAPTURA&quot .Range(&quot;A2&quot .value = Me.txtRazon.Text

Page 94: Excel + VBA - Ejemplo de Facturación

Sheets(&quot;CAPTURA&quot .Range(&quot;B2&quot .value = Me.txtRFC.Text

Page 95: Excel + VBA - Ejemplo de Facturación

Sheets(&quot;CAPTURA&quot .Range(&quot;C2&quot .value = Me.txtDireccion.Text Else

Page 96: Excel + VBA - Ejemplo de Facturación

Sheets(&quot;CAPTURA&quot .Range(&quot;A1&quot .End(xkdown)(xlDropDown).value =

Page 97: Excel + VBA - Ejemplo de Facturación

Me.txtRazon.Text Sheets(&quot;CAPTURA&quot .Range(&quot;A1&quot .End(xlDown).Next.value =

Page 98: Excel + VBA - Ejemplo de Facturación

Me.txtRFC.Text Sheets(&quot;CAPTURA&quot.Range(&quot;A1&quot.End(xlDown).Next.Next.val

ue = Me.txtDireccion.Text End If Me.txtRazon.Text = &quot;&quot; Me.txtRFC.Text = &quot;&quot; Me.txtDire

ccion.Text = &quot;&quot; Me.txtRazon.SetFocus E

subindice fuera del intervalo quiere decir que estas tratando de usar una celda que no existe en excel, por ejemplo,

A1048577, siendo que solo existe hasta la A1048576.

ese error se ocasiona cuando VBA trata de buscar la siguiente celda para poner nuevos datos, entonces va a la

primera disponible y de ahi baja hasta encontrar la ultima celda usada, pero si no hay celdas usadas te va a devolver

la ultima fila de la hoja +1, osea, la celda en el numero 1048576 + 1 = 1048577, pero esta celda no existe y por eso

marca el error.

- asegurate que las hojas tienen el nombre correcto 

- Pon al menos dos registros, aunque no te sirvan

- checa que los registros comienzan en la columna A

ahora voy de salida, pero me gusraria que me envies tu archivo para poder corregir el problema.

mandame un mp para darte mi correo.

saludos.

@gustavo_tovar hace 1 año

Hermano... eres un master en esto... 

yo tengo unproblema con esta parte:

For Each f In Range(“A2:&quot; &amp; sUltimaCelda).Cells &lt;------- Aqui me marca un error de compilacion (se

esperaba: Separador de Listas

Me.cmbOT.AddItem (f.Value)

Muchas Gracias

@POOL12 hace 1 año

podrias volver a subir el archivo, no me deja descargar el archivo, enlace no funciona. 

gracias.

@kill_spinal hace 1 año

POOL12 dijo:

podrias volver a subir el archivo, no me deja descargar el archivo, enlace no funciona. 

gracias.

Page 99: Excel + VBA - Ejemplo de Facturación

estaba cambiando mi servidor y de repente me he ocupado en otras cosas. ya mañana debe estar en

funcionamiento normal.

saludos.

@kingtrase hace 1 año

toma mis 10! asi eres NFU!!!! jejeje acuerdate que hay que ser generosos!!!

@kill_spinal hace 1 año +1

kingtrase dijo:

toma mis 10! asi eres NFU!!!! jejeje acuerdate que hay que ser generosos!!!

graxxx... ya hasta habia dejado de postear

@jorgitoroyo hace 1 año

excelente. justo lo que estaba necesitando. +10

@Sebasmza hace 1 año

impresionante gracias capo

@kill_spinal hace 1 año

Sebasmza dijo:

impresionante gracias capo

gracias.

@marioneldo hace 1 año

Maestro!!!!!!!!! si se puedieran dar 1000 puntos te los dejaria. Excelente

@mananaempiezo hace 11 meses

excelente!!!!!!! gracias la verdad sos muy genero por compartir este trabajo,lo unico que no me funciono 

es cuando guardas la factura no me guarda todos los articulos ingresados solamente el ultimo

Cargar 1 más

Page 100: Excel + VBA - Ejemplo de Facturación

@mananaempiezo hace 10 meses +1

ok lo reviso y a ver que paso gracias y saludos

@mananaempiezo hace 4 meses

retome el tema de la factura para armarlo a mis necesidades lo habia abandonado,vuelvo

a tener el mismo problema,cuando guardo la factura no me guarda todos los articulos ingresados solamente el

ultimo,me baje el ejemplo completo y me pasa lo mismo alguna idea de que puede ser gracias

@kill_spinal hace 4 meses +1

debe ser la linea que activa la siguiente linea para insertar el contenido.

la condicion no se cumple y por eso inserta todos los registros en la misma linea, y obviamente, la ultima es la que

se queda grabada.

estoy corrigiendo el ejemplo para evitar ese problema. en unos minutos debe estar el archivo listo para descargar.

@kill_spinal hace 4 meses +2

archivo de descarga corregido para insertar correctamente los datos de la factura.

@anddy10 hace 3 meses

Todo esta excelente, gracias, aunque te falto otra hoja donde guardes los conceptos de la factura, y un modulo mas

de consultas modificaciones... pero bueno eso es a necesidad de cada quien... ... me ahorraste un 80 % del trabajo

de escribir codigo.. GRACIAS

@duckyboy hace 2 meses

Hola amigo, quisiera saber si me podrías ayudar a que en la factura final (impresión) aparezca además de cantidad,

descripción, valor unitario y total; la referencia (o clave) ya que necesito implementar eso en un pequeño proyecto

similar que tengo para la Universidad y me salvarías la vida....gracias!

@kill_spinal hace 2 meses

Buenas noches, lo que debes hacer es: en tu formato de impresion, debes tomar nota de la direccion de la celda en

donde debe ir cada nuevo dato que quieres imprimir.

En el form de facturacion, debes agregar los textbox's y label's para cada campo.

luego, en el procedimiento de imprimir, vas a agregar las lineas correspondientes para que el dato se copie del form

a la hoja de impresion, por ejemplo:

supongamos que tu dato referencia esta en el textbox txtRef y que en tu hoja de impresion ese dato

@duckyboy hace 2 meses

Page 101: Excel + VBA - Ejemplo de Facturación

Hola, muchas gracias...ya pude resolver ese problemita; ahora me surge otro...tengo varios clientes (RFC en tu

ejemplo) y para cada uno de ellos tengo precios diferentes; ahora quisiera saber sí es posible que al escoger el

cliente en el userform automáticamente la columna en la que están los precios cambie

@kill_spinal hace 2 meses

Buenas noches.

En ese caso, te recomiendo crear una hoja que se llame PRECIOS y que contenga una columna con la clave del

producto y una columna por cada lista de precio que necesite.

A la hoja clientes hay que agregarle una columna mas con el numero de precio ( o columna ) que le corresponde.

Luego, al momento de cargar la info del cliente, tambien te cargas el numero de precio, y para cada producto que se

teclee, hay que buscar su precio en la hoja de precios ( en la columna correspondiente al

@totin023 hace 2 meses

bueno hay que probarlo......muy bien pero como te gusta algo el alcohol......

@caso601 hace 2 meses

Mi estimado, como hago para que al momendo de facturar, me asigne automaticamente el numero de factura en

consecutivo, saludos y gracia por este magnifico aporte.

@kill_spinal hace 2 meses

txtNumfactura.Text = direccion de la celda que tiene la ultima factura

esta linea la debes poner en el evento que se ejecuta cuando se muestra el form, y tambien cada vez que se guarde

correctamente una factura.

@Daviciito7 hace 1 mes

(soy un seguidor tuyo)excelente man muy bueno para mi proyecto quizás me exonere del examen final con esta

factura no se si estoy siendo grosero al pedirte que me lo pases ¬¬ pero falta mucho todavía juasjuas,por cierto dime

yo solo quiero tener un formulario en la hoja 1 y que me pase los datos a la hoja2 de forma horizontal con los datos

de A1 HASTA G1 ( que son los que necesito) seria lo mismo pero quitando los codigos con textos imprimir?

@kill_spinal hace 1 mes

El link del archivo esta al final de la hoja.

La funcion que necesitas esta incluida en el boton cmdGuardar, solo debes adecuarla a las celdas que elijas como

destino. Normalmente, este tipo de funciones trabajan con un bucle for o while.

Revisa la funcion, saca tus conclusiones e intenta guardar algo simple. Si tienes mas dudas o no quedo como lo

necesitas, enviame un mp con tu funcion para revisarla y devolverte mis comentarios.

Page 102: Excel + VBA - Ejemplo de Facturación

saludos.

@_aLe_C hace 1 mes

Hola, gracias por el aporte, soy nueva en VBA y quería consultarte sobre algunas modificaciones si me podrías

ayudar:

- Contador de facturas automático. 

- Guardar como .PDF

Muchas gracias de antemano.

Saludos.

@kill_spinal hace 1 mes

Para tener un contador de facturas, agregas una columna que sea incremental y que guarde solo numeros, tal que,

al momento de guardar una factura, tambien se guarde el numero del contador; al final, es una columna mas como

cualquier otra.

Con respecto a la conversion en pdf, aun no he programado algun codigo para ese proposito ya que prefiero usar la

impresora del dopdf por cuestion del formato final, sin embargo, el codigo lo puedes encontrar con una simple

busqueda en google.

saludos.

@joseadrian50 hace 1 mes

Buenas Tardes, primeramente quisiera agradecerte por el post que esta muy bueno, segundo quisiera solicitarte el

link de tu anterior post donde explicas la introducion de registros simples para el caso de registro de clientes y

productos. gracias por la informacion

@kill_spinal hace 1 mes

http://www.taringa.net/posts/apuntes-y-monografias/12345898/Excel-VBA---Formulario-de-Captura.html

@tiradoleon hace 1 mes

excelente MAESTRO, nunca habia puesto un comentario aquí, pero usted vale eso y más, gracias por stu

explicación.

@netcluster hace 29 días

Estimado, excelente aporte. Una consulta, he estado trabajando en el código y me he quedado pegado en algo (soy

nuevo en esto de vba). Quiero agregar los productos desde un combo, pero no usando código, sino el nombre de los

Page 103: Excel + VBA - Ejemplo de Facturación

productos (para el caso presentado sería la columna descripción) pero al trabajar con la instrucción selection.find se

cae el sistema. Help please.

@kill_spinal hace 29 días +1

La busqueda por descripcion o por codigo es igual, ya que excel realiza una busqueda de datos en el interior de las

celdas seleccionadas... en el codigo del ejemplo, primero se selecciona la columna del codigo y luego se lanza la

instruccion find, la cual va a buscar el dato en la columna seleccionada; por lo tanto, si ahora vas a buscar por

descripcion, entonces tambien debes seleccionar solo la columna de la descripcion.

Si aun asi te sigue dando problemas entonces enviame tu archivo a kill_sp

@netcluster hace 29 días

@kill_spinal muchas gracias, ahora revisé el código con más detención y encontré mi error. Tremendo aporte 

@JoaoM hace 28 días

Me viene como dedo en c*l* de yegua, jajajajaj

Tengo una interrugante;

lo probe y veo que me sirve para lo que necesito, muy bueno pero, me dá un error en la linea 

descontarExistencia Me.lstDescripcion.List(i), Val(Me.lstCantidad.List(i))

del evento Private Sub guardarFactura()

Procedo a llenar factura y le doy guardar, viene el error

Procedo a llenar factura y le doy guardar y marco la casilla Imprimir, viene el error

Tambien, voy a la hoja Imprimir y veo siempre la misma que tiene al bajar el archivo, sea con la casilla marcada o

no.

Puedes darme alguna indicacion de que tengo que hacer para no presentar dicho error?

Y a la segunda ¿es así? o algo está mal? que tengo mal o que tengo que agrgar al libro?

Gracias, 100 piches puntos para ti, jejejejjeje

@kill_spinal hace 27 días

cual es el error que te marca? como estas metiendo los datos?

@JoaoM hace 28 días

¿Como recibir avisos de comentarios que entran?

Estoy registrado

@JoaoM hace 28 días

Page 104: Excel + VBA - Ejemplo de Facturación

En tu ejemplo tienes 4 form y en el post recomienas 6.

Dime algo tambien sobre esto

Gracias

@kill_spinal hace 27 días

Antes de este post, hice uno que detalla como hacer un form sencillo que captura datos en una hoja.

En este post, comento que se deben usar varios forms pero especifico que solo voy a ejemplificar algunos, ya que,

los que hacen falta son parecidos al form del post de la captura e incluirlos solo seria desperdicio de tiempo de

lectura para los que ya pasaron por el post anterior;

Estos forms faltantes los debes crear tu mismo segun tus necesidades a manera de ejercicio con el objetivo de

aprender

@JoaoM hace 27 días

@kill_spinal SI, lo hice ya. Los 2 que faltaban, Alta para Clientes y Alta para Productos, están hechos. Por

necesidad le agregue algunas columnas también, para que al dar de Alta Productos y Clientes, tuvieran un cuadro

para Observaciones y Ubicación para el de Alta de Productos.

Me falta una macro para Botón de Eliminar Clientes y para Productos, en cada Form, Este ultimo es que me es difícil

por falta de conocimiento en formación de código, pero ya veré que puedo conseguir, ahora bie

@kill_spinal hace 27 días +1

Para eliminar un registro es lo mismo que eliminar una fila completa, asi los demas registros se corren hacia arriba y

la lista no queda con filas vacias:

1- localizas al cliente de la misma manera en que se localiza para buscar sus datos

2- activas la celda

3- activecell.entirerow.delete ( si recuerdo bien )

aunque en realidad, los clientes deberian eliminarse con un borrado logico y no fisico, por aquello del historial......

@fimesh hace 15 horas

Muy buen aporte soy nuevo en vb jeje es mas, no conozco nada.Quisiera saber si me puedes ayudar . Como hago

para borrar un producto del listbox es decir si ingrese mal un producto en la parte del producto que lo pueda eliminar

sin tener que empezar de nuevo. también como pude poner un checkbox que diga contado y otro crédito y cuando

se seleccione uno se ponga una "x" en una celda de la hoja imprimir gracias