Saltar al contenido

Sumarsi con criterio de igualdad adentro de otro criterio de igualdad


SabrinaSol

Recommended Posts

publicado

Estimados,

Les comento lo que quiero hacer, y la verdad que me estoy volviendo loca buscando la solución.

Tengo tablas de más de 50 mil filas y más de 10 columnas, de las cuales debo extraer información.

Como lo que tengo que hacer es complicado de explicar, se los muestro con un ejemplo simplificado:

A____B___C__D

Ert__Bra__5__4

Sdf__Arg__7__6

Sdf__Arg__6__2

Sdf__Bra__5__3

Sdf__Bra__6__2

Sdf__Bra__5__4

Tyu__Arg__6__4

Tyu__Arg__2__3

Tyu__Bra__1__1

Uio__Arg__2__3

Uio__Bra__5__3

Vbn__Bra__4__2

De modo que Sdf debe sumar para Arg 13 en la columna C y 8 en la columna D, y de nuevo Sdf suma para Bra 16 en la columna C y 9 en la columna D. Algo similar sucede para Tyu. El resultado, corriendo la macro que busco, debería ser:

A____B___C__D

Ert__Bra__5__4

Sdf__Arg__13__8

____Bra__16__9

Tyu__Arg__8__7

____Bra__1__1

Uio__Arg__2__3

Uio__Bra__5__3

Vbn__Bra__4__2

El código que encontré, sólo me sirve para el caso en que sólo tenga un criterio, o sea, las columnas A, C, y D, y es el siguiente:

Sub sumarsi()

Application.ScreenUpdating = False

Dim uf As Long, uf2 As Long

Dim rangocriterio As Range

Dim rangosuma1 As Range

Dim rangosuma2 As Range

uf = Range("A" & Rows.Count).End(xlUp).Row

Range("A1:A" & uf).AdvancedFilter 2, CriteriaRange, Range("E1"), Unique:=True

Set rangocriterio = Range("A2:A" & uf)

Set rangosuma1 = Range("B2:B" & uf)

Set rangosuma2 = Range("C2:C" & uf)

Range("F1") = Range("B1"): Range("G1") = Range("C1")

uf2 = Range("E" & Rows.Count).End(xlUp).Row

With Range("F2:F" & uf2)

.Formula = "=SUMIF(" & rangocriterio.Address & ", $E2 ," & rangosuma1.Address & ")"

.Formula = .Value

End With

With Range("G2:G" & uf2)

.Formula = "=SUMIF(" & rangocriterio.Address & ", $E2 ," & rangosuma2.Address & ")"

.Formula = .Value

End With

Me podrían decir cómo hacer para que me sirva teniendo dos columnas como criterios?

Muchísimas gracias.

Saludos!

publicado

Hola Sabrina, intenta con esto adaptando los rangos, si no funciona por favor sube tu libro.

Sub Sabrina()
Application.ScreenUpdating = False
Range("C1").EntireColumn.Insert
Range("C1") = "COMBO"
Range("C2:C13").FormulaR1C1 = "=RC[-2]&RC[-1]"
Range("C1:C13").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
"G2"), Unique:=True
Range("H3:I10").FormulaR1C1 = "=SUMIF(R2C3:R13C3,RC7,R2C[-4]:R13C[-4])"
Range("H3:I10").Value = Range("H3:I10").Value
Range("C1").EntireColumn.Delete
Application.ScreenUpdating = True
End Sub[/CODE]

publicado

Muchas gracias por responder!

Como inconveniente encontré que coloca los datos de la columna A y B en una sola, juntos, por ej. dice ErtBra. Y necesito que estén en dos columnas distintas.

Y por otro lado, me gustaría poder modificar el código para armar otras macros donde pueda ampliar la cantidad de columnas criterio (donde siempre es el mismo: que se repitan los datos). Y no comprendo el rango del criterio como para ampliarlo, no se si entiende mi duda.

Saludos!

publicado

Subo un archivo pequeño que sirve de ejemplo para que te sea más fácil entender lo que necesito.

Quiero sumar las columnas E y F teniendo en cuenta que A se subdivide en B y a su vez B se subdivide en C. Por lo cual quiero que las columnas E y F muestren las sumatorias de cada rama del árbol.

En otros archivos puede haber más o menos columnas criterio. En este archivo son la A, B, y C, en otros puede haber más o menos.

Desde ya, te agradezco muchísimo por el interés en resolverlo.

Saludos!

Ejemplo para SumarSi.xls

publicado

Intenta con esto, tu archivo aun no lo

Sub Sabrina()
Application.ScreenUpdating = False
Range("C1").EntireColumn.Insert
Range("C1") = "COMBO"
Range("C2:C13").FormulaR1C1 = "=RC[-2]&RC[-1]"
Range("C1:C13").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
"G1"), Unique:=True
Range("I2:J9").FormulaR1C1 = "=SUMIF(R2C3:R13C3,RC7,R2C[-5]:R13C[-5])"
Range("I2:J9").Value = Range("I2:J9").Value
Range("A1:B1") = Array(1, 2)
Columns("G:G").ClearContents
Range("A1:B13").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
"G1:H1"), Unique:=True
Rows("1:1").ClearContents
Columns("C:C").Delete 'Shift:=xlToLeft
Range("F2:I9").Select
Application.ScreenUpdating = True
End Sub[/CODE]

veo, lo hare tan pronto pueda

publicado

Hola, gracias por la respuesta! Paso a comentarte los resultados.

Ahora sí, las columnas están separadas :)

Sólo que desaparece la fila encabezados, pero no es un gran problema, lo copio otra vez y listo.

En cuanto al código, te aclaro que el verdadero archivo tiene 52707 filas (lo achiqué porque no me permite subir archivos tan grandes). Entonces, cuando quiera ejecutar la macro, no puedo saber previamente de cuántas filas quedará la tabla-resultado con las sumatorias que necesito. Por lo que leo en el código, el rango hasta la fila 9 lo estableciste porque ya sabés que en el ejemplo que puse, la tabla-resultado llegaba hasta ahí. Pero en la realidad, como te decía, no lo voy a poder saber.

Por otro lado, ¿qué debería modificar en el código para incluir otras columnas? Por ejemplo, en el archivo que voy a trabajar, voy a incluir otra columna que describe los números de la columna C. Subo el archivo nuevamente, con esta pequeña modificación, para que lo veas.

Saludos!

Sumar Si Sab 6C.xls

Archivado

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

  • 109 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      187
    • Comentarios
      97
    • Revisiones
      29

    Más información sobre "Un juego del Rabino en Excel"
    Última descarga
    Por pegones1

    2    1

  • Crear macros Excel

  • Mensajes

    • Que tal nuevamente,  adjunto una solución alternativa: =MAX(A:.A)-BYROW(F4:.AK20,LAMBDA(r,BUSCAR(2,1/(r=0),F3:.AK3))) Cabe mencionar que esta solución requiere funciones nuevas como RECORTAR.RANGO. CONTADOR FINAL (Solucion).xlsb
    • Buenos días,  espero se encuentren bien de salud compañeros, Favor me podrían ayuda con lo siguientes como se podría hacer cuando tengo una tabla dinámica que  amedida que se aumente las columnas fechas con data un formula que se coloco al final busque o analice siempre la ultima fila y columna de la fecha. Coloco un ejemplo
    • @JSDJSD Excelentes, GRACIAS POR TU SOPORTE , me ayudo demasiado es exactamente lo que quería. 5 ESTRELLAS
    • 'Opción 1 Sub FiltrarSKUPorFecha(): Application.ScreenUpdating = False Dim ultimaFila As Long, fila As Long Dim diccionarioSKU As Object Dim listaEliminar As Object Dim fechaActual As String, fechaSiguiente As String Dim f As Variant With Sheets("Consolidado") ultimaFila = .Cells(.Rows.Count, 1).End(xlUp).Row ' Crear diccionarios para comparar SKU y almacenar filas a eliminar Set diccionarioSKU = CreateObject("Scripting.Dictionary") Set listaEliminar = CreateObject("Scripting.Dictionary") ' Recorrer desde la primera fila hasta la penúltima For fila = 2 To ultimaFila - 1 fechaActual = .Cells(fila, 1).Value fechaSiguiente = .Cells(fila + 1, 1).Value ' Solo comparar la fecha actual con la siguiente (inmediatamente superior) If fechaActual <> fechaSiguiente Then diccionarioSKU.RemoveAll ' Limpiar el diccionario antes de llenarlo ' Guardar los SKU de la fecha siguiente (solo de la siguiente) For f = fila + 1 To ultimaFila If .Cells(f, 1).Value <> fechaSiguiente Then Exit For diccionarioSKU(.Cells(f, 2).Value) = 1 Next f ' Revisar los SKU de la fecha actual y marcar los que deben eliminarse For f = fila To 2 Step -1 If .Cells(f, 1).Value <> fechaActual Then Exit For ' Solo eliminar si el SKU no está en la fecha siguiente If Not diccionarioSKU.exists(.Cells(f, 2).Value) Then listaEliminar(f) = 1 ' Marcar fila para eliminar después End If Next f ' Ya no es necesario seguir buscando después de comparar la primera y la siguiente fecha Exit For End If Next fila ' Eliminar las filas marcadas sin afectar el bucle principal For Each f In listaEliminar.keys .Rows(f).Delete Next End With MsgBox "Completado correctamente.", vbInformation End Sub 'Opción 2 Sub FiltrarSKUPorFecha1(): Application.ScreenUpdating = False Dim ultimaFila As Long, fila As Long Dim listaEliminar As Collection Dim fechaActual As String, fechaSiguiente As String Dim f As Variant, i As Long Dim SKUExiste As Boolean With Sheets("Consolidado") ultimaFila = .Cells(.Rows.Count, 1).End(xlUp).Row ' Inicializar la colección para marcar las filas a eliminar Set listaEliminar = New Collection ' Recorrer desde la primera fila hasta la penúltima For fila = 2 To ultimaFila - 1 fechaActual = .Cells(fila, 1).Value fechaSiguiente = .Cells(fila + 1, 1).Value ' Solo comparar la fecha actual con la siguiente (inmediatamente superior) If fechaActual <> fechaSiguiente Then ' Revisar los SKU de la fecha actual y marcar los que deben eliminarse For f = fila To 2 Step -1 If .Cells(f, 1).Value <> fechaActual Then Exit For ' Comprobar si el SKU está en la fecha siguiente SKUExiste = False For i = fila + 1 To ultimaFila If .Cells(i, 1).Value <> fechaSiguiente Then Exit For If .Cells(i, 2).Value = .Cells(f, 2).Value Then SKUExiste = True Exit For End If Next i ' Si el SKU no se encuentra en la fecha siguiente, marcar para eliminar If Not SKUExiste Then listaEliminar.Add f ' Marcar fila para eliminar después End If Next f ' Ya no es necesario seguir buscando después de comparar la primera y la siguiente fecha Exit For End If Next fila ' Eliminar las filas marcadas sin afectar el bucle principal For Each f In listaEliminar .Rows(f).Delete Next f End With MsgBox "Completado correctamente.", vbInformation End Sub   TABLA ELIMINAR.xlsm
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • 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.