Hola expertos! Les agradezco la atención y tiempo a mi pregunta. Deseo hacer un reporte mensual de registros contables de una base de datos. Para esto, los registros contables los tengo por fecha y número de cuenta contable. Entonces deseo tener una macro para que se genere un reporte de una cuenta contable determinada por fecha de registro. Ejemplo: Fecha | Cuenta contable | Nombre de la cuenta| importe
1 respuesta
Respuesta de calvuch
1
1
calvuch, las fallas constantes de esta web me cansaron!! me voy a...
Aporta más datos... Donde están los datos ( referencias A1... B44... etc) ¿Cómo tomaras los criterios (Fecha, cuenta contable?) ( ¿Referencias?... ¿Inputbox?... ¿Formulario?. ¿El reporte se genera mediante que evento?... ( botón... ¿llamada macro?) el reporte tiene solo una fila ? (Fecha | Cuenta contable | Nombre de la cuenta| importe ) ¿Dónde deseas que devuelva el adto? (Referencias)
A B C D E F G H....... 1 2 3 Fecha(A1) | cuenta contble (b1) | nombre de la cuenta (c1) | importe (D1) | 01- jul-11 101001 Bancos 1500 03-jul-11 101005 Clientes 2000 Los datos están en fila y hacia abajo. Entonces lo que necesito es tener una macro que me de los registros de la 101001 por mes en otra hoja, solo aplicando un botón. A1 B1 C1 D1 E1 Cuenta contable| Nombre de la cuenta | Ene | Feb | Mar.............. A2 B2 C2 D2 E2 101001 Bancos 1500 2350 1000........... A3 B3 C3 D3 E3 101005 Clientes 2000 150 890... Y así sucesivante por cada cuenta y los importes por mes. Gracias por la atención y tiempo.
Ok. Salio un poco largo pero acá vamos: Como no se cual es el indice de tus hojas tome las mías en donde Sheets(10) es la hoja que contiene los datos a distribuir Sheets(11) es la hoja en donde los pegaremos. Tu debes cambiar el indice de las hojas en el script por los indices que tiene tus hojas. Me explico la hoja nombre "Hoja1", siempre tiene el indice 1 aunque le cambies el nombre muchas veces. ¿Sigue siendo el elemento 1 de la colección se entiende? Ok, vamos Pon un botón en la hoja que recibirá los datos alojalo de preferencia desde la columna P hacia la derecha Vamos a los rótulos A1 cuenta B1 nomber C1 enero Hasta n1 diciembre Pues bien: en la hoja base Se entinden los rótulos en fila 1 también en esta forma Fecha Cuenta nombre importe Bien, abre el editor de VBA (ALT+F11) o bien en modo de diseño sobre el botón insertado(que debe ser un control Activex) ve el menu con el botón derecho del mouse y selecciona la opción "ver código").. allí se te abrirá la ventana respectiva al código de ese botón En esa ventana pega esto: ' resumen contable 'by calvuch 20072011 Dim i As Long Dim total_registros As Long Dim total_base As Long Dim fila As Integer Dim r As Long total_registros = Application.WorksheetFunction.CountA(Sheets(11).Range("A:A")) - 1 total_base = Application.WorksheetFunction.CountA(Sheets(10).Range("A:A")) If total_base <= 0 Then Exit Sub Application.ScreenUpdating = False ' ' copia numeros de cuenta desde base Sheets(10).Range("B2" & ":" & "B" & total_base).Copy Range("A2").Select ActiveSheet.Paste Application.CutCopyMode = False ActiveSheet.Range("$A:$A").RemoveDuplicates Columns:=1, Header:=xlYes Range("A2").Select fila = 2 total_registros = Application.WorksheetFunction.CountA(Sheets(11).Range("A:A")) - 1 For r = 1 To total_registros For i = 2 To total_base If Sheets(11).Range("A" & fila) = Sheets(10).Range("B" & i) Then Select Case Int(Mid(Sheets(10).Range("A" & i), 4, 2)) Case Is = 1 Sheets(11).Range("C" & fila) = Sheets(10).Range("D" & i) Case Is = 2 Sheets(11).Range("D" & fila) = Sheets(10).Range("D" & i) Case Is = 3 Sheets(11).Range("E" & fila) = Sheets(10).Range("D" & i) Case Is = 4 Sheets(11).Range("F" & fila) = Sheets(10).Range("D" & i) Case Is = 5 Sheets(11).Range("G" & fila) = Sheets(10).Range("D" & i) Case Is = 6 Sheets(11).Range("H" & fila) = Sheets(10).Range("D" & i) Case Is = 7 Sheets(11).Range("I" & fila) = Sheets(10).Range("D" & i) Case Is = 8 Sheets(11).Range("J" & fila) = Sheets(10).Range("D" & i) Case Is = 9 Sheets(11).Range("K" & fila) = Sheets(10).Range("D" & i) Case Is = 10 Sheets(11).Range("L" & fila) = Sheets(10).Range("D" & i) Case Is = 11 Sheets(11).Range("M" & fila) = Sheets(10).Range("D" & i) Case Is = 12 Sheets(11).Range("N" & fila) = Sheets(10).Range("D" & i) End Select End If DoEvents Next fila = (fila + 1) DoEvents Next Application.ScreenUpdating = True MsgBox "Concluido", vbInformation End Sub Bien, lo que hace esto es lo siguiente, toma la columna b de la hoja base ( los números de cuenta) y los pega en la columna A de la hoja que tendrá el resumen, pero los pega sin repetios, es decir registros únicos, luego los bucles tomaran una por una las cuentas que se pegaron y recorrerá la base buscando coincidentes y en función al mes que existe en el campo fecha, el control select del bucle pondrá el importe en la celda correspondiente de la hoja de resumen en función a la intentar de su cuenta en al misma hoja, es decir su fila. y asi una a una. Nota: si en la hoja base tienes una cuenta con un fecha mes repetida es decir 10-01-2011 101001 $1.000 15-01-2011 101001 $5.300 El bucle tomara como ultimo valor la ultima coincidencia es decir 5.300, no sumara los importes, así que la validación de la integridad de los datos es tu responsabilidad. En la columna B del resumen en donde debe ir el nombre de la cuenta, pues allí no tienes más que utilizar un sencillo =BuscarV() Ejemplo: =buscarv(A2;Hoja1!$B$2:$C$65536;2;FALSO) Y lo pegas hacia abajo y listo, busca la cuenta de columna A en la matriz B2:C65536 de hoja base en este ejemplo la hoja1 Bien eso es todo. Recuerda cambiar los indices de cada hoja Sheets(xx) Bye Si te sirve CIERRA la pregunta, si tienes otras preguntas habré "otra pregunta"