Macro que sume datos teniendo en cuenta el primer dígito de una cadena de números

Hola expertos de acuerdo a esta Gráfica, necesito de una macro que sume las columnas C, DE y E y todas las columnas que estén a la derecha a partir de la fila 8 hasta el ultimo dato, la suma debe ser por el primer dígito de las cadenas de números de la columna a, y colocar el resultado de las sumas desde c1 a c4, de d1 a d4, de e1 a e4, y así hasta donde hayan columnas con datos.

Para este ejemplo se colocaron solo esas filas, pero la base real consta de muchísimas más filas, y siempre es variable el numero, al igual que las columnas.

3 Respuestas

Respuesta
1

¿Entonces fila 4 se va a llenar con la suma de 4 números? Quieres que eso se pueda cambiar o que siempre haga esa suma (supongo que son las cuentas de resultados).

Ya tengo tu archivo, preparo la macro y la pongo en el foro.

Si señor, son las cuentas de resultados, que se suman las que empiezan por números 4, por números 5, por números 6 y por números 7, se debe pegar o colocar el resultado de esa suma, si hay una mejor manera muy Chévere.

Gracias

Te anexo la macro. En el arreglo "filas" tienes que poner en qué numero de fila quieres que se sume el dígito, por ejemplo el dígito 1 se suma en la fila 1, el dígito 5 se suma en la fila 4, así por ejemplo, si tuvieras que el dígito 8 quieres que se sume en la fila 2, tendrías que poner el arreglo así:

 'Dígitos 1, 2, 3, 4, 5, 6, 7, 8
 filas = Array("", 1, 2, 3, 4, 4, 4, 4, 2)


Sub Balance()
'Por.Dante Amor
    uc = Cells(7, Columns.Count).End(xlToLeft).Column
    Range(Cells(1, "C"), Cells(4, uc)).ClearContents
    'Dígitos          1, 2, 3, 4, 5, 6, 7
    filas = Array("", 1, 2, 3, 4, 4, 4, 4)
    For i = 8 To Range("A" & Rows.Count).End(xlUp).Row
        For j = 3 To uc
            f = filas(Val(Left(Cells(i, "A"), 1)))
            Cells(f, j) = Cells(f, j) + Cells(i, j)
        Next
    Next
End Sub

Respuesta
1

Esta macro hace lo que tu quieres, independientemente del número de filas o columnas.

Sub SumarCantidades()
uf = Range("A" & Rows.Count).End(xlUp).Row
uc = Range("A8").End(xlToRight).Column
For t = 8 To uf
    For j = 3 To uc
        Select Case Val(Left(Cells(t, "A"), 1))
            Case 1: Cells(1, j) = Cells(1, j) + Cells(t, j)
            Case 2: Cells(2, j) = Cells(2, j) + Cells(t, j)
            Case 3: Cells(3, j) = Cells(3, j) + Cells(t, j)
            Case Else: Cells(4, j) = Cells(4, j) + Cells(t, j)
        End Select
    Next j
Next t
End Sub

Si te ha valido la respuesta.

Realmente se deberían borrar primero las celdas de las sumas por si hubiera datos en ellas. Modificando la macro, es lo primero que hace.

Sub SumarCantidades()
'Ultima fila de datos'
uf = Range("A" & Rows.Count).End(xlUp).Row
'Ultima columna de datos'
uc = Range("A8").End(xlToRight).Column
'Con esta instrucción sabemos la letra de la columna'
columna = Mid(ActiveSheet.Cells(1, uc).Address, 2, InStr(2, ActiveSheet.Cells(1, uc).Address, "$") - 2)
'Hacemos la selección y borramos las celdas de las sumas'
Range("C1:" & columna & "4").Select
For t = 8 To uf ' Bucle para recorrer las filas de datos'
    For j = 3 To uc ' Bucle para recorrer las columnas de datos'
        Select Case Val(Left(Cells(t, "A"), 1))
            Case 1: Cells(1, j) = Cells(1, j) + Cells(t, j)
            Case 2: Cells(2, j) = Cells(2, j) + Cells(t, j)
            Case 3: Cells(3, j) = Cells(3, j) + Cells(t, j)
            Case Else: Cells(4, j) = Cells(4, j) + Cells(t, j)
        End Select
    Next j
Next t

La línea

Range("C1:" & columna & "4").Select

debe ser:

Range("C1:" & columna & "4"). Clear

Si te ha valido la respuesta.

Respuesta
1

Realmente no necesitas una macro para esto, lo puedes resolver con una fórmula que te va a quedar permanentemente ahí.

Te pongo ejemplos para tu celda C1.

Si los códigos "Account" están en formato texto con un SUMAR.SI como este bastaría: =SUMAR.SI($A$8:$A$65000;"1*";C$8:C$65000) pongo como última fila a sumar la 65000 pero puedes poner la que quieras. El criterio para sumar es todo lo que empieze con 1 ("1*") en este caso, en otras fórmulas pondrás "2*", "3*" etc .

Si los códigos "Account" están en formato numérico de 10 cifras puedes utilizar esta matricial: =SUMA(SI(REDONDEAR($A$8:$A$65000/1000000000;0)=1;C$8:C$65000;0)) y en vez de dar a intro le das a control+mayusc+intro y ya te queda como matricial. El =1 lo sustituyes en las otras fórmulas por =2, =3 etc.

Lógicamente basta arrastrar las celdas con las fórmulas desde la columna C hacia la derecha para copiarlas a todas las columnas que tengan datos.

Muchas gracias por tu interés al contestar, tu sugerencia es muy buena, pero resulta que dividir todo entre 1000000000 no arroja los datos bn, ya que la base tiene números de 10 dígitos que empiezn por 2,3,4,5 y 6 y están todos mezclados, entonces por eso pienso que se debe programar con macro. ¿Crees qué pueda estar equivocado?

La fórmula debe funcionar bien, con independencia de que los códigos estén o no mezclados, yo la he probado a pequeña escala con unos cuantos datos y me hace las sumas bien. Otra cosa es que tengas un número excesivo de datos y por limitaciones de memoria o procesamiento te pueda dar algún problema.

Para sumar los códigos restantes, los que no empiezan por 1, 2 o 3, puedes hacer un sumatorio de todo y restarles las sumas de los que empiezan por 1, 2 y 3.

Lo que te hace la fórmula es dividir cada código por 1000000000 y quitarle los decimales (redondear) y comprueba si el resultado es 1 sólo en ese caso incluye la cifra en el sumatorio al ser una fórmula matricial. La fórmula matricial depués de dar a control-mayusc-intro ha de verse con unos corchetes, asi: {=SUMA(SI(REDONDEAR($A$8:$A$65000/1000000000;0)=1;C$8:C$65000;0))}

Si no la ves así es que no está en formato matricial y el resultado te va a dar un error.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas