EXCEL envío correo con condición en celda

Veo que has podido dar solución a una cuestión de un envío de correo electrónico si en una celda se da cierto valor.

¿Me podrías ayudar con una que veo realmente complicada? Buscando por internet veo que salen muchas opciones pero no acabo de aplicarlo a mi caso. Se que es algo de visual basic y modificar macros o el código d la hoja.

¿Cómo te puedo enviar el archivo?

1 Respuesta

Respuesta
3

Hola Dante, gracias pero esta página ya la he leído. Se trata de crear un macro y cuando se activa, manda los mensajes. En mi caso, se trata de que cada vez que un valor de una celda es X, se mande automáticamente el mail. 

No he encontrado ningún caso como el que te explico.

Si me pudieras dar una dirección, te mandaría el archivo. Te agradecería mucho la ayuda.

Gracias, 

Entonces pon lo siguiente en los de tu hoja.

Suponiendo que el dato a revisar es de la columna D. También suponiendo que el dato es "Enviar".

Entonces quedaría así, cada vez que pones el dato "Enviar" en la columna "D", se envía un correo.

Tampoco pusiste cuál es el correo, el asunto, el cuerpo. En fin, te pongo un ejemplo y lo adaptas.

Private Sub Worksheet_Change(ByVal Target As Range)
'Por Dante Amor
    'Enviar un correo cada que se pone la palabra "Enviar" en la columna "D"
    '
    If Not Intersect(Target, Columns("D")) Is Nothing Then
        If Target.Count > 1 Then Exit Sub
        If Target.Value = "" Then Exit Sub
        '
        fila = Target.Row
        If Target.Value = "Enviar" Then
            Set dam = CreateObject("outlook.application").createitem(0)
            dam.To = Cells(fila, "A").Value        'Destinatarios
            dam.Subject = "asunto del correo"
            dam.Body = Cells(fila, "C").Value      'Cuerpo
            'dam.Send 'El correo se envía en automático
            dam.Display 'El correo se muestra
        End If
    End If
End Sub

Sigue las Instrucciones para poner la macro en los eventos de worksheet

  1. Abre tu libro de excel
  2. Para abrir Vba-macros y poder pegar la macro, Presiona Alt + F11
  3. Del lado izquierdo dice: VBAProject, abajo dale doble click a worksheet(tu hoja)
  4. En el panel del lado derecho copia la macro

'.[Sal u dos. Dante Amor. No olvides valorar la respuesta. 
'.[Avísame cualquier duda

Gracias por tu ayuda Dante. He cambiado las columnas pero no lo envía.

Seguiré intentando ya que lo que pido es, no solo que mande el correo simplemente, sino que lo mande con ciertos datos de la misma hoja, y un texto de la misma hoja.

Si quisieras, creo que la única solución sería que te pudiera mandar el archivo con el detalle y explicación exactas.

Saludos,

Realiza una prueba con la macro que te envié. Captura la palabra "Enviar" en alguna celda de la columna "D", la macro se debe activar en automático.

O pon una imagen de cómo tienes tus datos, explica con detalle dónde se localiza cada dato para adaptar la macro.

Hola, adjunto imagen porque creo que lo que pido es algo más complejo, o no. El tema es que no he encontrado solución por ahora.

Saludos, 

Pero tienes que hacer la prueba.

En un archivo nuevo pon la macro que te envié. Captura la palabra "Enviar" en alguna celda de la columna "D", la macro se debe activar en automático y abrir un correo en outlook.

Después de que realices esa prueba y veas que la macro está funcionando, entonces la adaptamos a tu condición.

Hola, te paso imagen con el código pegado. La verdad es que cuando en la columna L consigo el "enviar", no hace nada.

Pero no modifiques mi macro.

Te dije columna "D"

Prueba con la macro que yo te envié.

Y debes capturar la palabra "Enviar" en alguna celda de la columna "D"

"Enviar", la primera letra es mayúscula y las demás minúsculas.

Cuando dices "debes capturar la palabra Enviar", a que te refieres exactamente? Ese "Enviar" viene de una orden si se cumple la condición que explico en la fila 7.

Lo hago sin modificar tu macro y sigue sin hacer nada.

Prueba primero la macro.

En un libro nuevo.

Olvida por un momento tu archivo, primero prueba mi macro, para que veas el funcionamiento y después lo adaptamos a tu hoja.

Efectivamente cuando escribo la palabra Enviar, se me abre Outlook, o sea en la fila 9 (sin condición alguna en esa celda D9).

Pero en la celda D3, siendo una función "CONSULTAV.....", cuando automáticamente pone Enviar (al cumplir condición), no se abre Outlook.

Esto fue lo único que pusiste en tu petición original:

Veo que has podido dar solución a una cuestión de un envío de correo electrónico si en una celda se da cierto valor.

Con en ese texto es imposible identificar todo lo que requieres.

Ahora sí, explica con detalle qué tienes, qué fórmulas tienes, cuáles son las condiciones, cuáles celdas modificas que actualizan las fórmulas.

Para que una macro se ejecute en automático debe ocurrir un evento en tu hoja, si no ocurre un evento, entonces te sugiero que armes tu hoja y hasta que la tengas lista, presiones un botón para enviar el correo.

Como puedes ver, para armar el correo se requiere: destinatario, asunto, cuerpo, tampoco indicas si se va a enviar un archivo.

En fin, entre más detalle pongas, más fácil podrá ser adaptar la macro. O bien, ahí están las macros, adapta el código a lo que necesitas.

Te lo detallo bastante en la imagen. Al crear la columna D, de "Envio" (una vez se cumplen ciertas condiciones) no es más que enviar este correo con cierto Subject y cierto Contenido de diferentes celdas de esta misma hoja. 

Importante enviar solamente cuando se produzca el paso de "No enviar" a "Enviar". Una vez se queda 2-3 días en "Enviar" (antes de pasar de nuevo a "No enviar"), no lo manda 2-3 veces. Solamente si vuelve a cambiar de "No enviar" a "Enviar".

Destinatario siempre el mismo y ningún archivo.

Saludos, 

Hola Dante, te mandé lo que me pedías. Has podido solucionar la macro?

Saludos, 

Puedes poner la fórmula que tienes en la celda "Enviar", necesito ver cuáles son las condiciones que hacen cambiar del dato de "No enviar" a "Enviar". Solamente revisando la fórmula se puede enviar en automático. Si la fórmula viene de otros resultados de otras fórmulas, entonces tienes que explicarme cuál es el origen de cada fórmula que llevará a que la celda de la columna D cambie a "Enviar"

Hola, la fórmula es la siguiente:

=SI($H$22<0,5%;"Enviar";"NO ENVIAR")

Es decir, depende de si el valor en H es menor a un 0,50%, que se indicaría "Enviar" y se mandaría el correo.

Quedo a la espera.

Saludos, 

¿Y en H22 tienes otra fórmula?

¿Cuál es?

Sí perdona, en H22 es una sencilla para calcular porcentaje:

=G22/$F$16

Saludos, 

¿Y en G22 y en F16 tienes fórmulas?

Si la fórmula viene de otros resultados de otras fórmulas, entonces tienes que explicarme cuál es el origen de cada fórmula que llevará a que la celda de la columna D cambie a "Enviar"

Vaya veo que es algo más complejo y mucho más con la tabla REAL donde lo quiero aplicar.

Inicialmente los datos llegan a una hoja a través de una conexión a una página de bolsa (Investing.com), que se actualiza cada 10 minutos.

A partir de aquí se van rellenando varias hojas con fórmulas, y una de ellas es la que resume “todo” para finalmente indicar si “Enviar” o no.

 Por explicarte un poco hacia atrás:

1) Se determina si "Enviar" o "EN ESPERA" mediante:

=SI(N15<0,5%;"ENVIAR";"EN ESPERA")

2) En N15 sale el porcentaje mediante:

N15=M15/$F$7

3) Se determina M15 y F7 mediante:

M15=I15-$F$7

Donde I15 viene de:

=SI(Y($F$7>E14;$F$7<F14);F14;H14)

E14=BUSCARV(D14;CORTOS!$Y$7:$AQ$260;5;FALSO)

F14=BUSCARV(D14;CORTOS!$Y$7:$AQ$260;10;FALSO)

H14=BUSCARV(D14;CORTOS!$Y$7:$AQ$260;14;FALSO)

F7=BUSCARV($E$7;ORIGINAL!$B$6:$F$259;2;FALSO)

E7=SI((O(D7=1;D7=2;D7=3;D7=4;D7=5));C7;(SI(D7=6;C7-1;C7-2)))

D7=DIASEM(C7;2)

C7=HOY()

No habría manera de simplificar el hecho de que mande el correo?

Como te había comentado, para que una macro se active debe ocurrir un evento en la hoja, un evento puede ser que una celda se modifique.

Pero el resultado de una fórmula no influye como evento, ya que realmente el contenido de la celda sigue siendo el mismo:

SI($H$22<0,5%;"Enviar";"NO ENVIAR")

Lo que cambia es el resultado de la fórmula.


Realmente no sería simplificar, pero podríamos hacer lo siguiente:

Regreso a la opción de apretar un botón o a ejecutar la macro cada que se actualiza la hoja (todavía no sé cómo sería este paso, pero es una opción).

Intentemos con el botón, después vemos lo de cada 10 minutos.

Entonces sería algo así.

Presionas el botón, la macro revisa las filas de la 21 en adelante.

Si una fila dice "Enviar" entonces envía el correo, en tu ejemplo la fila 22 dice "Enviar", entonces envía el correo de la fila 22 y en la hoja "Enviados" registra "fila 22-Enviada".

Siguiente vez que presionas el botón, la macro revisa las filas de la 21 en adelante, encuentra que la fila 22 dice "Enviar", entonces antes de hacer el envío revisa en "la hoja "Enviados", si la fila 22 existe en la hoja, ya no lo envía.

También la macro deberá tener un código para actualizar la hoja "Enviados" para los que cambiaron de "Enviar" a "No enviar", pero también lo revisamos más adelante.


Revisa la propuesta y me comentas.

Entiendo lo que me dices de que la macro lee el contenido y no realmente el valor que se indica, en este caso siempre viene de una fórmula. Por tanto no hay evento que suceda, simplemente si se cumple la condición, yo veo "Enviar" aunque en la celda la formula es la misma.

Por tanto parece como no posible realizar este envío automático, no? Porque no hay evento que cambie.

La solución que propones de crear nuevas celdas de "fila 22 ya enviada" lo veo bien para evitar que el correo se mande cada día... 

La idea es tener este archivo abierto todo el día, todos los días.... y como se "alimenta" de una página de cotizaciones bursátiles cada 10 minutos y todo el contenido son fórmulas... no sería una buena opción tener que activar o apretar este botón que dices.

El interés es recibir este mail (u otro tipo de aviso) de manera totalmente automática.

Podemos probar con el evento Calculate. (No me gusta este evento, porque cada vez que se calcula un nuevo valor en una fórmula, el evento se activa, eso incluye cualquier fórmula de la hoja)

Pero probemos.

¿Cómo tienes la configuración o ejecutas una macro para que se actualice la hoja cada 10 minutos?

No hago nada, automáticamente se conecta a la página web, se queda unos 10 segundos en espera y coloca todos los datos actualizados. 

No acabo de entender Calculate. 

Crea una nueva hoja y le pones por nombre "Enviados"

Ahora sí, pon el siguiente código en los eventos de tu hoja. En teoría cada que se actualicen las fórmulas por la conexión a la página web, se deberá de ejecutar la macro. Enviará los correos "nuevos", es decir, aquellos registros que tengan la palabra "Enviar" y que en la hoja "Enviados" no existan.

Cambia en la macro "Hoja1" por el nombre de tu hoja con datos.


Private Sub Worksheet_Calculate()
'Por Dante Amor
    Set h1 = Sheets("Hoja1")        'hoja con datos
    Set h2 = Sheets("Enviados")     'hoja de control de filas enviadas
    '
    For i = 21 To h1.Range("D" & Rows.Count).End(xlUp).Row
        If LCase(h1.Cells(i, "D").Value) = LCase("Enviar") Then
            Set b = h2.Columns("A").Find(i, lookat:=xlWhole)
            If b Is Nothing Then
                'la fila no se ha enviado, se envía el correo
                fila = i
                Set dam = CreateObject("outlook.application").createitem(0)
                dam.To = "damor"        'Destinatarios
                dam.Subject = "cierto Subject "
                dam.Body = "cierto Contenido"      'Cuerpo
                'dam. Send 'El correo se envía en automático
                Dam. Display 'El correo se muestra
                '
                'Se agrega la fila para que el correo no sea enviado
                '
                u2 = h2.Range("A" & Rows.Count).End(xlUp).Row + 1
                h2.Range("A" & u2).Value = fila
                h2.Range("B" & u2).Value = "Enviado"
            End If
        End If
    Next
End Sub

Sigue las Instrucciones para poner la macro en los eventos de worksheet

  1. Abre tu libro de excel
  2. Para abrir Vba-macros y poder pegar la macro, Presiona Alt + F11
  3. Del lado izquierdo dice: VBAProject, abajo dale doble click a worksheet(tu hoja)
  4. En el panel del lado derecho copia la macro

Actualiza la información de la hoja ejecutando la conexión. La macro enviará los correos.

Prueba y me comentas.


Hola, 

1) Creo la nueva hoja con el nombre "Enviados". No escribo nada en esta hoja.

2) Con Alt+11 he insertado en la misma hoja lo siguiente:

Private Sub Worksheet_Calculate()
'Por Dante Amor
Set h1 = Sheets("AVISO ORDENES") 'hoja con datos
Set h2 = Sheets("Enviados") 'hoja de control de filas enviadas
'
For i = 21 To h1.Range("D" & Rows.Count).End(xlUp).Row
If LCase(h1.Cells(i, "D").Value) = LCase("Enviar") Then
Set b = h2.Columns("A").Find(i, lookat:=xlWhole)
If b Is Nothing Then
'la fila no se ha enviado, se envía el correo
fila = i
Set Dam = CreateObject("outlook.application").createitem(0)
Dam.To = "damor" 'Destinatarios
Dam.Subject = "cierto Subject "
Dam.Body = "cierto Contenido" 'Cuerpo
'dam. Send 'El correo se envía en automático
Dam.Display 'El correo se muestra
'
'Se agrega la fila para que el correo no sea enviado
'
u2 = h2.Range("A" & Rows.Count).End(xlUp).Row + 1
h2.Range("A" & u2).Value = fila
h2.Range("B" & u2).Value = "Enviado"
End If
End If
Next
End Sub

3) He cerrado el archivo incluso para que se abra de nuevo.

4) Cuando en la hoja AVISO ORDENES se produce cambio en la columna D, no se abre nada.

Algo debo hacer mal, no?

Supongo que no he hecho lo que me comentabas en el mensaje de 5 de septiembre, y falta rellenar las celdas en la nueva hoja "Enviados", verdad?

La macro la tienes que poner en los eventos de tu "Hoja1"

En la hoja "Enviados" no pongas nada, esa hoja se llena en automático.

Empezando de nuevo:

1)creo que la hoja "Enviados".

2) En la mía donde se ponen los "Enviados" inserto la macro con Alt+11 y en esa hoja. Y cambio el nombre por el de la misma hoja donde lo he insertado en el espacio que dices. No hago ningún cambio más.

3) Cuando se da el evento y la celda en D se marca como Enviado, no ocurre nada.

Algo debo hacer mal.

Envíame tu archivo con todo y macros para revisarlo.

Mi correo [email protected]

En el asunto del correo escribe tu nombre de usuario “Alberto Ripol

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas