Ситуация : я отправляю ежедневные отчеты нескольким заинтересованным сторонам (~ 10) на основе некоторых критериев. Я новичок в VBA, поэтому попытался с некоторой помощью здесь скомпилировать приведенный ниже код, поэтому, пожалуйста, потерпите меня:
- Критерии 1: загрузка вложений на основе отправителей и 1 или2 ключевых слова от отправителя электронной почты и темы
- Критерии 2: Исключить выходные дни, так как отчеты только отправляются и получают ответы от соответствующих заинтересованных сторон в рабочие дни. На этой заметке отчеты за понедельник необходимо будет загрузить из приложения в пятницу
- Критерии 3: одна компания имеет 4 региона, остальные просто централизованы. Сказав это, после загрузки вложений из компании с 4 регионами мне нужно, чтобы вложение было сохранено в папке под названием компании. Принимая во внимание, что с остальными компаниями они все сохранены в соответствующем названии папки компании. Файлы будут более информативными с указанием года, месяца и дня, в отличие от родительской папки, ограниченной названием компании и только год и месяц .
Все вышеперечисленное было предпринято иприлагается здесь. Мне также нужно создать автоматизацию, в которой в каждой папке будут храниться файлы максимум 2 месяца, после чего будет создана другая папка с новыми вложениями тех месяцев, которые будут заполняться.
Я ценю, что мой код неуклюжий, и мне нужна более быстрая версия, пожалуйста. Любая помощь будет принята с благодарностью:
Option Explicit
Sub SaveOutlookAttachments()
Dim objOutlook As New Outlook.Application
Dim objNamespace As Outlook.Namespace
Dim objFolder As Outlook.folder
Dim objItem As Object
Dim objMailItem As Outlook.MailItem
Dim objAttachment As Outlook.Attachment
'For Folders creation
Dim fso As Scripting.FileSystemObject
Dim dir As Scripting.Folders
Dim dirFolderName As String
'For Date settings
Dim iBackdate As Integer
' Hardcoding Partners -
Dim COMP_A_North As String
Dim COMP_A_South As String
Dim COMP_A_East As String
Dim COMP_A_West As String
Dim COMP_B As String
Dim COMP_C As String
Dim COMP_D As String
Dim COMP_E As String
Dim COMP_F As String
Set objNamespace = objOutlook.GetNamespace("MAPI")
Set objFolder = objNamespace.Folders(1).Folders("Inbox")
Set fso = New Scripting.FileSystemObject
'Setting Partner Filters
COMP_A_North = "@SQL=""urn:schemas:httpmail:fromname"" LIKE '%@compa%'" & "AND
""urn:schemas:httpmail:subject"" LIKE '%Scotland%'"
COMP_A_South = "@SQL=""urn:schemas:httpmail:fromname"" LIKE '%@compa%'" & "AND
""urn:schemas:httpmail:subject"" LIKE '%North%'"
COMP_A_East = "@SQL=""urn:schemas:httpmail:fromname"" LIKE '%@compa%'" & "AND
""urn:schemas:httpmail:subject"" LIKE '%Midlands%'"
COMP_A_West = "@SQL=""urn:schemas:httpmail:fromname"" LIKE '%@compa%'" & "AND
""urn:schemas:httpmail:subject"" LIKE '%London%'"
COMP_B = "@SQL=""urn:schemas:httpmail:fromname"" LIKE '%@compb%'" & "AND
""urn:schemas:httpmail:subject"" LIKE '%Missing%'"
COMP_C = "@SQL=""urn:schemas:httpmail:fromname"" LIKE '%@compc%'" & "AND
""urn:schemas:httpmail:subject"" LIKE '%Missing%'"
COMP_D = "@SQL=""urn:schemas:httpmail:fromname"" LIKE '%@compd%'" & "AND
""urn:schemas:httpmail:subject"" LIKE '%Missing%'"
COMP_E = "@SQL=""urn:schemas:httpmail:fromname"" LIKE '%compe%'" & "AND
""urn:schemas:httpmail:subject"" LIKE '%Missing%'"
COMP_F = "@SQL=""urn:schemas:httpmail:fromname"" LIKE '%@compf%'" & "AND
""urn:schemas:httpmail:subject"" LIKE '%Missing%'"
For Each objItem In objFolder.Items.Restrict(COMP_A_North)
'Check Item Class
If objItem.Class = Outlook.olMail Then
'Set as Mail Item
Set objMailItem = objItem
With objMailItem
Select Case Weekday(Now)
Case 7 ' Saturday: add extra day
iBackdate = 3
Case 1, 2, 3 ' Sunday through Tuesday: add extra 2 days
iBackdate = 4
Case Else ' Other days
iBackdate = 2
End Select
' Check date
If .ReceivedTime > DateAdd("d", -iBackdate, Now) Then
' Save Attachments
If objAttachment.Count > 0 Then
dirFolderName = "C:\Users\rootname\OneDrive\Desktop\VBATesting" & "compa Report UpTo" &
Format(objAttachment.receivetime, "yyyy-mm")
If fso.FolderExists(dirFolderName) Then
Set dir = fso.GetFolder(dirFolderName)
Else
Set dir = fso.CreateFolder(dirFolderName)
End If
For Each objAttachment In .Attachments
Debug.Print objMailItem.Sender, objMailItem.ReceivedTime, objMailItem.Subject
objAttachment.SaveAsFile "C:\Users\rootname\OneDrive\Desktop\VBATesting" &
objAttachment.FileName = "compa North and Iceland Region Report" & Format(.ReceivedTime, "yyyy-
mm- dd") 'Put in a valid folder location to store attachements
Next
End If
End If
End With
End If
Next
For Each objItem In objFolder.Items.Restrict(COMP_A_South)
'Check Item Class
If objItem.Class = Outlook.olMail Then
'Set as Mail Item
Set objMailItem = objItem
With objMailItem
Select Case Weekday(Now)
Case 7 ' Saturday: add extra day
iBackdate = 3
Case 1, 2, 3 ' Sunday through Tuesday: add extra 2 days
iBackdate = 4
Case Else ' Other days
iBackdate = 2
End Select
' Check date
If .ReceivedTime > DateAdd("d", -iBackdate, Now) Then
' Save Attachments
If objAttachment.Count > 0 Then
dirFolderName = "C:\Users\rootname\OneDrive\Desktop\VBATesting" & "compa Report
UpTo" & Format(objAttachment.receivetime, "yyyy-mm")
If fso.FolderExists(dirFolderName) Then
Set dir = fso.GetFolder(dirFolderName)
Else
Set dir = fso.CreateFolder(dirFolderName)
End If
For Each objAttachment In .Attachments
Debug.Print objMailItem.Sender, objMailItem.ReceivedTime,
objMailItem.Subject
objAttachment.SaveAsFile "C:\Users\rootname\OneDrive\Desktop\VBATesting" &
objAttachment.FileName = "compa South Region Report" &
Format(.ReceivedTime, "yyyy-mm-dd") 'Put in a valid folder location to
store attachements
Next
End If
End If
End With
End If
Next
For Each objItem In objFolder.Items.Restrict(COMP_A_East)
'Check Item Class
If objItem.Class = Outlook.olMail Then
'Set as Mail Item
Set objMailItem = objItem
With objMailItem
Select Case Weekday(Now)
Case 7 ' Saturday: add extra day
iBackdate = 3
Case 1, 2, 3 ' Sunday through Tuesday: add extra 2 days
iBackdate = 4
Case Else ' Other days
iBackdate = 2
End Select
' Check date
If .ReceivedTime > DateAdd("d", -iBackdate, Now) Then
' Save Attachments
If objAttachment.Count > 0 Then
dirFolderName = "C:\Users\rootname\OneDrive\Desktop\VBATesting" & "compa Report
UpTo" & Format(objAttachment.receivetime, "yyyy-mm")
If fso.FolderExists(dirFolderName) Then
Set dir = fso.GetFolder(dirFolderName)
Else
Set dir = fso.CreateFolder(dirFolderName)
End If
For Each objAttachment In .Attachments
Debug.Print objMailItem.Sender, objMailItem.ReceivedTime, objMailItem.Subject
objAttachment.SaveAsFile "C:\Users\rootname\OneDrive\Desktop\VBATesting" &
objAttachment.FileName = "compa East Region Report" & Format(.ReceivedTime, "yyyy-mm-dd") 'Put in
a valid folder location to store attachements
Next
End If
End If
End With
End If
Next
For Each objItem In objFolder.Items.Restrict(COMP_A_West)
'Check Item Class
If objItem.Class = Outlook.olMail Then
'Set as Mail Item
Set objMailItem = objItem
With objMailItem
Select Case Weekday(Now)
Case 7 ' Saturday: add extra day
iBackdate = 3
Case 1, 2, 3 ' Sunday through Tuesday: add extra 2 days
iBackdate = 4
Case Else ' Other days
iBackdate = 2
End Select
' Check date
If .ReceivedTime > DateAdd("d", -iBackdate, Now) Then
' Save Attachments
If objAttachment.Count > 0 Then
dirFolderName = "C:\Users\rootname\OneDrive\Desktop\VBATesting" & "compa Report
UpTo" & Format(objAttachment.receivetime, "yyyy-mm")
If fso.FolderExists(dirFolderName) Then
Set dir = fso.GetFolder(dirFolderName)
Else
Set dir = fso.CreateFolder(dirFolderName)
End If
For Each objAttachment In .Attachments
Debug.Print objMailItem.Sender, objMailItem.ReceivedTime, objMailItem.Subject
objAttachment.SaveAsFile "C:\Users\rootname\OneDrive\Desktop\VBATesting" &
objAttachment.FileName = "compa West and Central Region Report" & Format(.ReceivedTime, "yyyy-mm-
dd") 'Put in a valid folder location to store attachements
Next
End If
End If
End With
End If
Next
For Each objItem In objFolder.Items.Restrict(COMP_B)
'Check Item Class
If objItem.Class = Outlook.olMail Then
'Set as Mail Item
Set objMailItem = objItem
With objMailItem
Select Case Weekday(Now)
Case 7 ' Saturday: add extra day
iBackdate = 3
Case 1, 2, 3 ' Sunday through Tuesday: add extra 2 days
iBackdate = 4
Case Else ' Other days
iBackdate = 2
End Select
' Check date
If .ReceivedTime > DateAdd("d", -iBackdate, Now) Then
' Save Attachments
If objAttachment.Count > 0 Then
dirFolderName = "C:\Users\rootname\OneDrive\Desktop\VBATesting" & "CompB Report
UpTo" & Format(objAttachment.receivetime, "yyyy-mm")
If fso.FolderExists(dirFolderName) Then
Set dir = fso.GetFolder(dirFolderName)
Else
Set dir = fso.CreateFolder(dirFolderName)
End If
For Each objAttachment In .Attachments
Debug.Print objMailItem.Sender, objMailItem.ReceivedTime, objMailItem.Subject
objAttachment.SaveAsFile "C:\Users\rootname\OneDrive\Desktop\VBATesting" &
objAttachment.FileName = "compb Report" & Format(.ReceivedTime, "yyyy-mm-dd") 'Put in a valid
folder location to store attachements
Next
End If
End If
End With
End If
Next
For Each objItem In objFolder.Items.Restrict(COMP_C)
'Check Item Class
If objItem.Class = Outlook.olMail Then
'Set as Mail Item
Set objMailItem = objItem
With objMailItem
Select Case Weekday(Now)
Case 7 ' Saturday: add extra day
iBackdate = 3
Case 1, 2, 3 ' Sunday through Tuesday: add extra 2 days
iBackdate = 4
Case Else ' Other days
iBackdate = 2
End Select
' Check date
If .ReceivedTime > DateAdd("d", -iBackdate, Now) Then
' Save Attachments
If objAttachment.Count > 0 Then
dirFolderName = "C:\Users\rootname\OneDrive\Desktop\VBATesting" & "CompC Report UpTo" &
Format(objAttachment.receivetime, "yyyy-mm")
If fso.FolderExists(dirFolderName) Then
Set dir = fso.GetFolder(dirFolderName)
Else
Set dir = fso.CreateFolder(dirFolderName)
End If
For Each objAttachment In .Attachments
Debug.Print objMailItem.Sender, objMailItem.ReceivedTime, objMailItem.Subject
objAttachment.SaveAsFile "C:\Users\rootname\OneDrive\Desktop\VBATesting" &
objAttachment.FileName = "CompC Report" & Format(.ReceivedTime, "yyyy-mm-dd") 'Put in a valid
folder location to store attachements
Next
End If
End If
End With
End If
Next
For Each objItem In objFolder.Items.Restrict(COMP_D)
'Check Item Class
If objItem.Class = Outlook.olMail Then
'Set as Mail Item
Set objMailItem = objItem
With objMailItem
Select Case Weekday(Now)
Case 7 ' Saturday: add extra day
iBackdate = 3
Case 1, 2, 3 ' Sunday through Tuesday: add extra 2 days
iBackdate = 4
Case Else ' Other days
iBackdate = 2
End Select
' Check date
If .ReceivedTime > DateAdd("d", -iBackdate, Now) Then
' Save Attachments
If objAttachment.Count > 0 Then
dirFolderName = "C:\Users\rootname\OneDrive\Desktop\VBATesting" & "CompD Report UpTo" &
Format(objAttachment.receivetime, "yyyy-mm")
If fso.FolderExists(dirFolderName) Then
Set dir = fso.GetFolder(dirFolderName)
Else
Set dir = fso.CreateFolder(dirFolderName)
End If
For Each objAttachment In .Attachments
Debug.Print objMailItem.Sender, objMailItem.ReceivedTime, objMailItem.Subject
objAttachment.SaveAsFile "C:\Users\rootname\OneDrive\Desktop\VBATesting" &
objAttachment.FileName = "compd Report" & Format(.ReceivedTime, "yyyy-mm-dd") 'Put in a valid
folder location to store attachements
Next
End If
End If
End With
End If
Next
For Each objItem In objFolder.Items.Restrict(COMP_E)
'Check Item Class
If objItem.Class = Outlook.olMail Then
'Set as Mail Item
Set objMailItem = objItem
With objMailItem
Select Case Weekday(Now)
Case 7 ' Saturday: add extra day
iBackdate = 3
Case 1, 2, 3 ' Sunday through Tuesday: add extra 2 days
iBackdate = 4
Case Else ' Other days
iBackdate = 2
End Select
' Check date
If .ReceivedTime > DateAdd("d", -iBackdate, Now) Then
' Save Attachments
If objAttachment.Count > 0 Then
dirFolderName = "C:\Users\rootname\OneDrive\Desktop\VBATesting" & "CompE Report UpTo" &
Format(objAttachment.receivetime, "yyyy-mm")
If fso.FolderExists(dirFolderName) Then
Set dir = fso.GetFolder(dirFolderName)
Else
Set dir = fso.CreateFolder(dirFolderName)
End If
For Each objAttachment In .Attachments
Debug.Print objMailItem.Sender, objMailItem.ReceivedTime, objMailItem.Subject
objAttachment.SaveAsFile "C:\Users\rootname\OneDrive\Desktop\VBATesting" &
objAttachment.FileName = "compe Report" & Format(.ReceivedTime, "yyyy-mm-dd") 'Put in a valid
folder location to store attachements
Next
End If
End If
End With
End If
Next
For Each objItem In objFolder.Items.Restrict(COMP_F)
'Check Item Class
If objItem.Class = Outlook.olMail Then
'Set as Mail Item
Set objMailItem = objItem
With objMailItem
Select Case Weekday(Now)
Case 7 ' Saturday: add extra day
iBackdate = 3
Case 1, 2, 3 ' Sunday through Tuesday: add extra 2 days
iBackdate = 4
Case Else ' Other days
iBackdate = 2
End Select
' Check date
If .ReceivedTime > DateAdd("d", -iBackdate, Now) Then
' Save Attachments
If objAttachment.Count > 0 Then
dirFolderName = "C:\Users\rootname\OneDrive\Desktop\VBATesting" & "CompF Report UpTo" &
Format(objAttachment.receivetime, "yyyy-mm")
If fso.FolderExists(dirFolderName) Then
Set dir = fso.GetFolder(dirFolderName)
Else
Set dir = fso.CreateFolder(dirFolderName)
End If
For Each objAttachment In .Attachments
Debug.Print objMailItem.Sender, objMailItem.ReceivedTime, objMailItem.Subject
objAttachment.SaveAsFile "C:\Users\rootname\OneDrive\Desktop\VBATesting" &
objAttachment.FileName = "compf Report" & Format(.ReceivedTime, "yyyy-mm-dd") 'Put in a valid
folder location to store attachements
Next
End If
End If
End With
End If
Next
End Sub