Ejecutar macro si alguna celda en el rango cambia

Tengo un rango con fórmulas y quisiera que se ejecute una macro al cambiar algún valor del mismo.

Fórmula matricial del rango
{SI.ERROR(INDICE($B$1:$B$104;K.ESIMO.MENOR(SI(C$2=$A$1:$A$104;FILA($B$1:$B$104)-MIN(FILA($A$1:$A$104))+1;"");FILA()-1));)}
'Está macro funciona si los cambios en las celdas no son fórmulas
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim KeyCells As Range
' The variable KeyCells contains the cells that will
    ' cause an alert when they are changed.
    Set KeyCells = Range("C2:N10")
If Not Application.Intersect(KeyCells, Range(Target.Address)) _
           Is Nothing Then
' Display a message when one of the designated cells has been 
        ' changed.
        ' Place your code here.
        MsgBox "Cell " & Target.Address & " has changed."
Call Actualizar_columna
End If
End Sub

2 Respuestas

Respuesta

[Hola

El ejemplo que has conseguido y copiado/pegado aquí no te será útil ya que el evento Change no detecta cambio ocurrido en resultados de fórmulas. Para detectarlos debes usar el evento Calculate. Un ejemplo suponiendo que dichas fórmulas están en C2:C20:

Private Sub Worksheet_Calculate()
Dim miRango As Range
Set miRango = Range("C2:C20")
If Not Intersect(miRango, Range("C2:C20")) Is Nothing Then
    MsgBox "Una fórmula cambió"
End If
End Sub

Trata de entenderla y adaptarla a tu situación.

Respuesta
1

[Hola Abraham Valencia, la situación en tu ejemplo, es que cualquier fórmula actualizada en la hoja, sin importar el rango, siempre va a entrar al If, ya que miRango siempre está dentro del Range("C2:C20")

Set miRango = Range("C2:C20")
If Not Intersect(miRango, Range("C2:C20")) Is Nothing Then

Sin embargo, si solamente existen esas fórmulas en la hoja, entonces no importa tener un Range, simplemente si se activa el evento Calculate, entonces ejecutar la macro del usuario. Por ejemplo:

Private Sub Worksheet_Calculate()
  Call LaMacro
End Sub

Lo más preciso sería utilizar las celdas que no tienen fórmulas y que modifican a la fórmula del usuario:

{SI.ERROR(INDICE($B$1:$B$104;K.ESIMO.MENOR(SI(C$2=$A$1:$A$104;FILA($B$1:$B$104)-MIN(FILA($A$1:$A$104))+1;"");FILA()-1));)}

En la fórmula del usuario, los rangos que intervienen son B1:B104,C2 y A1:A104, entonces podría ser:

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim rng As Range
  Set rng = Range("B1:B104, C2, A1:A104")
  If Not Intersect(Target, rng) Is Nothing Then
    Call LaMacro
  End If
End Sub

Lo anterior funciona, siempre y cuando las celdas "B1:B104, C2, A1:A104" no tengan fórmulas y sean valores que se actualizan manualmente.

¡Gracias! 

Suscripto, un gusto conocerte!

Igualmente un gusto !

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas