我试着:
我遇到的问题:
Public Sub ProcessEmails()
Dim oItems As Outlook.Items
Dim oItem As Object
Set oItems = Session.GetDefaultFolder(olFolderInbox).Items
For Each oItem In oItems
If TypeName(oItem) = "MailItem" Then Call SaveAttachmentsToDisk(oItem)
Next oItem
End Sub
Private Sub SaveAttachmentsToDisk(oItem As Outlook.MailItem)
'Declares objAtt as an outlook attachment
Dim objAtt As Attachment
'Declares i as data type Integer
Dim i As Integer
'Declares objFSO as any Data Type
Dim objFSO As Object
'Declares sExt as data type string
Dim sExt As String
'Declares sSaveFolder as data Type string
Dim sSaveFolder As String
'Only proceed if the email contains attachements.
If oItem.Attachments.Count > 0 Then
Set objFSO = CreateObject("Scripting.FileSystemObject")
'Cycle through each attachment on the email.
For i = 1 To oItem.Attachments.Count
Set objAtt = oItem.Attachments(i)
'Get the extension of the attached file name.
sExt = objFSO.GetExtensionName(objAtt.FileName)
'declares an Id used for file path routing
Dim id As Integer
'Checks the email attachment name for a string match. If a match occurs, assigns an ID used for file path routing
Select Case True
Case InStr(1, objAtt.DisplayName, "APP", vbTextCompare) > 0
id = "1"
Case InStr(1, objAtt.DisplayName, "B2B - Asset", vbTextCompare) > 0
id = "2"
Case InStr(1, objAtt.DisplayName, "B2B - Business", vbTextCompare) > 0
id = "3"
Case InStr(1, objAtt.DisplayName, "B2B Fair", vbTextCompare) > 0
id = "4"
Case InStr(1, objAtt.DisplayName, "BDL", vbTextCompare) > 0
id = "5"
Case Else
End Select
'Saves outlook attachment to 'sSaveFolder' declared path if file extension is 'pdf'
If sExt = "pdf" Then
'Saves attachment to related subfolder based on ID
Select Case id
Case "1"
sSaveFolder = "C:\Users\jkassels\Desktop\test\test1"
Case "2"
sSaveFolder = "C:\Users\jkassels\Desktop\test\test2"
Case "3"
sSaveFolder = "C:\Users\jkassels\Desktop\test\test3"
Case "4"
sSaveFolder = "C:\Users\jkassels\Desktop\test\test4"
Case "5"
sSaveFolder = "C:\Users\jkassels\Desktop\test\test5"
Case Else
sSaveFolder = "C:\Users\jkassels\Desktop\test"
End Select
objAtt.SaveAsFile sSaveFolder & objAtt.DisplayName
End If
Set objAtt = Nothing
Next i
Set objFSO = Nothing
End If
End Sub
我对你的代码进行了很多修改以清理一些东西:
id
,因为它似乎没有用处。为什么不跳过id
的分配并右转分配保存路径?Dim
在循环中。Dim
行都是声明,以及它们被声明为什么。如果有的话,如果您觉得有必要,可以使用'Declarations
启动该片段。此外,Select Case
很棒 - 但你不能使用Select Case
来评估True
。在您的场景中,If/ElseIf
语句就足够了:
Public Sub ProcessEmails()
Dim oItems As Outlook.Items
Dim oItem As Object
Set oItems = Session.GetDefaultFolder(olFolderInbox).Items
For Each oItem In oItems
If TypeName(oItem) = "MailItem" Then Call SaveAttachmentsToDisk(oItem)
Next oItem
End Sub
Private Sub SaveAttachmentsToDisk(oItem As Outlook.MailItem)
Dim objAtt As Attachment
Dim i As Integer
Dim objFSO As Object
Dim sExt As String
Dim sSaveFolder As String
'Only proceed if the email contains attachements.
If oItem.Attachments.Count > 0 Then
Set objFSO = CreateObject("Scripting.FileSystemObject")
For i = 1 To oItem.Attachments.Count
Set objAtt = oItem.Attachments(i)
sExt = objFSO.GetExtensionName(objAtt.Filename)
If sExt = "pdf" Then
If InStr(1, objAtt.DisplayName, "APP", vbTextCompare) > 0 Then
sSaveFolder = "C:\Users\jkassels\Desktop\test\test1\"
ElseIf InStr(1, objAtt.DisplayName, "B2B - Asset", vbTextCompare) > 0 Then
sSaveFolder = "C:\Users\jkassels\Desktop\test\test2\"
ElseIf InStr(1, objAtt.DisplayName, "B2B - Business", vbTextCompare) > 0 Then
sSaveFolder = "C:\Users\jkassels\Desktop\test\test3\"
ElseIf InStr(1, objAtt.DisplayName, "B2B Fair", vbTextCompare) > 0 Then
sSaveFolder = "C:\Users\jkassels\Desktop\test\test4\"
ElseIf InStr(1, objAtt.DisplayName, "BDL", vbTextCompare) > 0 Then
sSaveFolder = "C:\Users\jkassels\Desktop\test\test5\"
Else
sSaveFolder = "C:\Users\jkassels\Desktop\test\"
End If
objAtt.SaveAsFile sSaveFolder & objAtt.DisplayName
End If
Set objAtt = Nothing
Next i
Set objFSO = Nothing
End If
End Sub