Scarica allegato da Outlook e Apri in Excel

Sto cercando di scaricare e quindi aprire un allegato del foglio di calcolo di Excel in una email di Outlook utilizzando VBA in Excel. Come posso:

  1. Scarica il solo allegato dalla prima e-mail (la nuova e-mail) nella mia posta in arrivo di Outlook
  2. Salva l’allegato in un file con un percorso specificato (es .: “C: …”)
  3. Rinominare il nome dell’allegato con: data corrente + nome file precedente
  4. Salva l’email in una cartella diversa con un percorso come “C: …”
  5. Segna l’e-mail in Outlook come “leggi”
  6. Apri l’allegato excel in Excel

Voglio anche essere in grado di salvare quanto segue come stringhe individuali assegnate a singole variabili:

  • Indirizzo e-mail del mittente
  • Data Ricevuto
  • Data inviata
  • Sobject
  • Il messaggio dell’e-mail

anche se questo potrebbe essere meglio chiedere in una domanda separata / cercarlo da solo.

Il codice che ho attualmente proviene da altri forum online e probabilmente non è molto utile. Tuttavia, ecco alcuni frammenti su cui ho lavorato:

Sub SaveAttachments() Dim olFolder As Outlook.MAPIFolder Dim att As Outlook.Attachment Dim strFilePath As String Dim fsSaveFolder As String fsSaveFolder = "C:\test\" strFilePath = "C:\temp\" Set olFolder = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox) For Each msg In olFolder.Items While msg.Attachments.Count > 0 bflag = False If Right$(msg.Attachments(1).Filename, 3) = "msg" Then bflag = True msg.Attachments(1).SaveAsFile strFilePath & strTmpMsg Set msg2 = Application.CreateItemFromTemplate(strFilePath & strTmpMsg) End If sSavePathFS = fsSaveFolder & msg2.Attachments(1).Filename End If End Sub 

Posso darti il ​​codice completo in una volta sola, ma questo non ti aiuterà a imparare da esso;) Quindi suddividiamo le tue richieste e poi le affronteremo 1 per 1. Questo sarà un post molto lungo quindi sii paziente: )

Ci sono 5 parti totali che copriranno tutti i 7 punti (sì 7 e non 6) in modo da non dover creare una nuova domanda per il tuo 7 ° punto.


PARTE 1

  1. Creazione di una connessione a Outlook
  2. Verifica se è presente un’email non letta
  3. Recupero di dettagli come Sender email Address , Date received , Date Sent The message of the email , Subject , The message of the email

Vedi questo esempio di codice. Sono in ritardo con Outlook da Excel, quindi controllo se ci sono articoli non letti e se ci sono sto recuperando i dettagli rilevanti.

 Const olFolderInbox As Integer = 6 Sub ExtractFirstUnreadEmailDetails() Dim oOlAp As Object, oOlns As Object, oOlInb As Object Dim oOlItm As Object '~~> Outlook Variables for email Dim eSender As String, dtRecvd As String, dtSent As String Dim sSubj As String, sMsg As String '~~> Get Outlook instance Set oOlAp = GetObject(, "Outlook.application") Set oOlns = oOlAp.GetNamespace("MAPI") Set oOlInb = oOlns.GetDefaultFolder(olFolderInbox) '~~> Check if there are any actual unread emails If oOlInb.Items.Restrict("[UnRead] = True").Count = 0 Then MsgBox "NO Unread Email In Inbox" Exit Sub End If '~~> Store the relevant info in the variables For Each oOlItm In oOlInb.Items.Restrict("[UnRead] = True") eSender = oOlItm.SenderEmailAddress dtRecvd = oOlItm.ReceivedTime dtSent = oOlItm.CreationTime sSubj = oOlItm.Subject sMsg = oOlItm.Body Exit For Next Debug.Print eSender Debug.Print dtRecvd Debug.Print dtSent Debug.Print sSubj Debug.Print sMsg End Sub 

In modo che si prenda cura della tua richiesta che parla di memorizzare i dettagli nelle variabili.


PARTE 2

Ora passiamo alla tua prossima richiesta

  1. Scarica il solo allegato dalla prima e-mail (la nuova e-mail) nella mia posta in arrivo di Outlook
  2. Salva l’allegato in un file con un percorso specificato (es .: “C: …”)
  3. Rinominare il nome dell’allegato con: data corrente + nome file precedente

Vedi questo esempio di codice. Sono di nuovo in ritardo con Outlook da Excel, quindi controllo se ci sono elementi non letti e se ci sono sto verificando ulteriormente se ha un allegato e se è quindi scaricato nella cartella pertinente.

 Const olFolderInbox As Integer = 6 '~~> Path for the attachment Const AttachmentPath As String = "C:\" Sub DownloadAttachmentFirstUnreadEmail() Dim oOlAp As Object, oOlns As Object, oOlInb As Object Dim oOlItm As Object, oOlAtch As Object '~~> New File Name for the attachment Dim NewFileName As String NewFileName = AttachmentPath & Format(Date, "DD-MM-YYYY") & "-" '~~> Get Outlook instance Set oOlAp = GetObject(, "Outlook.application") Set oOlns = oOlAp.GetNamespace("MAPI") Set oOlInb = oOlns.GetDefaultFolder(olFolderInbox) '~~> Check if there are any actual unread emails If oOlInb.Items.Restrict("[UnRead] = True").Count = 0 Then MsgBox "NO Unread Email In Inbox" Exit Sub End If '~~> Extract the attachment from the 1st unread email For Each oOlItm In oOlInb.Items.Restrict("[UnRead] = True") '~~> Check if the email actually has an attachment If oOlItm.Attachments.Count <> 0 Then For Each oOlAtch In oOlItm.Attachments '~~> Download the attachment oOlAtch.SaveAsFile NewFileName & oOlAtch.Filename Exit For Next Else MsgBox "The First item doesn't have an attachment" End If Exit For Next End Sub 

PARTE – 3

Passando alla tua prossima richiesta

  1. Salva l’email in una cartella diversa con un percorso come “C: …”

Vedi questo esempio di codice. Questo salva l’email per dire C: \

 Const olFolderInbox As Integer = 6 '~~> Path + Filename of the email for saving Const sEmail As String = "C:\ExportedEmail.msg" Sub SaveFirstUnreadEmail() Dim oOlAp As Object, oOlns As Object, oOlInb As Object Dim oOlItm As Object, oOlAtch As Object '~~> Get Outlook instance Set oOlAp = GetObject(, "Outlook.application") Set oOlns = oOlAp.GetNamespace("MAPI") Set oOlInb = oOlns.GetDefaultFolder(olFolderInbox) '~~> Check if there are any actual unread emails If oOlInb.Items.Restrict("[UnRead] = True").Count = 0 Then MsgBox "NO Unread Email In Inbox" Exit Sub End If '~~> Save the 1st unread email For Each oOlItm In oOlInb.Items.Restrict("[UnRead] = True") oOlItm.SaveAs sEmail, 3 Exit For Next End Sub 

PARTE – 4

Passando alla tua prossima richiesta

  1. Segna l’e-mail in Outlook come “leggi”

Vedi questo esempio di codice. Questo segnerà l’e-mail come read .

 Const olFolderInbox As Integer = 6 Sub MarkAsUnread() Dim oOlAp As Object, oOlns As Object, oOlInb As Object Dim oOlItm As Object, oOlAtch As Object '~~> Get Outlook instance Set oOlAp = GetObject(, "Outlook.application") Set oOlns = oOlAp.GetNamespace("MAPI") Set oOlInb = oOlns.GetDefaultFolder(olFolderInbox) '~~> Check if there are any actual unread emails If oOlInb.Items.Restrict("[UnRead] = True").Count = 0 Then MsgBox "NO Unread Email In Inbox" Exit Sub End If '~~> Mark 1st unread email as read For Each oOlItm In oOlInb.Items.Restrict("[UnRead] = True") oOlItm.UnRead = False DoEvents oOlItm.Save Exit For Next End Sub 

PARTE – 5

Passando alla tua prossima richiesta

  1. Apri l’allegato excel in Excel

una volta scaricato il file / allegato come mostrato sopra, utilizzare quel percorso nel codice seguente per aprire il file.

 Sub OpenExcelFile() Dim wb As Workbook '~~> FilePath is the file that we earlier downloaded Set wb = Workbooks.Open(FilePath) End Sub 
 (Excel vba) 

Grazie a Sid 🙂 per il tuo codice (rubato il tuo codice) .. ho avuto questa situazione oggi. Ecco il mio codice. Codice basso salva allegato, posta anche informazioni di posta .. Tutti i crediti vanno a Sid

 Tested Sub mytry() Dim olapp As Object Dim olmapi As Object Dim olmail As Object Dim olitem As Object Dim lrow As Integer Dim olattach As Object Dim str As String Const num As Integer = 6 Const path As String = "C:\HP\" Const emailpath As String = "C:\Dell\" Const olFolderInbox As Integer = 6 Set olp = CreateObject("outlook.application") Set olmapi = olp.getnamespace("MAPI") Set olmail = olmapi.getdefaultfolder(num) If olmail.items.restrict("[UNREAD]=True").Count = 0 Then MsgBox ("No Unread mails") Else For Each olitem In olmail.items.restrict("[UNREAD]=True") lrow = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row + 1 Range("A" & lrow).Value = olitem.Subject Range("B" & lrow).Value = olitem.senderemailaddress Range("C" & lrow).Value = olitem.to Range("D" & lrow).Value = olitem.cc Range("E" & lrow).Value = olitem.body If olitem.attachments.Count <> 0 Then For Each olattach In olitem.attachments olattach.SaveAsFile path & Format(Date, "MM-dd-yyyy") & olattach.Filename Next olattach End If str = olitem.Subject str = Replace(str, "/", "-") str = Replace(str, "|", "_") Debug.Print str olitem.SaveAs (emailpath & str & ".msg") olitem.unread = False DoEvents olitem.Save Next olitem End If ActiveSheet.Rows.WrapText = False End Sub