Ответ 1
Я могу дать вам полный код за один раз, но это не поможет вам извлечь уроки из него;) Итак, давайте разберем ваши запросы, и тогда мы будем их обрабатывать 1 к 1. Это будет очень длинный пост, так что наберитесь терпения: )
Всего 5 частей, которые будут охватывать все 7 (да 7, а не 6) баллов, поэтому вам не нужно создавать новый вопрос для своего 7-го балла.
ЧАСТЬ - 1
- Создание подключения к Outlook
- Проверка наличия непрочитанного электронного письма
- Получение таких деталей, как
Sender email Address
,Date received
,Date Sent
,Subject
,The message of the email
Смотрите этот пример кода. Я связываюсь с Outlook из Excel, а затем проверяю, есть ли непрочитанные элементы, и, если они есть, я получаю соответствующие данные.
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
Так что позаботьтесь о своем запросе, в котором говорится о сохранении деталей в переменных.
ЧАСТЬ - 2
Теперь перейдем к следующему запросу
- Загрузите одно-единственное вложение из первого письма (самого нового) в папку входящих сообщений Outlook
- Сохраните вложение в файле с указанным путем (например, "C:...")
- Переименуйте имя вложения с: текущая дата + предыдущее имя файла
Смотрите этот пример кода. Я снова связываюсь с Outlook из Excel, затем проверяю, есть ли непрочитанные элементы, и, если они есть, я дополнительно проверяю, есть ли у него вложение и загружает ли оно его в соответствующую папку.
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 does not have an attachment"
End If
Exit For
Next
End Sub
ЧАСТЬ - 3
Переходя к следующему запросу
- Сохраните письмо в другой папке с путем, например, "C:..."
Смотрите этот пример кода. Это сохранить письмо, чтобы сказать 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
ЧАСТЬ - 4
Переходя к следующему запросу
- Пометьте письмо в Outlook как "прочитанное"
Смотрите этот пример кода. Это пометит письмо как 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
ЧАСТЬ - 5
Переходя к следующему запросу
- Откройте приложение Excel в Excel
как только вы загрузили файл/вложение, как показано выше, используйте этот путь в приведенном ниже коде, чтобы открыть файл.
Sub OpenExcelFile()
Dim wb As Workbook
'~~> FilePath is the file that we earlier downloaded
Set wb = Workbooks.Open(FilePath)
End Sub
Я преобразовал этот пост в несколько постов в блоге (с дополнительными пояснениями), к которым можно обратиться через пункты 15, 16 и 17 в vba-excel