Ejecutar macro cuando varia una celda en excel

Saludos.
Mi principal problema es el siguiente:
Tengo una hoja en excel que se actualiza mediante los datos de una página web, o sea cada 5 minutos se conecta a la página web, e importa los datos a varias celdas. Lo que necesito hacer es que cuando una de estas celdas sea igual a 0, me envíe un correo de notificación indicando que hay un problema. Por ejemplo el valor importado esta en A1. Yo mediante una fórmula le digo que la celda B1=A1, y que cuando B1=0 ejecute la macro y se envíe un correo de notificación.
Lo he logrado hacer pero tengo que meter los datos manualmente en la celda B1 y darle "enter", pero cuando toma el valor de la página automáticamente, la macro nunca se ejecuta.
Gracias por su ayuda.

1 Respuesta

Respuesta
1
¿Cómo tu Hoja se conecta automáticamente a la página Web?
¿Mediante una macro?
Si fuera así, podrías agregar una linea al final de esa macro, para que te verifique el valor de A1 o B1.
Algo así:
If Range("A1")=0 then Ejecuta macro
Si no fuera este caso, ¿me podrías explicar como obtienes los datos de internet automáticamente?
En realidad no es una macro, la información la obtengo mediante una consulta web, en donde pongo la dirección de la página de la que quiero obtener los datos, y luego en propiedades le digo que actualize cada 5 minutos. A raíz de estos resultados es que debo ejecutar la macro.
Saludos.
* Abre el Editor de Visual Basic Alt-F11
     * En la ventana Proyecto que aparece, habitualmente en la parte centro-superior-izquierda de tu pantalla, ubica ThisWorkBook dentro de Microsoft Excel Objects y haz doble click.
     *En el módulo en blanco que aparece, copia el siguiente código .
Dim sStart As Single
Dim bState As Boolean
Private Sub UserForm_Activate()
    On Error Resume Next
    sStart = True
    Reloj
End Sub
Sub Reloj()
    On Error Resume Next
    Dim sStart As Single
    bState = True
    Do While bState
        sStart = Timer
        Do While (bState And Timer < sStart + 300)
            DoEvents
        Loop
            If Sheets("Hoja1").Range("A1") = 0 Then
                MsgBox "Celda A1 vacia"
            End If
    Loop
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    On Error Resume Next
    bState = False
End Sub
     * Cierra el Editor de Visual basic
Graba tu libro, ciérralo y vuelve a abrirlo
La linea Do While (bState And Timer < sStart + 300) cuenta la cantidad de segundos transcurridos.  300 segundos = 5 minutos.
La linea If Sheets("Hoja1"). Range("A1") = 0 Then verifica si A1 de la Hoja1 es igual a 0. Si tu Hoja1 tiene otro nombre, cámbialo aquí.
La linea MsgBox "Celda A1 vacia", te avisa la ocurrencia. Ingresa aqui la rutina que debe ejecutarse.
Muchas gracias.
La verdad funciona perfecto, pero tengo una ultima consulta, ya que estoy tratando de arreglarlo pero no he podido.
EL problema que se me presenta es el siguiente, cuando el valor cambia a cero, me envía el correo, pero cada 5 minutos que revisa el valor de la celda A1, me vuelve a enviar el correo. Habrá alguna manera de colocarlo una especie de bandera, ¿tal qué me envíe el correo solo cuando exista una variación?.
Por ejemplo. Normalmente el valor de la celda es 5, y nunca me envía el correo, pero apenas el valor sea cero, me envíe un correo, y si el valor en cero se queda varios días, no me siga enviadno correos cada 5 minutos, si la celda cambia de valor de nuevo de cero a 5, me puede enviar de nuevo el correo.
No se si me explique bien !
Gracias por tu apoyo.
Dim sStart As Single
Dim bState As Boolean
Private Sub UserForm_Activate()
    On Error Resume Next
    sStart = True
    Reloj
End Sub
Sub Reloj()
    On Error Resume Next
    Dim sStart As Single
    bState = True
    Do While bState
        sStart = Timer
        Do While (bState And Timer < sStart + 300)
            DoEvents
        Loop
            If Range("A1") = 0 Then
                If CeroEnviado = 0 Then
                    Range("B1") = "Celda A1 vacia"
                    CeroEnviado = 1
                End If
            Else
                CeroEnviado = 0
            End If
    Loop
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    On Error Resume Next
    bState = False
End Sub
Por favor, cierra esta pregunta. Si tienes alguna otra solicitud, abre una nueva.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas