2017-09-19 2 views
1

Un e-mail Outlook est généré chaque fois que j'exécute un code VBA dans Excel. Il n'envoie pas automatiquement, et je ne le veux pas. Le courrier électronique est rempli par des valeurs de cellule dans une plage (qui sont basées sur ActiveCell) et Je veux capturer par programme lorsque l'email est envoyé manuellement dans ActiveCell.Offset (0, 13), de préférence avec VBA dans mon Excel actuel programme.Capture de l'heure d'envoi des e-mails Outlook dans Excel VBA

C'est le code par lequel j'afficher l'e-mail:

'Send Stock Request: 
Dim OutApp As Object 
Dim OutMail As Object 

Set OutApp = CreateObject("Outlook.Application") 
Set OutMail = OutApp.CreateItem(olMailItem) 

With OutMail 
    .BodyFormat = olFormatHTML 
    .HTMLBody = "My eMail's HTML Body" 
    .To = "[email protected]" 
    .CC = "" 
    .BCC = "" 
    .Subject = "Stock Request" 
    .Display 
End With 

Set OutMail = Nothing 
Set OutApp = Nothing 
+0

Si ce n'est pas possible dans Excel vba (je ne sais pas si c'est possible ou non) alors peut-être utiliser Outlook vba. Il existe un événement Send dans lequel vous pouvez vérifier quel e-mail vous envoyez et stocker les informations dans Excel. – Stefan

+0

Dans ce cas, savez-vous comment accéder à cet événement? Je connais le modèle d'objet d'Excel mais pas celui d'Outlook malheureusement. – Frostbitphoenix

+0

Le fichier Excel est-il garanti d'être ouvert lorsque le courrier est finalement envoyé? –

Répondre

1

Il peut être fait par VBA, mais le code ci-dessous doit être collé dans le module Outlook au lieu d'Excel, dans Outlook => Module ThisOutlookSession. Assurez-vous également d'autoriser les macros dans Outlook.

Private Sub Application_ItemSend(ByVal olItem As Object, Cancel As Boolean) 

Dim Xl As Object ' Excel.Application 
Dim Wb As Object ' Excel.Workbook 
Set Xl = GetObject(, "excel.application") 
Set Wb = Xl.Workbooks("NameOfYourOpenedWorkbook.xlsb") 
Wb.Activate 
Xl.activecell.Offset(0, 13).Value = Date & " " & Time 

End Sub 

Alors maintenant, lorsque vous envoyez votre e-mail automatiquement créé manuellement, vous obtiendrez date et l'heure capturé dans votre classeur ouvert dans la cellule ActiveCell.Offset(0, 13).

+0

Merci beaucoup pour ça! Je vais essayer de mettre en œuvre cela et vous laisser savoir ce qui se passe. Cela affectera-t-il tous les emails envoyés ou seulement ceux créés via les modules Excel (si cette réponse est évidente alors s'il vous plaît, pardonnez-moi mon insouciance car j'ai peu d'expérience avec VBA dans Outlook)? – Frostbitphoenix

+0

Cela a fonctionné à merveille! Merci beaucoup pour votre aide avec ça! – Frostbitphoenix

+0

De rien. Bonne question, cela affectera tous les emails envoyés. vous pouvez ajouter une instruction if dans private sub pour exécuter uniquement le reste du code lorsque votre classeur spécifique est ouvert. ou simplement désactiver les macros dans Outlook lorsque vous ne travaillez pas avec votre fichier Excel ... –

0

Ajouter une référence de projet VBA au modèle d'objet Outlook, et ajoutez cette classe à votre fichier Excel:

''clsMail 
Option Explicit 

Public WithEvents itm As Outlook.MailItem 
Public DestCell As Range '<< where to put the "sent" message 
'you can add other fields here if you need (eg) to 
' preserve some other info to act on when the mail is sent 

Private Sub itm_Send(Cancel As Boolean) 
    Debug.Print "Sending mail with subject: '" & itm.Subject & "'" 
    DestCell.Value = "Mail sent!" '<< record the mail was sent 
End Sub 

Puis dans votre code de messagerie d'envoi que vous pouvez faire quelque chose comme ceci:

Option Explicit 

Dim colMails As New Collection 

Sub Tester() 

    Dim OutApp As Object 
    Dim OutMail As Object 
    Dim obj As clsMail 

    Set OutApp = CreateObject("Outlook.Application") 
    Set OutMail = OutApp.CreateItem(olMailItem) 

    With OutMail 
     .BodyFormat = olFormatHTML 
     .HTMLBody = "My eMail's HTML Body" 
     .To = "[email protected]" 
     .CC = "" 
     .BCC = "" 
     .Subject = "Stock Request" 
     .Display 
    End With 
    'create an instance of the class and add it to the global collection colMails 
    Set obj = New clsMail 
    Set obj.itm = OutMail 
    Set obj.DestCell = ActiveCell.Offset(0, 13) '<< "sent" flag goes here 
               ' when the user sends the mail 
    colMails.Add obj 

End Sub