Jump to content

Vba macro para sumar de abajo hacia arriba hasta la primera celda en blanco que encuentre (con condición).


Recommended Posts

Hola, necesito sumar de abajo hacia arriba una columna hasta la primera celda en blanco que encuentre, siempre y cuando sea una compra. El problema, es que tengo una tabla ordenada por Id con un conjunto de operaciones para cada cálculo individual. Lo he intentado solucionar de 2 maneras con fórmulas de Excel.

La 1ª: Haciendo suma y agrupa (está en la Hoja1 del ejemplo). No me sirve porque para que funcione tengo que indicar un rango específico y el rango según el día que lance la macro puede cambiar.

En La 2ª: Haciendo un SUMAR.SI (hoja2 del ejemplo).

No me sirve por dos motivos, el primero es que solo se usarlo para un tipo de Id porque tengo que seleccionar toda la columna (como veis, no he añadido el resto de operaciones). Y, el segundo es porque no sé cómo añadir a esa fórmula que lo haga solo para las compras.

Intento llevarme esto a VBA.

En la hoja1 (columnas F y G) está cómo debería ser el resultado (no me sirve esa fórmula por lo que comenté del rango). Si no se puede hacer, pienso en otra cosa, pero me gustaría saber vuestra opinión. ¡Un millón de gracias!

ejemplo suma hacia arriba.xlsx

Link to comment
Share on other sites

17 hours ago, Maria_80 said:

Hola, necesito sumar de abajo hacia arriba una columna hasta la primera celda en blanco que encuentre, siempre y cuando sea una compra. El problema, es que tengo una tabla ordenada por Id con un conjunto de operaciones para cada cálculo individual. Lo he intentado solucionar de 2 maneras con fórmulas de Excel.

La 1ª: Haciendo suma y agrupa (está en la Hoja1 del ejemplo). No me sirve porque para que funcione tengo que indicar un rango específico y el rango según el día que lance la macro puede cambiar.

En La 2ª: Haciendo un SUMAR.SI (hoja2 del ejemplo).

No me sirve por dos motivos, el primero es que solo se usarlo para un tipo de Id porque tengo que seleccionar toda la columna (como veis, no he añadido el resto de operaciones). Y, el segundo es porque no sé cómo añadir a esa fórmula que lo haga solo para las compras.

Intento llevarme esto a VBA.

En la hoja1 (columnas F y G) está cómo debería ser el resultado (no me sirve esa fórmula por lo que comenté del rango). Si no se puede hacer, pienso en otra cosa, pero me gustaría saber vuestra opinión. ¡Un millón de gracias!

ejemplo suma hacia arriba.xlsx 12.5 kB · 5 downloads

Hola, os dejo aquí una solución para lo que sería la Hoja1 por si le sirve a alguien, pero sí que me gustaría saber cómo resolver la hoja 2 para todos los Id con la fórmula sumar.si y conseguir el mismo resultado (ahora mismo solo hay uno porque necesito seleccionar toda la columna). Gracias.

 

 

Sol_hoja1.xlsm

Link to comment
Share on other sites

@Maria_80,usa el siguiente código:
 

Sub suma_condicional()
Dim uF&
Dim ID As New Collection
Dim item
Dim i&, j&, suma&

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

For i = 2 To uF
    On Error Resume Next
    ID.Add Cells(i, 1), CStr(Cells(i, 1))
Next i

On Error GoTo 0

h = 2
For Each item In ID
    suma = 0
    For j = 2 To uF
        If Cells(j, 1) = item And Cells(j, 2) = "compra" And Cells(j, 3) <> "" Then
            suma = suma + Cells(j, 3)
        End If
    Next j
    Cells(h, 6) = item
    Cells(h, 7) = suma
    h = h + 1
Next item

End Sub

 

Link to comment
Share on other sites

2 hours ago, Haplox said:

@Maria_80,usa el siguiente código:
 

Sub suma_condicional()
Dim uF&
Dim ID As New Collection
Dim item
Dim i&, j&, suma&

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

For i = 2 To uF
    On Error Resume Next
    ID.Add Cells(i, 1), CStr(Cells(i, 1))
Next i

On Error GoTo 0

h = 2
For Each item In ID
    suma = 0
    For j = 2 To uF
        If Cells(j, 1) = item And Cells(j, 2) = "compra" And Cells(j, 3) <> "" Then
            suma = suma + Cells(j, 3)
        End If
    Next j
    Cells(h, 6) = item
    Cells(h, 7) = suma
    h = h + 1
Next item

End Sub

 

Mil gracias @Haplox va de lujo, como siempre. He podido adaptarlo sin problema! ;).

Link to comment
Share on other sites

Pues yo he hecho esto y el resultado no es el mismo que el de la macro de Haplox, pero se ajusta a lo que has solicitado.

He trabajado con el primer archivo que subiste.

Sub SumarHaciaArriba()
Range("H:I").Clear
[H1] = "Tipo"
[I1] = "Resultado"
fila = 1
For x = 2 To Range("A" & Rows.Count).End(xlUp).Row + 1
   If Range("C" & x) = "" Then
      Total = 0
   Else
      If LCase(Range("B" & x)) = "compra" Then
         Total = Total + Range("C" & x)
      End If
      If Not Range("A" & x) = Range("A" & x + 1) Then
         fila = fila + 1
         Range("H" & fila) = Range("A" & x)
         Range("I" & fila) = Total
      End If
   End If
Next
End Sub

 

Link to comment
Share on other sites

On 7/17/2021 at 6:38 PM, Antoni said:

Pues yo he hecho esto y el resultado no es el mismo que el de la macro de Haplox, pero se ajusta a lo que has solicitado.

He trabajado con el primer archivo que subiste.

Sub SumarHaciaArriba()
Range("H:I").Clear
[H1] = "Tipo"
[I1] = "Resultado"
fila = 1
For x = 2 To Range("A" & Rows.Count).End(xlUp).Row + 1
   If Range("C" & x) = "" Then
      Total = 0
   Else
      If LCase(Range("B" & x)) = "compra" Then
         Total = Total + Range("C" & x)
      End If
      If Not Range("A" & x) = Range("A" & x + 1) Then
         fila = fila + 1
         Range("H" & fila) = Range("A" & x)
         Range("I" & fila) = Total
      End If
   End If
Next
End Sub

 

Hola, Antoni! Funciona de lujo para la Hoja1, y como siempre se entiende genial. Muchísimas gracias!!

Link to comment
Share on other sites

  • Crear macros Excel

  • Posts

    • Buenos días a todos; -Necesito de vuestra ayuda. Para mejor comprensión adjunto enlace de un video y comentario. Saludos y gracias de antemano     Adjunto también la macro. MEvento.zip
    • No debe importarnos que el usuario que abrió el tema no vuelva a consultarlo porque nuestras respuestas le llegaron demasiado tarde... Lo importante es poder ayudar a otros usuarios que tengan un problema similar en el futuro...
    • Es una opción original e ingeniosa pero creo que difícil de comprender para un usuario que sepa fórmulas sencillas... Adjunto otra opción con fórmulas desbordadas que puede que sea más fácil de comprender para un usuario que esté aprendiendo a formular, pues hay 3 pasos separados: Columna D : A cada valor se le añade 1> a la izquierda, se sustituye el primer + por 2> y el segundo + por 3>. De paso se quitan los signos , y . para convertir los valores en números. Todo ello con la función SUSTITUIR. ="1>"&SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR($C2;",";"");".";"");"+";"2>";1);"+";"3>";1)   Columna E (desbordada hacia la derecha en las columnas F y G): Extrae los valores y letras de 1>, 2> y 3>. Todo ello con una versión matricial de la función EXTRAE, con la ayuda de la función ENCONTRAR. =SI.ERROR(SUSTITUIR(EXTRAE($D2;ENCONTRAR({"1>"\"2>"\"3>"};$D2);SI.ERROR(ENCONTRAR({"2>"\"3>"\"0>"};$D2);100)-ENCONTRAR({"1>"\"2>"\"3>"};$D2));{"1>"\"2>"\"3>"};"");"")   Sumas de C, T y V: Suma las cantidades consumidas de cada letra con la función SUMAPRODUCTO. Salu2, Pedro Wave Sumar Letras PW1.xlsx
    • Hola,  Estoy intentando vía InputBox rellenar con el dato introducido una columna. Pero no consigo que lo haga desde la primera fila libre de A. Sería pegar el dato a partir de la primera celda libre de la columna A (está en verde), en función del Nº de filas de la columna B No consigo modificarla y se pega desde el comienzo.  Podéis echarle un vistazo? La macro está en el ejemplo. ¡Muchísimas gracias!      ej_InputBox.xlsm
    • La mía. Sub Mostrar() Application.ScreenUpdating = False Range("B:CM").EntireColumn.Hidden = False End Sub '-- Sub Ocultar() Dim Filtro As Range Application.ScreenUpdating = False Mostrar For y = 2 To Columns("CM").Column If WorksheetFunction.CountIf(Cells(8, y).Resize _ (Range("A" & Rows.Count).End(xlUp).Row, 1), "<>" & Empty) = 0 Then Columns(y).Hidden = True End If Next End Sub  
  • Recently Browsing

    No registered users viewing this page.

×
×
  • Create New...

Important Information

Privacy Policy