Ejecutar macro una sola vez

Tengo el siguiente macro para que cuando el resultado de una fórmula me de "-1" ejecute otro macro que me envía un mail automáticamente y a la vez, me indica en la columna siguiente a la fórmula que me ha enviado el mail. El problema es que cada vez que abro la hoja de excel me envía un mail aunque ya me lo hubiera enviado.

¿Cómo puedo hacer para que si ya me envió el mail una vez no me lo vuelva a enviar?

Si alguien pudiera ayudarme se lo agradecería mucho. Os dejo también el macro que me envía el mail por si el error estuviera ahí.

Private Sub Worksheet_Calculate()
Dim FormulaRange As Range
Dim NotSentMsg As String
Dim MyMsg As String
Dim SentMsg As String
Dim MyLimit As Double
NotSentMsg = "Not Sent"
SentMsg = "Sent"
MyLimit = -1
Set FormulaRange = Me.Range("m5:m4000")
On Error GoTo EndMacro:
For Each FormulaCell In FormulaRange.Cells
With FormulaCell
If FormulaCell.Value = MyLimit Then
MyMsg = SentMsg
Call Mail_with_outlook1
End If
Application.EnableEvents = False
FormulaCell.Offset(0, 1).Value = MyMsg

Application.EnableEvents = True
End With
Next FormulaCell
ExitMacro:
Exit Sub
EndMacro:
Application.EnableEvents = True
MsgBox "Some Error occurred." _
& vbLf & Err.Number _
& vbLf & Err.Description
End Sub

Sub Mail_with_outlook1()
Dim OutApp As Object
Dim OutMail As Object
Dim strto As String, strcc As String, strbcc As String
Dim strsub As String, strbody As String
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
strto = "xx@xx"
strcc = ""
strbcc = ""
strsub = "Incidencia Registro"
strbody = "Buenos días" & vbNewLine & vbNewLine & _
"Mensaje aviso : " & Cells(FormulaCell.Row, "A").Value & _
vbNewLine & vbNewLine & "Un Saludo"
With OutMail
.To = strto
.CC = strcc
.BCC = strbcc
.Subject = strsub
.Body = strbody
.Send 'End With
Set OutMail = Nothing
Set OutApp = Nothing
End Sub

1 Respuesta

Respuesta
1

La razón por la cual te reenvía el mail es porque al abrir el libro el procedimiento calculate de Workbook se ejecuta automáticamente. Lo que puedes hacer es meter una instrucción de control en el bucle for each next ya que cuando la formula se cumple (formulacell.value=-1) entra en el if. Pues bien, vamos a efectuar un control. Vamos a crear dos variables más para saber en que celda estoy:

dim r as integer, c as integer

y las introduces aquí:

For Each FormulaCell In FormulaRange.Cells

r=activecell.row

c=activecell.column

Si el mensaje ha sido enviado en la celda de al lado estará escrito Sent, ¿no? Pues aquí tienes el control:

With FormulaCell

if cell(r,c+1).value<>MyMsg then

If .Value = MyLimit Then

MyMsg = SentMsg

Call Mail_with_outlook1

End If

Application.EnableEvents = False

FormulaCell.Offset(0, 1).Value = MyMsg
Application.EnableEvents = True

End With

Next FormulaCell

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas