¿Sumar.si múltiple - otra forma de hacerlo?

Tengo la siguiente tabla (bastante más grande de lo que es este ejemplo)

Necesito sumar las cantidades de cada producto para cada código coincidente. Es decir, obtener algo como:

H200 --- 300

H201 --- 300

H202 --- 100

...

El tema es que como puede verse, los códigos no están puestos por columnas.

Usando sumar. Si tengo que generar unas tablas auxilares muy complicadas, y no se me ocurre otra forma de hacerlo. ¿Alguna idea

3

3 respuestas

Respuesta
1

Si mencionas que esto es un solo un ejemplo y que los datos reales son mucho más largos entonces por fórmulas aparte de ser muy lento y tedioso te va a llevar un buen rato armarlas, lo mejor es que sea por medio de macros, observa el resultado de la macro, debajo de la tabla te organiza los datos por código y luego crea una tabla de totales, en solo dos tablas ya tienes el resultado que buscas

y la macro es esta 

Option Base 1
Sub sumar_x_codigos()
Set datos = Range("A1").CurrentRegion
With datos
    r = .Rows.Count: c = .Columns.Count
    Set res = .Rows(r + 3).Resize(r * c, 3)
    ReDim matriz(r * c, 3)
    x = 1
    For i = 2 To r
        For j = 1 To c
            matriz(x, 1) = .Cells(i, 1)
            matriz(x, 2) = .Cells(i, j + 2)
            If matriz(x, 2) = Empty Or IsNumeric(matriz(x, 2)) Then GoTo otro
            matriz(x, 3) = .Cells(i, c)
            x = x + 1
otro:
        Next j
    Next i
    With res
        Range(.Address) = matriz
        Set res = .CurrentRegion
        r1 = .Rows.Count: c1 = .Columns.Count
        .Sort key1:=Range(.Columns(2).Address), order1:=xlAscending
        Set Total = .Columns(c1 + 3).Resize(r1, c1)
        With Total
            res.Copy: .PasteSpecial xlValues
            .RemoveDuplicates Columns:=2
                For k = 1 To r1
                    codigo = .Cells(k, 2)
                    If codigo = Empty Then GoTo sig
                    .Cells(k, 3) = WorksheetFunction.SumIf(res.Columns(2), codigo, res.Columns(3))
sig:
                Next k
        .Columns(1).ClearContents
        End With
    End With
    Set datos = nothinng: Set res = Nothing: Set Total = Nothing
End With
End Sub

¡Gracias! 

Muchas gracias James Bond.

Todavía no he tenido el tiempo para analizar el código, pero estoy seguro al 100% de que me servirá tu idea. Otra cosa es que me llevará un buen rato entenderlo :)

Gracias de nuevo.

Buenos días James Bond.

Estoy trabajando con el código y he de decirte que la solución es perfecta y muy elegante! De paso me ha servido para descubrir algo de código con el que no había trabajado nunca en excel (aunque un poco sí en otros entornos).

Una última cosa al respecto, tengo varias hojas dentro del mismo libro y me gustaría que la tabla "resultado", la pusiese en otra hoja. Si es complicar la cosa, no me molesta donde está ahora (me la he llevado a una zona de la hoja que no se ve), simplemente "copiarla" a una ubicación concreta de otra hoja. ¿Cómo podría hacerlo?

Muchas gracias de antemano.

Solo es cuestión de hacer unos pequeños ajustes, esta es la macro que hace lo que pides, solo cambia hoja2 por el nombre de la hoja donde quieras que quede la tabla

Option Base 1
Sub sumar_x_codigos()
Set datos = Range("A1").CurrentRegion
Set H2 = Worksheets("HOJA2")
With datos
    r = .Rows.Count: c = .Columns.Count
    H2.Cells.ClearContents
    Set res = H2.Range("A2").Resize(r * c, 3)
    ReDim matriz(r * c, 3)
    x = 1
    For i = 2 To r
        For j = 1 To c
            matriz(x, 1) = .Cells(i, 1)
            matriz(x, 2) = .Cells(i, j + 2)
            If matriz(x, 2) = Empty Or IsNumeric(matriz(x, 2)) Then GoTo otro
            matriz(x, 3) = .Cells(i, c)
            x = x + 1
otro:
        Next j
    Next i
    With res
        H2.Range(.Address) = matriz
        Set res = .CurrentRegion
        r1 = .Rows.Count: c1 = .Columns.Count
        .Sort key1:=H2.Range(.Columns(2).Address), order1:=xlAscending
        Set Total = .Columns(c1 + 3).Resize(r1, c1)
        With Total
            res.Copy: .PasteSpecial xlValues
            .RemoveDuplicates Columns:=2
                For k = 1 To r1
                    codigo = .Cells(k, 2)
                    If codigo = Empty Then GoTo sig
                    .Cells(k, 3) = WorksheetFunction.SumIf(res.Columns(2), codigo, res.Columns(3))
sig:
                Next k
        .Columns(1).ClearContents
        End With
    End With
    Set datos = Nothing: Set res = Nothing: Set Total = Nothing
End With
End Sub
Respuesta
1

Hay algo que no me cuadra.

Si tienes varios productos diferentes en la misma fila (H200, H201, H202) y la cantidad es única (100) ¿Esos 100 son de cuál de esos 3 productos?

Respuesta
1

Si esas son todas las columnas que ocupas para los códigos, puedes simplemente anidar la función Sumar. Si

Mejor puedes utilizar:

=SUMAPRODUCTO(($C$2:$J$5=C9)*$K$2:$K$5)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas