Macro para insertar fórmula dependiente de una celda

En cada celda de M3:M hay una validación de datos que contiene 5 palabras diferentes, una de esas palabras es "Rever". Lo que necesito es que cada vez que en M diga "Rever", en la columna T de la misma fila se incluya una fórmula espercífica, y que en las filas siguientes, cada vez que se coloque una de las otras cuatro palabras diferentes a "Rever", coloque también en la columna T una fórmula dependiente de la fórmula que se colocó en la fila donde se puso la última palabra "Rever". Ejemplo:

  • En M75 coloco "Rever" / En T75 la macro coloca la fórmula =K75-K$75
  • En M76 colocolo otra palabra diferente a "Rever" / En T76 la macro coloca la fórmula =K76-$K75
  • En M77 coloco otra palabra diferente a "Rever" / En T77 la macro coloca la fórmula =K77-$K75
  • En M78 coloco "Rever" / En T78 la macro loca la fórmula =K78-K$78
  • En M79 colocolo otra palabra diferente a "Rever" / En T79 la macro coloca la fórmula =K79-$K78
Respuesta

1 respuesta más de otro experto

Respuesta
1

Siguiendo con tu ejemplo, en M75 tienes "Rever".

En T75 la macro coloca la fórmula =K75-K$75

Si en las celdas M3 a M74 las palabras son diferentes a "Rever", ¿qué fórmula debe ponerse en las celdas T3 a T75?

Las filas donde en la columna M la palabra sea diferente a "Rever", la fórmula debe ser K-$k fijado a la fila donde en M figura "Rever". Ejemplo:

  • M10 "Rever" / T10 =K10-K$10
  • M11 otra palabra / T11 =K11-$K10
  • M12 otra palabra / T12 =K12-$K10
  • M13 "Rever" / T13 =K13-K$13
  • M14 otra palabra / T14 =K14-$K13
  • M15 otra palabra / T15 =K12-$K13
  • M16 otra palabra / T16 =K16-$K13
  • M17 "Rever" / T17=K17-K$17
  • Y así sucesivamente...

Cabe destacar que actualmente la tabla tiene más de 2000 filas completas. La idea es que cada vez que complete una nueva fila poniendo una palabra en M, sólo en dicha fila la macro ponga la fórmula en T, de acuerdo a los criterios que comentamos.

Esta parte ya la entendí:

En M75 coloco "Rever" / En T75 la macro coloca la fórmula =K75-K$75


Pero qué pasa si desde la celda M3 hasta la M2000, en ninguna celda existe la palabra "Rever", repito nuevamente, en ninguna celda existe la palabra "Rever", ¿entonces en las celdas T3 a T2000 qué fórmula poner?


Puedes responder lo siguiente y en este orden:

1. ¿Si pones la fórmula =K75-K$75, el resultado es 0, tiene caso poner la fórmula? ¿O prefieres que la macro ponga el 0 en T75?

2. ¿Quieres qué la macro ponga las fórmulas o prefieres que la macro realice los cálculos y ponga el resultado en las celdas de la columna T?

3. ¿Cómo quieres ejecutar la macro: presionando un botón o cada vez que cambies un dato en la columna M, en automático que la macro reescriba todas las fórmulas?

Literalmente M3 comienza con "Rever". Aproximadamente cada 20 filas aparece "Rever", algunos casos más, algunos menos. Todas las filas en donde no figura "Rever" tienen alguna fila anterior con "Rever". Ejemplo:

  • M3 "Rever" / M4:M15 Otra palabra
  • M16 "Rever" / M17:M45 Otra palabra
  • M46 "Rever" / M47 Otra palabra...

Respuestas:

1. Prefiero que la macro ponga la fórmula, aunque el resultado sea siempre cero.

2. Quiero que la macro ponga las fórmulas en T, no los resultados.

3. Que la macro se ejecute cada vez que cambio un dato en M. Los datos de M son palabras que se completan con una validación de datos.

Partiendo de este hecho:

Literalmente M3 comienza con "Rever"

Pon la siguiente macro en los eventos de tu hoja:

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim i As Long, j As Long
  '
  If Not Intersect(Target, Range("M:M")) Is Nothing Then
    If Target.CountLarge > 1 Then Exit Sub
    If Range("M3").Value <> "Rever" Then Exit Sub
    Application.EnableEvents = False
    For i = 3 To Range("K" & Rows.Count).End(3).Row
      If Range("M" & i).Value = "Rever" Then j = i
      Range("T" & i).Formula = "=K" & i & "-K$" & j
    Next
    Application.EnableEvents = True
  End If
End Sub

Sigue las Instrucciones para poner la macro en los eventos de 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. En el panel del lado derecho copia la macro

Dante, en primer lugar quiero agradecerte por ayudarme en este caso. Si bien la macro anda, me pasa lo siguiente:

1. Al poner la palabra en M, no se inserta la fórmula en T salvo que en K ya esté puesto algún número. Necesitaría que la fórmula se inserte en T aunque en K no haya ningún valor puesto.

2. Lo probé en un ambiente de prueba con 15 filas y anduvo bien, pero al ponerlo en la hoja a utilizar, que ya lleva más de 2.000 filas cargadas, queda pensando, se tilda. Dentro de mi falta de conocimiento en macros, pienso que tal vez al poner una palabra en M, la macro lee la información de toda la columna para actuar, cuando solamente debe leer desde la fila en donde se inserta la palabra hacia arriba hasta encontrar la primer palabra "Rever", que puede llegar a ser como máximo 20 celdas a leer. Pero insisto, hablo desde mi desconocimiento total...

Prueba esto

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim i As Long, j As Long
  '
  If Not Intersect(Target, Range("M:M")) Is Nothing Then
    If Target.CountLarge > 1 Then Exit Sub
    If Range("M3").Value <> "Rever" Then Exit Sub
    Application.EnableEvents = False
    For i = 3 To Range("M" & Rows.Count).End(3).Row
      If Range("M" & i).Value = "Rever" Then j = i
      Range("T" & i).Formula = "=K" & i & "-K$" & j
    Next
    Application.EnableEvents = True
  End If
End Sub

voy a revisar si solamente puedo cambiar donde modificaste la celda, de ahí hacia arriba y hacia abajo.

Claro, al igual que hacia arriba, hacia abajo también debería ser hasta la primera palabra "Rever" que se encuentre. Porque continuamente también estoy insertando nuevas filas en la tabla, no solo al final de ella...

Ahí lo volví a probar con la segunda opción pero igual se tilda...

Prueba lo siguiente:

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim i As Long, j As Long, f1 As Range, f2 As Range
  Dim lr As Long, ini As Long, fin As Long, sText As String
  '
  If Not Intersect(Target, Range("M:M")) Is Nothing Then
    sText = LCase("Rever")
    If Target.CountLarge > 1 Then Exit Sub
    If LCase(Range("M3").Value) <> sText Then Exit Sub
    '
    Application.EnableEvents = False
    lr = Range("M" & Rows.Count).End(3).Row
    If LCase(Target.Value) = sText Then
      ini = Target.Row
    Else
      Set f1 = Range("M3:M" & Target.Row).Find(sText, , xlValues, xlWhole, , xlPrevious)
      If Not f1 Is Nothing Then
        ini = f1.Row
      End If
    End If
    Set f2 = Range("M" & Target.Row + 1 & ":M" & lr).Find(sText, , xlValues, xlWhole, , xlNext)
    If Not f2 Is Nothing Then
      fin = f2.Row
    Else
      fin = lr
    End If
    '
    For i = ini To fin
      If LCase(Range("M" & i).Value) = sText Then j = i
      Range("T" & i).Formula = "=K" & i & "-K$" & j
    Next
    Application.EnableEvents = True
  End If
End Sub

Dante, la macro ha funcionado de maravillas. Gracias por el tiempo dedicado, por esforzarte en comprender lo que estaba necesitando.

Abrazo (virtual)...

Un placer ayudarte, gra cias por comentar.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas