arrays - resueltos - Sumar la columna B en base a los valores de columna C
suma de arreglos bidimensionales en java (1)
Tengo una pregunta rápida: intento resumir en una tabla de 4 columnas la columna número 2 si el valor en la columna número 1 Y 3 coincide. Encontré un código de muestra aquí en el desbordamiento de la pila, pero cuenta actualmente basado en la columna 1. Soy nuevo en VBA y no sé qué cambiar o cómo ajustar el código para basar mis cálculos en la columna 1 y 3. Aquí es el código de muestra:
Option Explicit
Sub testFunction()
Dim rng As Excel.Range
Dim arrProducts() As String
Dim i As Long
Set rng = Sheet1.Range("A2:A9")
arrProducts = getSumOfCountArray(rng)
Sheet2.Range("A1:B1").Value = Array("Product", "Sum of Count")
'' go through array and output to Sheet2
For i = 0 To UBound(arrProducts, 2)
Sheet2.Cells(i + 2, "A").Value = arrProducts(0, i)
Sheet2.Cells(i + 2, "B").Value = arrProducts(1, i)
Next
End Sub
'' Pass in the range of the products
Function getSumOfCountArray(ByRef rngProduct As Excel.Range) As String()
Dim arrProducts() As String
Dim i As Long, j As Long
Dim index As Long
ReDim arrProducts(1, 0)
For j = 1 To rngProduct.Rows.Count
index = getProductIndex(arrProducts, rngProduct.Cells(j, 1).Value)
If (index = -1) Then
'' create value in array
ReDim Preserve arrProducts(1, i)
arrProducts(0, i) = rngProduct.Cells(j, 1).Value '' product name
arrProducts(1, i) = rngProduct.Cells(j, 2).Value '' count value
i = i + 1
Else
'' value found, add to id
arrProducts(1, index) = arrProducts(1, index) + rngProduct.Cells(j, 2).Value
End If
Next
getSumOfCountArray = arrProducts
End Function
Function getProductIndex(ByRef arrProducts() As String, ByRef strSearch As String) As Long
'' returns the index of the array if found
Dim i As Long
For i = 0 To UBound(arrProducts, 2)
If (arrProducts(0, i) = strSearch) Then
getProductIndex = i
Exit Function
End If
Next
'' not found
getProductIndex = -1
End Function
Sum Column B basado en la columna A usando la macro de Excel VBA
¿Podría por favor avisarme cómo puedo resolver este problema? A continuación puede encontrar una imagen de muestra de mi pequeña mesa. La cantidad de la parte amarilla, por ejemplo, se sumará y la segunda fila se eliminará.
dijiste " Intento resumir en una tabla de 4 columnas columna número 2 ", pero desde tu "Tabla de muestra - Imagen" entiendo que quieres resumir la columna número 4
editado después de la variación OP del rango de datos
Asumiendo lo anterior, podrías probar lo siguiente
Option Explicit
Sub main()
On Error GoTo 0
With ActiveSheet ''<== set here the actual sheet reference needed
'' With .Range("A:D").Resize(.cells(.Rows.Count, 1).End(xlUp).row) ''<== here adjust "A:D" to whatever colums range you need
With .Range("A51:D" & .cells(.Rows.Count, "A").End(xlUp).row) ''<== here adjust "A:D" to whatever colums range you need
With .Offset(1).Resize(.Rows.Count - 1)
.Offset(, .Columns.Count).Resize(, 1).FormulaR1C1 = "=SUMIFS(C2, C1,RC1,C3, RC3)" ''1st "helper column is the 1st column at the right of data columns (since ".Offset(, .Columns.Count)")
.Columns(2).Value = .Offset(, .Columns.Count).Resize(, 1).Value ''reference to 1st "helper" column (since ".Offset(, .Columns.Count)")
.Offset(, .Columns.Count).Resize(, 1).FormulaR1C1 = "=concatenate(RC1,RC3)"
With .Offset(, .Columns.Count + 1).Resize(, 1) ''2nd "helper" column is the 2nd column at the right of data columns (since ".Offset(, .Columns.Count + 1)"
.FormulaR1C1 = "=IF(countIF(R1C[-1]:RC[-1],RC[-1])=countif(C[-1],RC[-1]),1,"""")" ''reference to 1st "helper" column (with all those "C[-1]")
.Value = .Value
.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
.Offset(, -1).Resize(, 2).ClearContents '' reference to both "helper" columns: ".Offset(, -1)" reference the 1st since it shifts one column to the left from the one referenced in the preceeding "With.." statement (which is the 2nd column at thre right of data columns) and ".Resize(, 2)" enlarges to encose the adjacent column to the right
End With
End With
End With
End With
End Sub
hace uso de dos columnas "auxiliares", que supuse que podrían ser las dos adyacentes a las últimas columnas de datos (es decir, si las columnas de datos son "A: D", las columnas de ayuda son "E: F")
en caso de que necesite utilizar diferentes columnas "auxiliares", vea los comentarios sobre cómo se encuentran y cambie el código en consecuencia