VBA llenar fórmula en celda si se cumple cierta condición.

Estaría necesitando una macro que me llene una celda con la fórmula Sum, si una celda en la misma fila tiene una X.
Deseo hacer una planilla, supongamos con 6 columnas, y que si en la primer columna tiene una la celda tiene una “x”, que en esa misma fila se llenen las columnas 4, 5 y 6 con la fórmula Suma. Y quisiera que esa fórmula de Suma vaya a los valores hacia arriba de la celda que contiene la suma, hasta la fila anterior que tenga la “x”. Algo así:

A B C D E F

1 5

2 x 5

3

4 2 3 1

5

6

7 x 2 3 1

En este caso al marcar la celda A7 con una "x", quisiera que me llene la celda D7, E7 y F7 con la fórmula suma. Siendo la D7 "=suma(d6:d5)" hasta la fila 5, dado que en la fila 4 hay otra x y otra fila con sumatorias.

Estuve tratando de configurar algo en VBA pero realmente esto me ha superado. La idea es que la macro sea automática.

1 Respuesta

Respuesta
2

¿Quieres qué te ponga la fórmula sum o que la macro te ponga de una vez el resultado de la suma?

Quieres que se haga en automático, pero tiene que ocurrir algo en la hoja para que se active la macro, por ejemplo, cada vez que pongas una x en la columna "A" que se ejecute la macro.

Pero algo no me queda claro, que pasa si borras una "x", en las celdas D, E y F tendrás una fórmula, siguiendo tu ejemplo, si borras la "x" de la celda A2, la fórmula de la fila 7 sumaría desde la fila 1 hasta la fila 6, sumando los valores 5, 5 y 2, el resultado sería 12, cuando el resultado real debería ser 7.

Bueno, espero tus comentarios para saber cómo se resolverían esos casos.

Saludos. Dante Amor

Gracias Aprendemos por tu pronta respuesta.

Según lo que me comentás:

Quisiera que me ponga la fórmula suma, sobre todo porque si se actualiza algún valor, el total estaría actualizado.

Cada vez que se ponga una X, se active la macro sería muy bueno.

Y sobre tu último comentario supondría que lo mejor sería que si saco la X, se borre la fórmula =suma() que había agregado. En tu caso expuesto el resultado debería ser, tal como vos decís, 7. Sumando una sola ves el primer 5.

Muchas Gracias por tu tiempo!

Para que la macro se ejecute en automático la tienes que poner en el evento worksheet, para ello realiza lo siguiente:

Sigue las Instrucciones para poner la macro en worksheet
1. Abre tu libro de excel
2. Para abrir Vba-macros y poder pegar la macro, Presiona Alt + F11
3. Del lado izquierdo dice: VBAProject, abajo dale doble click a worksheet(tu hoja)
4. Del lado derecho copia la macro

Private Sub Worksheet_Change(ByVal Target As Range)
'Por.DAM
If Not Intersect(Target, Range("A:A")) Is Nothing Then
    If Target.Count > 1 Then Exit Sub
    Select Case UCase(Target)
    Case ""
        Range(Cells(Target.Row, "D"), Cells(Target.Row, "F")).ClearContents
    Case "X"
        If Target.Row > 1 Then
            fin = Target.Row - 1
            ini = 1
            For i = Target.Row - 1 To 1 Step -1
                If UCase(Cells(i, "A")) = "X" Then
                    ini = i + 1
                    Exit For
                End If
            Next
            Cells(Target.Row, "D") = "=sum(R" & ini & "C4:R" & fin & "C4)"
            Cells(Target.Row, "E") = "=sum(R" & ini & "C5:R" & fin & "C5)"
            Cells(Target.Row, "F") = "=sum(R" & ini & "C6:R" & fin & "C6)"
        End If
    End Select
End If
End Sub

Gracias, la macro funciona perfecto!

Sólo un pequeño comentario pero sólo si es sencillo el cambio, si es complicado y

haría complicada la macro avisame y cerramos así sin drama.

El pequeño comentario sería si hay una forma sencilla de que si se borra una X en una fila de arriba, que la que está abaja se "actualice" y vuelva a tomar de nuevo el rango, Ahora lo puedo hacer si la saco y la vuelvo a poner. Digamos, tengo una X en fila 2, y una en fila 4. Si saco X de la fila 2, la fila 4 no pasa a sumarme fila 1 y 2.

Espero se entienda, avisame si hay mucho rollo con esto y lo finalizamos, ya que lo soluciono sacando y volviendo a poner la X.

Muchísimas Gracias!!!

Así quedaría la macro

Private Sub Worksheet_Change(ByVal Target As Range)
'Por.DAM
If Not Intersect(Target, Range("A:A")) Is Nothing Then
    If Target.Count > 1 Then Exit Sub
    Select Case UCase(Target)
    Case ""
        Range(Cells(Target.Row, "D"), Cells(Target.Row, "F")).ClearContents
        For i = Target.Row + 1 To Range("A" & Rows.Count).End(xlUp).Row
            If UCase(Cells(i, "A")) = "X" Then
                Cells(i, "A") = "X"
            End If
        Next
    Case "X"
        If Target.Row > 1 Then
            fin = Target.Row - 1
            ini = 1
            For i = Target.Row - 1 To 1 Step -1
                If UCase(Cells(i, "A")) = "X" Then
                    ini = i + 1
                    Exit For
                End If
            Next
            Cells(Target.Row, "D") = "=sum(R" & ini & "C4:R" & fin & "C4)"
            Cells(Target.Row, "E") = "=sum(R" & ini & "C5:R" & fin & "C5)"
            Cells(Target.Row, "F") = "=sum(R" & ini & "C6:R" & fin & "C6)"
        End If
    End Select
End If
End Sub

Saludos.Dante Amor
No olvides finalizar la pregunta

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas