Está en la página 1de 5

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address(False, False) = "E5" Then

If Target.Value <> 0 Then Call Macro1

End If

End Sub

__________________________________________________

Dim ValorPrecedente As Variant

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

ValorPrecedente = Target.Value

End Sub

Private Sub Worksheet_Change(ByVal Target As Range)

Dim ValorActual As Variant

Dim Texto As String

Texto = "CDMA"

ValorActual = Target.Value

If Target.Address(False, False) = "A1" And (ValorActual <> Texto


Or ValorPrecedente <> Texto) Then

MsgBox "Llamar macro"

End If

End Sub
____________________

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("A1:C10")

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."

End If
End Sub

Tenemos que pensar que lo primero que debe ocurrir es que debe cambiar algo, por tanto, debe
producirse el evento Change (si es que lo aplicamos a la Hoja1 en concreto). Por tanto, deberemos
poner algo dentro de la Hoja1, es decir, algo como esto:

Lo que irá dentro de ese evento Change, es un condicional, que evaluará si cambia o no la celda
B5, para que en ese caso, se dispare el mensaje. La propia Microsoft nos propone hacer algo como
esto (los comentarios del código son míos, no de Microsoft):

Private Sub Worksheet_Change(ByVal Target As Range)


'pasamos a una variable, la celda o celdas
'que queremos evaluar si cambian o no
datos = "B5"
'como estamos dentro del evento "Change", algo tiene
'que estar cambiando... Pues bien, si la celda activa
'es la misma que la celda que hemos puesto en
'la variable llamada "datos", entonces
'que muestre un mensaje (recordemos que una doble
'negación es una afirmación)
If Not Application.Intersect(ActiveCell, Range(datos)) Is Nothing Then
'mostramos un mensaje
MsgBox ("Oyeeeee, sé que estás cambiando la celda " & datos & ".")
End If
End Sub

Y efectivamente, ese código funciona correctamente si cambiamos la celda B5 y pulsamos intro.


Pero ¿qué ocurre si en lugar de pulsar intro, una vez editada la celda B5, pulsamos cualquier tecla
de desplazamiento?. Pues que no funciona la solución propuesta por Microsoft. ¿Y qué pasa si
editamos el contenido de la celda B4 (la que está encima de B5), y en lugar de pulsar intro, una vez
cambiado el valor de esa celda, pulsamos la telcla de desplazamiento hacia abajo?. Pues que se
ejecuta el macro, con lo cual, estamos en las mismas, ...no funciona correctamente el macro.

Es decir, la solución propuesta por Microsoft funciona, siempre y cuando utilicemos la tecla intro
(la tecla enter), para editar (para cambiar) el contenido de las celdas, pero los usuarios
medianamente avezados, suelen utilizar las teclas de desplazamiento, en lugar de la tecla intro,
para finalizar la edición de las celdas, ...y en ese caso, la solución de Microsoft puede no funcionar
(no siempre falla, evidentemente, pues para que falle, la celda activa debe ser la celda B5, o
cualquier de sus celdas contiguas vertical u horizontalmente).

Para solucionar ese contratiempo, podemos cambiar la solución propuesta por Microsoft, y utilizar
esta otra que es parecidísima:

Private Sub Worksheet_Change(ByVal Target As Range)


'pasamos a una variable, la celda o celdas
'que queremos evaluar si cambian o no
datos = "B5"
'como estamos dentro del evento "Change", algo tiene
'que estar cambiando... Pues bien, si la celda activa
'es la misma que la celda que hemos puesto en
'la variable llamada "datos", entonces
'que muestre un mensaje (recordemos que una doble
'negación es una afirmación)
If Not Application.Intersect(Target, Range(datos)) Is Nothing Then
'mostramos un mensaje
MsgBox ("Oyeeeee, sé que estás cambiando la celda " & datos & ".")
End If
End Sub

Si observamos bien, la diferencia está en que Microsoft nos propone incluir Activecell, y en esta
nueva versión lo cambiamos, y ponemos Target.

Si quisiéramos mostrar el mensaje al cambiar varias celdas contiguas, por ejemplo cuando
cambiamos B5, B6, o B7, entonces haríamos esto:

Private Sub Worksheet_Change(ByVal Target As Range)


'pasamos a una variable, la celda o celdas
'que queremos evaluar si cambian o no
datos = "B5:B7"
'como estamos dentro del evento "Change", algo tiene
'que estar cambiando... Pues bien, si la celda activa
'es la misma que la celda que hemos puesto en
'la variable llamada "datos", entonces
'que muestre un mensaje (recordemos que una doble
'negación es una afirmación)
If Not Application.Intersect(Target, Range(datos)) Is Nothing Then
'mostramos un mensaje
MsgBox ("Oyeeeee, sé que estás cambiando alguna celda del rango " & datos & ".")
End If
End Sub

Si por el contrario, lo que queremos es mostrar el mensaje al evaluar un rango discontinuo de


celdas, por ejemplo las celdas B5, B7, y B12, entonces haríamos esto:

Private Sub Worksheet_Change(ByVal Target As Range)


'pasamos a una variable, la celda o celdas
'que queremos evaluar si cambian o no
datos1 = "B5"
datos2 = "B7"
datos3 = "B12"
'como estamos dentro del evento "Change", algo tiene
'que estar cambiando... Pues bien, si la celda activa
'es la misma que la celda que hemos puesto en
'la variable llamada "datos", entonces
'que muestre un mensaje (recordemos que una doble
'negación es una afirmación)
If Not Application.Intersect(Target, Range(datos1)) Is Nothing Or _
Not Application.Intersect(Target, Range(datos2)) Is Nothing Or _
Not Application.Intersect(Target, Range(datos3)) Is Nothing Then
'mostramos un mensaje
MsgBox ("Oyeeeee, sé que estás cambiando alguna de estas celdas " & _
datos1 & ", " & datos2 & ", " & datos3 & ".")
End If
End Sub

También podría gustarte