Sumar rango con filtro varias columnas pasar total filtrado a otra hoja por filtro.

Sumar rango con filtro varias columnas.

Tengo un libro, en el cual tengo que hacer lo siguiente: en columna "A" filtrar por fecha, las demás columnas ("b: ..."), ( los puntos son por que puede variar la cantidad de columnas), van números, tengo que poner la suma total de cada columna en hoja2 por su día de cada columna.

La imagen 2 seria el resumen. Las columnas pueden ser menos o más.

Disculpa Dante por preguntarte directamente.

1 respuesta

Respuesta
1

H o  l a:

Revisa insertando una tabla dinámica.

Arrastra la fecha a "Rótulos de fila" y cada campo de columna lo arrastras a "Valores"

De esa forma tendrás los totales por cada día y por cada columna:


':)
S a l u d o s . D a n t e A m o r
':) Si es lo que necesitas. Recuerda valorar la respuesta. G r a c i a s.

Gracias Dante por responder y tu antencion, lo que necesito es autmatisarlo, que al momento de poner Hoja1.Activate, me haga toda la función, o sea que ya no tengan que moverle a nada.

Hasta el momento tengo este código.

Private Sub CommandButton1_Click()
Dim dia As Integer
Dim fin As Long
C = Cells(2, Columns.Count).End(xlToLeft).Column
fin = Hoja1.Range("a1048576").End(xlUp).Row ' ultima fila
For d = 2 To 32 ' ciclo par a elejir el dia'
          For I = 2 To fin  ' ciclo 31 dias de los meses no importa los que tienen 30 28 o viciestos
               DIA2 = Hoja2.Cells(d, 1)  ' doy valor del dia para buscar en hoja2
               dia = Day(Hoja1.Cells(I, 1)) ' doy valor del dia para buscar en hoja2
               If dia = DIA2 Then 'igualo dias hoja 1 y hoja2            
                      Total = Total + Hoja1.Cells(d, 2) ' sumo dias
                        Hoja2.Cells(dia + 1, 3) = Total 'pongo total en hoja 2
                      '  Exit For
              'Else
              '     Exit For
               End If
          Next I
Next d
Hoja2.Activate
' suma hoja2 columna a la derecha
  If C < Columns("B").Column Then C = Columns("C").Column
     Range("B2") = Application.Sum(Range(Cells(2, Columns("C").Column), Cells(2, C)))

End Sub

En este código me hace la suma pero no logro que distinga la diferencia del día, y me faltaría que lo hiciera por columnas, el valor de las columnas puede ser variable de 1 a 3, 5 o 15.

Espero me puedas apoyar, o si encuentras una o una forma más fácil, de lo que intento hacer. Si te fijas al final esta el código que pusite. Y que me esta sirviendo.

Te anexo la macro

Sub Resumen()
'Por.Dante Amor
    Set h1 = Sheets("Hoja1")
    Set h2 = Sheets("Hoja2")
    h1.Rows(1).Copy h2.Rows(1)
    h2.UsedRange.Offset(1, 1).ClearContents
    For j = 2 To h1.Cells(1, Columns.Count).End(xlToLeft).Column
        For i = 2 To h1.Range("A" & Rows.Count).End(xlUp).Row
            dia = Day(h1.Cells(i, "A")) + 1
            h2.Cells(dia, j) = h2.Cells(dia, j) + h1.Cells(i, j)
        Next
    Next
    MsgBox "Fin"
End Sub

No sé a que te refieres con esto:

"que al momento de poner Hoja1.Activate"


Si quieres que se ejecute en automático tienes que llamar la macro desde algún evento del libro o de la hoja, por ejemplo si quieres que se ejecute en automático cuando abres el libro:

Private Sub Workbook_Open()
    Call Resumen
End Sub

En los eventos de la hoja, cuando seleccionas la hoja:

Private Sub Worksheet_Activate()
    Call Resumen
End Sub

' : )
'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias
' : )

¡Gracias, super excelente, magnifico!

Que bárbaro, eres mi ídolo, me quedo super, tengo una semana buscando, no paso por mi cabeza que se podía poner así el cilco, apenas había cambiado el else con total=0 y así ya me quedaba la suma, y me iba a faltar los ciclos por columnas.

Efectivamente, quiero que al momento en que se active la hoja se corra el código para poder portegerlo para modificarse.

Espero me puedas seguir apoyando, con dudas, tengo 46 años, y estoy comenzando en esto de la programación.

Con mucho gusto te ayudo con todas tus peticiones. Crea una nueva pregunta en todoexpertos por cada petición, en el desarrollo de la pregunta escribe: "para Dante Amor", ahí me describes con detalle lo que necesitas.

Sal u dos

Gracias Dante de este mismo código que me pasaste, como puedo modificar, si necesito copiar hoja1.cells(11,12) de comenzar la copia de celdas y pegarla en hoja2.cells(11,3)

h1.Rows(1).Copy h2.Rows(1)

Esta instrucción

H1. Rows(1). Copy h2. Rows(1)

Lo que hace es copiar la fila1, suponiendo que ahí tienes los encabezados.

No entiendo lo que necesitas.

Con mucho gusto te ayudo con todas tus peticiones. Crea una nueva pregunta en todoexpertos por cada petición, en el desarrollo de la pregunta escribe: "para Dante Amor", ahí me describes con detalle lo que necesitas.

Sal u dos

