worksheet_change valor usar una segun que macro insertar fórmula evento ejecutar ejecuta desde código con celda cambiar cambia automaticamente excel vba worksheet

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.

  1. Crear un nuevo libro de trabajo.
  2. 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