excel - usar - macro que se ejecuta al cambiar el valor de una celda
El código de VBA no se ejecuta cuando una fórmula cambia (2)
El evento worksheet_change solo se activará en los cambios manuales del usuario. Creo que su mejor opción sería implementar esto como un evento de cambio de hoja de cálculo en su Hoja de trabajo B, donde supongo que los cambios en la entrada del usuario están teniendo lugar.
Hay algunas alternativas que voy a sugerir si esto realmente no te conviene, pero creo que esta es, con mucho, la mejor opción.
Editar: Otra sugerencia por los siguientes comentarios
El objeto ThisWorkbook tiene un evento SheetChange, que se activará cada vez que se cambien las hojas del libro de trabajo. Si puede identificar los rangos donde se ingresarán los datos en cada una de las hojas B, puede usar estos rangos como en su código original.
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Not Sh Is Sheets("Worksheet A") Then
If Intersect(Sh.Range("B1:B5"), Target) Then
''Call MailAlert as required here
ElseIf Intersect(Sh.Range("B10:B20"), Target) Then
''Call MailAlert as required here
Else '' Etc...
''Call MailAlert as required here
End If
End If
End Sub
Déjame saber cómo va eso.
La hoja de trabajo A tiene rangos de datos que se recopilan de la hoja de trabajo B. La hoja de trabajo A tiene una macro que calcula si los datos están por encima de un valor y luego llama a un módulo de correo electrónico para enviar correos electrónicos a los usuarios seleccionados.
Cuando los datos se ingresan manualmente en la Hoja de Trabajo A, la Macro funciona, sin embargo, cuando los datos se extraen de la Hoja de Trabajo B , no se activan.
No estoy seguro de lo que necesito cambiar en mi código de VBA.
Private Sub Worksheet_Change(ByVal Target As Range)
Call MailAlert(Target, "B5:M5", 4)
Call MailAlert(Target, "B8:M8", 7)
Call MailAlert(Target, "B11:M11", 6)
Call MailAlert(Target, "B14:M14", 2)
Call MailAlert(Target, "B17:M17", 4)
Call MailAlert(Target, "B20:M20", 1)
Call MailAlert(Target, "B23:M23", 3)
Call MailAlert(Target, "B26:M26", 1)
Call MailAlert(Target, "B29:M29", 5)
Call MailAlert(Target, "B32:M32", 1)
Call MailAlert(Target, "B35:M35", 7)
Call MailAlert(Target, "B38:M38", 20)
Call MailAlert(Target, "B41:M41", 0)
End Sub
Private Sub MailAlert(ByVal Target As Range, ByVal Address As String, ByVal Value As Integer)
If Target.Cells.Count > 1 Then Exit Sub
If Not Application.Intersect(Range(Address), Target) Is Nothing Then
If IsNumeric(Target.Value) And Target.Value > Value Then
Call Mail_small_Text_Outlook
End If
Application.EnableEvents = True
End If
End Sub
Para capturar los cambios mediante una fórmula, debe usar el evento Worksheet_Calculate()
. Para entender cómo funciona, tomemos un ejemplo.
- Crear un nuevo libro de trabajo.
- En Sheet1 Cell A1, coloca esta fórmula
=Sheet2!A1+1
Ahora en un módulo pegue este código
Public PrevVal As Variant
Pegue esto en el área Código de hoja
Private Sub Worksheet_Calculate()
If Range("A1").Value <> PrevVal Then
MsgBox "Value Changed"
PrevVal = Range("A1").Value
End If
End Sub
Y finalmente, en el área Código de ThisWorkbook
pega este código
Private Sub Workbook_Open()
PrevVal = Sheet1.Range("A1").Value
End Sub
Cierre y guarde el libro de trabajo y vuélvalo a abrir. Ahora Sheet2
cualquier cambio en la celda A1 de Sheet2
. Notará que obtendrá el mensaje MsgBox "Value Changed"
SNAPSHOTS