Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 将附件保存到outlook中的文件夹并重命名_Vba_Outlook - Fatal编程技术网

Vba 将附件保存到outlook中的文件夹并重命名

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

我正在尝试将outlook附件保存到一个文件夹中,如果文件名已经存在,请使用其他名称保存较新的文件,以免保存到现有文件上……如果存在“v2”,可能只需提供扩展名“v2”甚至“v3”

我找到了这个答案,但是我发现更新的文件保存在现有文件之上

我使用了下面的代码

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”处收到“编译错误”