Forum Discussion
Run macro after new email
Is it possible to enable automatic macro execution (run macro) every time a new email arrives? Can something like: Private Sub Application_Startup / Triggered() be added to the code? Or at least add a command for the macro to click the blue button = (run macro) every time a new email arrives or to automatically click it every 3''? (To automatically repeat the action '- run macro - every 3'' (3 seconds)? I thought the whole code should remain only in excel so that it doesn't have to be entered into outlook?
Here is the code that works but only when the blue button is clicked.
https://raw.githubusercontent.com/santhosh2r2/youtube/7d3490f62aa5e8f4daa90e28bbb09523d0f6bd98/03_Tech_Tips/41_Import_Outlook_Email.vba.txt
https://www.youtube.com/watch?v=KDmYawgx20I
'Clear the range contents Sub Clear_Range() Dim lastRow As Integer lastRow = Cells(Rows.Count, 1).End(xlUp).Row If lastRow > 4 Then ActiveSheet.Range("A5:D" & lastRow).ClearContents End If End Sub 'Import E-Mails from Outlook subroutine Sub Import_Emails() 'Empty the range Clear_Range 'Create an Outlook Application object Dim OutlookApp As Outlook.Application 'Create an Namespace object Dim OutlookNamespace As Namespace 'Create a Outlook folder object Dim Folder As MAPIFolder 'Object to store the retrieved E-Mails Dim OutlookItems As Outlook.items 'Temporary object, used for iteration Dim OutlookMail As Variant 'Get the folder name from excel sheet Dim FolderName As String FolderName = ActiveSheet.Range("D1").Value 'Create an instance of Outlook Set OutlookApp = New Outlook.Application 'Set the namespace Set OutlookNamespace = OutlookApp.GetNamespace("MAPI") 'Error handling On Error GoTo ExitSub 'If the checkbox is not checked, then the folder is at the same level as inbox If ActiveSheet.OLEObjects("check").Object.Value = False Then Set Folder = OutlookNamespace.GetDefaultFolder(olFolderInbox).Folders("Forex").Folders("Majors").Folders("USDJPY") End If 'If the checkbox is active, then it is a sub-folder of inbox If ActiveSheet.OLEObjects("check").Object.Value = True Then Set Folder = OutlookNamespace.GetDefaultFolder(olFolderInbox).Folders("Forex").Folders("Majors").Folders("USDJPY") End If 'Get the folder items and sort according to the recieved time Set OutlookItems = Folder.items OutlookItems.Sort "ReceivedTime", True 'Results counter starting from Row 5 Dim i As Integer i = 5 'Print the output For Each OutlookMail In OutlookItems If OutlookMail.ReceivedTime >= ActiveSheet.Range("B1").Value Then ActiveSheet.Cells(i, 1).Value = OutlookMail.ReceivedTime ActiveSheet.Cells(i, 2).Value = OutlookMail.SenderName ActiveSheet.Cells(i, 3).Value = OutlookMail.Subject ActiveSheet.Cells(i, 4).Value = OutlookMail.Body i = i + 1 End If Next OutlookMail 'Display the total number of e-mails retrieved ActiveSheet.Range("B2").Value = i - 5 ActiveSheet.Range("B2").Font.Color = vbBlack 'Reset the obejcts Set OutlookItems = Nothing Set Folder = Nothing Set OutlookNamespace = Nothing Set OutlookApp = Nothing Exit Sub 'Error handling function ExitSub: ActiveSheet.Range("B2").Value = "Folder name not found" ActiveSheet.Range("B2").Font.Color = vbRed Set OutlookItems = Nothing Set Folder = Nothing Set OutlookNamespace = Nothing Set OutlookApp = Nothing End Sub
1 Reply
Try below
Private WithEvents Items As Outlook.Items Private Sub Application_Startup() Dim Ns As Outlook.NameSpace Set Ns = Application.GetNamespace("MAPI") Set Items = Ns.GetDefaultFolder(olFolderInbox).Items End Sub Private Sub Items_ItemAdd(ByVal Item As Object) If TypeOf Item Is Outlook.MailItem Then Call RunExcelMacro End If End Sub Private Sub RunExcelMacro() Dim xlApp As Object Set xlApp = CreateObject("Excel.Application") xlApp.Workbooks.Open "C:\Workbook.xlsx" xlApp.Run "Import_Emails" xlApp.Quit Set xlApp = Nothing End Sub