Vba 将附件保存到outlook中的文件夹并重命名
我正在尝试将outlook附件保存到一个文件夹中,如果文件名已经存在,请使用其他名称保存较新的文件,以免保存到现有文件上……如果存在“v2”,可能只需提供扩展名“v2”甚至“v3” 我找到了这个答案,但是我发现更新的文件保存在现有文件之上 我使用了下面的代码Vba 将附件保存到outlook中的文件夹并重命名,vba,outlook,Vba,Outlook,我正在尝试将outlook附件保存到一个文件夹中,如果文件名已经存在,请使用其他名称保存较新的文件,以免保存到现有文件上……如果存在“v2”,可能只需提供扩展名“v2”甚至“v3” 我找到了这个答案,但是我发现更新的文件保存在现有文件之上 我使用了下面的代码 Dim objAttachments As Outlook.Attachments Dim objSelection As Outlook.Selection Dim i As Long Dim lngCount As Long Dim
Dim objAttachments As Outlook.Attachments
Dim objSelection As Outlook.Selection
Dim i As Long
Dim lngCount As Long
Dim strFile As String
Dim strFolderpath As String
Dim strDeletedFiles As String
' Get the path to your My Documents folder
strFolderpath = "C:\Users\Owner\my folder is here"
On Error Resume Next
' Instantiate an Outlook Application object.
Set objOL = CreateObject("Outlook.Application")
' Get the collection of selected objects.
Set objSelection = objOL.ActiveExplorer.Selection
' Set the Attachment folder.
strFolderpath = strFolderpath & "\my subfolder is here\"
' Check each selected item for attachments. If attachments exist,
' save them to the strFolderPath folder and strip them from the item.
For Each objMsg In objSelection
' This code only strips attachments from mail items.
' If objMsg.class=olMail Then
' Get the Attachments collection of the item.
Set objAttachments = objMsg.Attachments
lngCount = objAttachments.Count
strDeletedFiles = ""
If lngCount > 0 Then
' We need to use a count down loop for removing items
' from a collection. Otherwise, the loop counter gets
' confused and only every other item is removed.
For i = lngCount To 1 Step -1
' Save attachment before deleting from item.
' Get the file name.
strFile = objAttachments.Item(i).FileName
' Combine with the path to the Temp folder.
strFile = strFolderpath & strFile
' Save the attachment as a file.
objAttachments.Item(i).SaveAsFile strFile
' Delete the attachment.
objAttachments.Item(i).Delete
'write the save as path to a string to add to the message
'check for html and use html tags in link
If objMsg.BodyFormat <> olFormatHTML Then
strDeletedFiles = strDeletedFiles & vbCrLf & "<file://" & strFile & ">"
Else
strDeletedFiles = strDeletedFiles & "<br>" & "<a href='file://" & _
strFile & "'>" & strFile & "</a>"
End If
'Use the MsgBox command to troubleshoot. Remove it from the final code.
'MsgBox strDeletedFiles
Next i
' Adds the filename string to the message body and save it
' Check for HTML body
If objMsg.BodyFormat <> olFormatHTML Then
objMsg.Body = vbCrLf & "The file(s) were saved to " & strDeletedFiles & vbCrLf & objMsg.Body
Else
objMsg.HTMLBody = "<p>" & "The file(s) were saved to " & strDeletedFiles & "</p>" & objMsg.HTMLBody
End If
objMsg.Save
End If
Next
ExitSub:
Set objAttachments = Nothing
Set objMsg = Nothing
Set objSelection = Nothing
Set objOL = Nothing
End Sub
Dim objaattachments作为Outlook.Attachments
Dim objSelection作为Outlook.Selection
我想我会坚持多久
暗计数等于长
作为字符串的Dim strFile
将strFolderpath设置为字符串
将strDeletedFile设置为字符串
'获取“我的文档”文件夹的路径
strFolderpath=“C:\Users\Owner\my folder在此”
出错时继续下一步
'实例化Outlook应用程序对象。
Set objOL=CreateObject(“Outlook.Application”)
'获取选定对象的集合。
设置objSelection=objOL.ActiveExplorer.Selection
'设置附件文件夹。
strFolderpath=strFolderpath&“我的子文件夹在这里”
'检查每个选定项目的附件。如果存在附件,
'将它们保存到strFolderPath文件夹并从项目中删除。
对于objSelection中的每个objMsg
'此代码仅从邮件项目中删除附件。
'如果objMsg.class=olMail,则
'获取项目的附件集合。
设置objAttachments=objMsg.Attachments
lngCount=objAttachments.Count
strDeletedFiles=“”
如果lngCount>0,则
“我们需要使用倒计时循环来删除项目
“从一个集合中。否则,循环计数器将
“混乱,只有其他项目被删除。
对于i=lngCount到1步骤-1
'在从项目中删除之前保存附件。
'获取文件名。
strFile=objAttachments.Item(i).FileName
'与临时文件夹的路径合并。
strFile=strFolderpath&strFile
'将附件另存为文件。
objAttachments.Item(i).SaveAsFile strFile
'删除附件。
附件。第(i)项。删除
'将另存为路径写入要添加到消息的字符串
'检查html并在链接中使用html标记
如果objMsg.BodyFormat olFormatHTML,则
strDeletedFiles=strDeletedFiles&vbCrLf&“
其他的
strDeletedFiles=strDeletedFiles&“
”&”
如果结束
'使用MsgBox命令进行故障排除。将其从最终代码中删除。
'MsgBox strDeletedFiles
接下来我
'将文件名字符串添加到消息正文并保存它
'检查HTML正文
如果objMsg.BodyFormat olFormatHTML,则
objMsg.Body=vbCrLf&“文件已保存到”&strDeletedFiles&vbCrLf&objMsg.Body
其他的
objMsg.HTMLBody=“”和“文件已保存到”&strDeletedFiles&“”&objMsg.HTMLBody
如果结束
objMsg.Save
如果结束
下一个
进出口银行:
Set objAttachments=Nothing
设置objMsg=Nothing
Set objSelection=Nothing
Set objOL=无
端接头
我对vba比较陌生,所以可能有解决方案,但我看不到 看看下面我的代码。它遍历特定Outlook文件夹(您指定的)中的所有项目,遍历每个项目中的每个附件,并将附件保存在指定的文件路径中
'Establish path of folder you want to save to
Dim FilePath As Variant
FilePath = "C:\Users\Owner\my folder is here\my subfolder is here\"
Set FSOobj = CreateObject("Scripting.FilesystemObject")
'If path doesn't exist, create it. If it does, either do nothing or delete its contents
If FSOobj.FolderExists(FilePath) = False Then
FSOobj.CreateFolder FilePath
Else
' This code is if you want to delete the items in the existing folder first.
' It's not necessary for your case.
On Error Resume Next
Kill FilePath & "*.*"
On Error GoTo 0
End If
'Establish Outlook folders, attachments, and other items
Dim msOutlook As Outlook.NameSpace 'Establish Outlook NameSpace
Dim Folder As Outlook.MAPIFolder 'Establish Folder as a MAPIFolder
Dim messageAttachments As Outlook.Attachments
Set msOutlook = Application.GetNamespace("MAPI")
'Set the folder that contains the email with the attachment
Set Folder = msOutlook.GetDefaultFolder(olFolderInbox).Folders("FOLDER NAME HERE")
Set folderItems = Folder.Items
Dim folderItemsCount As Long
folderItemsCount = folderItems.Count
Dim number as Integer
number = 1
For i = 1 To folderItemsCount
'If you want to pull the attachments on some criteria, like the Subject of the email or
'the date received, you need to write an IF statement like:
'If InStr(Folder.Items(i).Subject, "SPECIFIC SUBJECT TEXT") Then
Set messageAttachments = folderItems.item(i).Attachments
lngCount = messageAttachments.Count 'This lets you pull more than one attachment per message
For thisAttachment = 1 To lngCount
messageAttachments.item(thisAttachment).SaveAsFile FilePath & "YOUR_CHOSEN_FILENAME" & number & ".xlsx"
number = number + 1
Next thisAttachment
Next i
编辑 为了在删除附件后删除项目,您将使用与上述代码相同的代码,但您还将包括
folderItems.item(i).delete
。另外,由于您正在移动项目,我切换到在for
循环中向后循环,以免打乱您的迭代。我写在下面:
For i = folderItemsCount To 1 Step -1
'If you want to pull the attachments on some criteria, like the Subject of the email or
'the date received, you need to write an IF statement like:
'If InStr(Folder.Items(i).Subject, "SPECIFIC SUBJECT TEXT") Then
Set messageAttachments = folderItems.item(i).Attachments
lngCount = messageAttachments.Count 'This lets you pull more than one attachment per message
For thisAttachment = 1 To lngCount
messageAttachments.item(thisAttachment).SaveAsFile FilePath & "YOUR_CHOSEN_FILENAME" & number & ".xlsx"
number = number + 1
Next thisAttachment
folderItems.item(i).Delete
Next i
我希望这有帮助 看看下面我的代码。它遍历特定Outlook文件夹(您指定的)中的所有项目,遍历每个项目中的每个附件,并将附件保存在指定的文件路径中
'Establish path of folder you want to save to
Dim FilePath As Variant
FilePath = "C:\Users\Owner\my folder is here\my subfolder is here\"
Set FSOobj = CreateObject("Scripting.FilesystemObject")
'If path doesn't exist, create it. If it does, either do nothing or delete its contents
If FSOobj.FolderExists(FilePath) = False Then
FSOobj.CreateFolder FilePath
Else
' This code is if you want to delete the items in the existing folder first.
' It's not necessary for your case.
On Error Resume Next
Kill FilePath & "*.*"
On Error GoTo 0
End If
'Establish Outlook folders, attachments, and other items
Dim msOutlook As Outlook.NameSpace 'Establish Outlook NameSpace
Dim Folder As Outlook.MAPIFolder 'Establish Folder as a MAPIFolder
Dim messageAttachments As Outlook.Attachments
Set msOutlook = Application.GetNamespace("MAPI")
'Set the folder that contains the email with the attachment
Set Folder = msOutlook.GetDefaultFolder(olFolderInbox).Folders("FOLDER NAME HERE")
Set folderItems = Folder.Items
Dim folderItemsCount As Long
folderItemsCount = folderItems.Count
Dim number as Integer
number = 1
For i = 1 To folderItemsCount
'If you want to pull the attachments on some criteria, like the Subject of the email or
'the date received, you need to write an IF statement like:
'If InStr(Folder.Items(i).Subject, "SPECIFIC SUBJECT TEXT") Then
Set messageAttachments = folderItems.item(i).Attachments
lngCount = messageAttachments.Count 'This lets you pull more than one attachment per message
For thisAttachment = 1 To lngCount
messageAttachments.item(thisAttachment).SaveAsFile FilePath & "YOUR_CHOSEN_FILENAME" & number & ".xlsx"
number = number + 1
Next thisAttachment
Next i
编辑 为了在删除附件后删除项目,您将使用与上述代码相同的代码,但您还将包括
folderItems.item(i).delete
。另外,由于您正在移动项目,我切换到在for
循环中向后循环,以免打乱您的迭代。我写在下面:
For i = folderItemsCount To 1 Step -1
'If you want to pull the attachments on some criteria, like the Subject of the email or
'the date received, you need to write an IF statement like:
'If InStr(Folder.Items(i).Subject, "SPECIFIC SUBJECT TEXT") Then
Set messageAttachments = folderItems.item(i).Attachments
lngCount = messageAttachments.Count 'This lets you pull more than one attachment per message
For thisAttachment = 1 To lngCount
messageAttachments.item(thisAttachment).SaveAsFile FilePath & "YOUR_CHOSEN_FILENAME" & number & ".xlsx"
number = number + 1
Next thisAttachment
folderItems.item(i).Delete
Next i
我希望这有帮助 @A Taylor….感谢您的回复,但代码似乎无法运行。我在“设置messageAttachments.item(I).Attachments”步骤中遇到“编译错误”。我保存了您在新模块下发布的代码,只更改了文件夹的名称。我做错了什么?回到我发布的代码,是否更容易在附件保存到文件夹的位置添加“如果”步骤以检查现有文件名,如果已经存在,则添加变体。。e、 g“v2”?@b2001我的代码有一个错误。而不是
Set messageAttachments.item(i).Attachments
它将是:Set messageAttachments=folderItems.item(i).Attachments
希望这能解决它@b2011同样,在保存附件的文件名中添加一个“v2”也是一个好主意。您可以看到,我在文件名(即“File1.xlsx”)中包含了一个number=1
,然后每次保存时,我都在整数number
中添加了1。然后,当它再次保存时,它将保存为“File2.xlsx”。然而,你可以用任何你喜欢的方式来做这件事。@ATaylor……这似乎奏效了。非常感谢。如果我可以改进代码,那就是删除outlook邮件或附件。下次运行宏时,我会再次复制相同的附件。我使用的原始代码可以做到这一点……有没有办法合并类似的内容?谢谢你again@b2011然后,在先前设置DestFolder之后,您将使用:folderItems.item(i).Move DestFolder
。我在上面的原始帖子中编辑了我的代码来演示。@A Taylor…感谢您的回复,但代码似乎没有运行。我在“Set-messageAttachments.item(I).Attachmen”处收到“编译错误”