Saltar al contenido

Macro que me respete los autofiltros activados


Recommended Posts

publicado

Hola a todos!

Mi problema es que he realizado una macro para una planilla de cheques. El tema es que en esa planilla todas las columnas tienen autofiltro (Fecha_Vencimiento, Banco, titular, etc).

Yo necesito contar y sumar los distinto datos que se agregan en cada celda pero a su ves debo poder procesarlo cuando un o varios autofiltros esten ectivados. Ahi es donde tengo el problema, la macro que realice me suma y cuenta siempre el total de datos y no me tiene en cuenta los autofiltros.

He usado la funcion subtotal esa si me tiene en cuenta los autofiltros activados pero no se como realizar esos subtotales repetando las condiciones que necesito para cada caso.

Estye es el codigo que he realizado



Public Sub Procedimiento1()
I = 16
ACUM_IMPORTE = 0
ACUM_IMPORTE_ABOGADO = 0
ACUM_INTERES_COBRADO = 0
ACUM_INTERES_ABOGADO = 0
CONTVACIO = 0
CONTVACIO_ABOGADO = 0

ACUM_IMPORTE_CANJE = 0
ACUM_INTERES_CANJE = 0
CONTVACIO_CANJE = 0

While Worksheets("Hoja1").Cells(I, 1).Value <> ""

If Worksheets("Hoja1").Cells(I, 10).Value = 1 And Worksheets("Hoja1").Cells(I, 9).Value = "COBRADO" Then
ACUM_IMPORTE = ACUM_IMPORTE + Worksheets("Hoja1").Cells(I, 7).Value
ACUM_INTERES_COBRADO = ACUM_INTERES_COBRADO + Worksheets("Hoja1").Cells(I, 8).Value
CONTVACIO = CONTVACIO + 1

Else
If Worksheets("Hoja1").Cells(I, 10).Value = 1 And Worksheets("Hoja1").Cells(I, 9).Value = "ABOGADO" Then
ACUM_IMPORTE_ABOGADO = ACUM_IMPORTE_ABOGADO + Worksheets("Hoja1").Cells(I, 7).Value
ACUM_INTERES_ABOGADO = ACUM_INTERES_ABOGADO + Worksheets("Hoja1").Cells(I, 8).Value
CONTVACIO_ABOGADO = CONTVACIO_ABOGADO + 1
Else
ACUM_IMPORTE_CANJE = ACUM_IMPORTE_CANJE + Worksheets("Hoja1").Cells(I, 7).Value
ACUM_INTERES_CANJE = ACUM_INTERES_CANJE + Worksheets("Hoja1").Cells(I, 8).Value
CONTVACIO_CANJE = CONTVACIO_CANJE + 1
End If
End If


I = I + 1

Range("D5") = ACUM_IMPORTE
Range("B5") = CONTVACIO
Range("F5") = ACUM_INTERES_COBRADO

Range("D6") = ACUM_IMPORTE_ABOGADO
Range("B6") = CONTVACIO_ABOGADO
Range("F6") = ACUM_INTERES_ABOGADO

Range("D7") = ACUM_IMPORTE_CANJE
Range("B7") = CONTVACIO_CANJE
Range("F7") = ACUM_INTERES_CANJE


Wend

I = I - 1

Worksheets("Hoja1").Cells(I, 7).Select
celdaactiva = ActiveCell.Address

Range("H10") = Application.WorksheetFunction.Subtotal(109, Range("G16:" + celdaactiva))
Range("H13") = Application.WorksheetFunction.Subtotal(102, Range("G16:" + celdaactiva))

Worksheets("Hoja1").Cells(11, 1).Select


End Sub
[/CODE]

saludos

y gracias de antemano.

Cheques.rar

publicado

Hola!

Muchisimas gracias por responderme.

No lo entiendo porque no me suma y cuenta cuando tengo los filtros activados.

Me podrias explicar este codigo.


' Cantidad total de cheques
Q = Range([a16], [a15].End(xlDown)).Rows.Count
' CANTIDAD
[b5] = Evaluate("SUMPRODUCT( (" & _
[i16].Resize(Q).Address & " = ""COBRADO"") * (" & _
[j16].Resize(Q).Address & " <> ""CANJE"") )")
[b6] = Evaluate("SUMPRODUCT( (" & _
[i16].Resize(Q).Address & " = ""ABOGADO"") * (" & _
[j16].Resize(Q).Address & " <> ""CANJE"") )")
[b7] = Q - [b5] - [b6]


[/CODE]

Por que no lo entiendo.

muchas gracias

Invitado Cacho R
publicado

Se trata, Juan, de la aplicación del "viejo y querido" SUMAPRODUCTO. Es decir:

En B5 pondríamos

= SUMAPRODUCTO( ($I$16:$I$110 = "COBRADO") * ($J$16:$J$110 <> "CANJE") )

Mientras que en B6 pondríamos:

= SUMAPRODUCTO( ($I$16:$I$110 = "ABOGADO") * ($J$16:$J$110 <> "CANJE") )

__________________________

Como lo anterior lo quieres implementar en una macro entonces apelamos al Evaluate:

[b5] = Evaluate("SUMPRODUCT( ($I$16:$I$110 = "COBRADO") * ($J$16:$J$110 <> "CANJE") )")

y

[b6] = Evaluate("SUMPRODUCT( ($I$16:$I$110 = "ABOGADO") * ($J$16:$J$110 <> "CANJE") )")

respectivamente.

Si no conoces al Evaluate, fíjate que utiliza la misma fórmula pero en su versión inglesa.

__________________________

¿Qué falta para tornar paramétrico a lo anterior?... ¡Los rangos!

Entonces, en lugar de:

$I$16:$I$110

utilizo:

[i16].Resize(Q).Address

pues como Q vale 95, tendremos:

[i16].Resize(Q) (representa al rango I16:I110)

y:

[i16].Resize(Q).Address

nos retorna lo buscado: $I$16:$I$110

__________________________

Ocurre lo mismo con las otras fórmulas y rangos.

Además ten en cuenta que la cantidad total de cheques equivale a la cantidad total de registros (o sea: Q), mientras que la cantidad total de $ equivale a sumar los importes de cada columna.

Saludos, Cacho R.

publicado

Hola!

Pude solucionarlo.

Pude validar que celda esta oculta y cual no, para que la macro me trabaje con las celdas visibles, que me arroja como resultado el o los autofiltros activados.

Lo hice con EntireRow.Hidden en una condicion, recorriendo todas las celdas de la hoja de calculo, con un bucle



I = 1

While Worksheets("Hoja1").Cells(I, 1).Value <> ""

If Worksheets("Hoja1").Cells(I, 1).EntireRow.Hidden Then
'Las celdas estan ocultas, no procesa.
Else
'Aqui va el codigo para que trabaje
'y lo hara solo con las celdas visibles.
EndIf

I = I + 1
Wend

[/CODE]

Espero que a ustedes tambien les ayude

Saludos.

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.