Buen día Dante Amor, gracias por tu apoyo, lo que necesito es que la copia inicie de hoja1 en

hoja1.cells(11,12), y pegarla en hoja2(11,3). La insturccion que pones, (que gracias a ti he aprendido), me copia todo el renglón, y solo necesitaría dondo te comento hacia adelante.

Según las imágenes que pusiste los datos de la hoja1 y de la hoja2 empiezan en la celda A1.

Ahora me estás pidiendo algo que no entiendo.

Con mucho gusto te ayudo con todas tus peticiones. Crea una nueva pregunta en todoexpertos por cada petición, en el desarrollo de la pregunta escribe: "para Dante Amor", ahí me describes con detalle lo que necesitas.

Sal u dos

¡Gracias!

Hola Dante, ya casi me sale lo que necesito, con tu código, me fui analizando línea por línea, para poder hacer lo que necesito, te dejo código, para que lo pruebes y veas.

Set H1 = Sheets("Hoja1")
    Set h2 = Sheets("Hoja2")
    H1.Rows(11).Copy h2.Rows(11)
    Hoja2.Range("a:i").Delete
    Hoja2.Range("b:b").Columns.Insert
    x = 1
    For i = 12 To 42
     Hoja2.Cells(i, 1) = x
     x = x + 1
     Next i
    ' h2.UsedRange.Offset(1, 1).ClearContents ' limpio hoja2
    For j = 1 To H1.Cells(11, Columns.Count).End(xlToLeft).Column  'BUSCAR ULTIMA COLUMNA
        For i = 12 To H1.Range("j" & Rows.Count).End(xlUp).Row ' BUSCAR ULTIMA FILA
            dia = Day(H1.Cells(i, "j")) + 1
            h2.Cells(dia + 10, j + 2) = h2.Cells(dia + 10, j + 2) + H1.Cells(i, j + 10)
        Next i
    Next j

Hola Dante buen día, molestándote otra vez, ya me cambiaron la jugada, te explico, el código en el que me has estado ayudando, hace el movimiento, perfecto, lo hice para que fuera con 31 días, no importando si el mes es de 30 o viciesto, pero ahora necesito que no me ponga los días en los cuales no hubo movimiento. O sea del 1 al 15 (quitando digamos el día 9), hay movimiento de ahí hasta el 25, al ejecutar, el código que me mandaste me toma las columnas por día como debe ser 1,2,3, etc.

No encuentro manera de poder mandarte el archivo para que lo veas. Te dejo código.

Sub suma_matriz()
     Application.ScreenUpdating = False
Set H1 = Sheets("Hoja1")
Set H2 = Sheets("Hoja2")
     H1.Activate
     H1.Range("L18").Select
          Range(Selection, Selection.End(xlToRight)).Select
          Selection.Copy
     H2.Activate
     H2.Range("C18").Select
     ActiveSheet.Paste
     Application.CutCopyMode = False
     Hoja2.Cells(18, 1) = "DIA"
     Hoja2.Cells(18, 2) = "TOTAL DIA "
     Hoja2.Rows("19:49").ClearContents
     '- poner los dias del 1 al 31
     'x = 1
     'For i = 19 To 49
     '     Hoja2.Cells(i, 1) = x
     '     x = x + 1
     'Next i
     '-------------- copio filas de h1 elimino repetidos
     For y = 19 To H1.Range("A" & Rows.Count).End(xlUp).Row ' BUSCAR ULTIMA FILA DONDE VA LA FECHA
            dia = Day(H1.Cells(y, "A"))
            Hoja2.Cells(y, 1) = dia
     Next y
Hoja2.Range("A19:A1048000").Select
Hoja2.Range(Selection, Selection.End(xlDown)).Select
Hoja2.Range("A19:A1048000").RemoveDuplicates Columns:=1, Header:=xlYes
Rows("19:19").Select
Selection.Delete Shift:=xlUp
'------------- sumar de hoja1 a hoja2
     For j = 1 To H1.Cells(18, Columns.Count).End(xlToLeft).Column  'BUSCAR ULTIMA COLUMNA FILA TITULOS INCIDENTES
        For i = 19 To H1.Range("A" & Rows.Count).End(xlUp).Row ' BUSCAR ULTIMA FILA DONDE VA LA FECHA
            dia = Day(H1.Cells(i, "A")) + 1
            H2.Cells(dia + 17, j + 2) = H2.Cells(dia + 17, j + 2) + H1.Cells(i, j + 11)
          Next i
    Next j
'------------ suma columnas a la derecha
For Z = 19 To 49
C = Hoja2.Cells(Z, Columns.Count).End(xlToLeft).Column
  If C < Hoja2.Columns("B").Column Then C = Columns("C").Column
     Hoja2.Range("B" & Z) = Application.Sum(Hoja2.Range(Cells(Z, Columns("C").Column), Cells(Z, C)))
Next Z
'------------ suma columnas
f = 19
D = H2.Cells(18, Columns.Count).End(xlToLeft).Column
     For i = 1 To D
          If Cells(18, i) <> Empty Then
    Cells(50, i).FormulaR1C1 = "=SUM(R[-31]C:R[-1]C)"
          End If
Next
End Sub

Con mucho gusto te ayudo con todas tus peticiones. Crea una nueva pregunta en todoexpertos por cada petición, en el desarrollo de la pregunta escribe: "para Dante Amor", ahí me describes con detalle lo que necesitas. 

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas