ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1380|回复: 1

[分享] OUTLOOK带附件回复

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-8-18 11:21 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 lx105834038 于 2021-8-18 15:36 编辑

OUTLOKK回复时我们经常想要直接把上一封的附件一起作为附件回复。
但是OUTLOOK只有转发才会带附件。虽然我们也可以通过把附件复制黏贴的方式完成带附件操作。
但是复制还要多操作几下,尤其如果附件比较多的话就更加麻烦了。
网上找了一段代码,一键完成带附件回复。
原代码:https://www.doc88.com/p-9903959852874.html?r=1

但是运行时发现回复的附件会把之前邮件的图片一起当作附件,这怎么可以呢!
F8运行了一下,发现这些图片附件都被统一以“imageXXX”的形式命名,那就简单了加个IF就OK啦。

楼主OUTLOOK版本:LTSC
系统版本:win10
使用方法:ALT+F11→在工程处右键”插入“-”模块“→复制代码→保存。

提醒:如果运行不成功,请保存VBA后重启OUTLOOK,另外宏安全性请调整为最低。
  1. '带附件回复
  2. Sub ReplyWithAttachments()
  3. Dim rpl As Outlook.MailItem
  4. Dim itm As Object
  5. Set itm = GetCurrentItem()
  6. If Not itm Is Nothing Then
  7. Set rpl = itm.Reply
  8. CopyAttachments itm, rpl
  9. rpl.Display
  10. End If
  11. Set rpl = Nothing
  12. Set itm = Nothing
  13. End Sub
  14. '带附件回复所有
  15. Sub ReplyToAllWithAttachments()
  16. Dim rpl As Outlook.MailItem
  17. Dim itm As Object
  18. Set itm = GetCurrentItem()
  19. If Not itm Is Nothing Then
  20. Set rpl = itm.ReplyAll
  21. CopyAttachments itm, rpl
  22. rpl.Display
  23. End If
  24. Set rpl = Nothing
  25. Set itm = Nothing
  26. End Sub
  27. '获取主题名称
  28. Function GetCurrentItem() As Object
  29. Dim objApp As Outlook.Application
  30. Set objApp = Application
  31. On Error Resume Next
  32. Select Case TypeName(objApp.ActiveWindow)
  33. Case "Explorer"
  34. Set GetCurrentItem = objApp.ActiveExplorer.Selection.Item(1) '获取主题名称
  35. Case "Inspector"
  36. Set GetCurrentItem = objApp.ActiveInspector.CurrentItem '获取主题名称
  37. End Select
  38. Set objApp = Nothing
  39. End Function
  40. '复制附件
  41. Sub CopyAttachments(objSourceItem, objTargetItem)
  42. Set fso = CreateObject("Scripting.FileSystemObject")
  43. Set fldTemp = fso.GetSpecialFolder(2) ' TemporaryFolder
  44. strPath = fldTemp.Path & ""
  45. For Each objAtt In objSourceItem.Attachments
  46. If Left(objAtt, 5) = "image" Or Right(objAtt, 4) = ".jpg" Or Right(objAtt, 4) = ".png" Then
  47. GoTo down
  48. Else
  49. strFile = strPath & objAtt.FileName
  50. objAtt.SaveAsFile strFile
  51. objTargetItem.Attachments.Add strFile, , , objAtt.DisplayName
  52. fso.DeleteFile strFile
  53. End If
  54. down:
  55. Next
  56. Set fldTemp = Nothing
  57. Set fso = Nothing
  58. End Sub
复制代码



TA的精华主题

TA的得分主题

 楼主| 发表于 2021-8-19 12:40 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
上面的代码可能误判了图片附件。而且有时候我们可能只需要回复部分的附件。
所以在复制附件代码中进行优化,增加一个选择的界面。
主代码:
  1. '带附件回复
  2. Sub ReplyWithAttachments()
  3. Dim rpl As Outlook.MailItem
  4. Dim itm As Object
  5. Set itm = GetCurrentItem()
  6. If Not itm Is Nothing Then
  7. Set rpl = itm.Reply
  8. CopyAttachments itm, rpl
  9. rpl.Display
  10. End If
  11. Set rpl = Nothing
  12. Set itm = Nothing
  13. End Sub
  14. '带附件回复所有
  15. Sub ReplyToAllWithAttachments()
  16. Dim rpl As Outlook.MailItem
  17. Dim itm As Object
  18. Set itm = GetCurrentItem()
  19. If Not itm Is Nothing Then
  20. Set rpl = itm.ReplyAll
  21. CopyAttachments itm, rpl
  22. rpl.Display
  23. End If
  24. Set rpl = Nothing
  25. Set itm = Nothing
  26. End Sub
  27. '获取主题名称
  28. Function GetCurrentItem() As Object
  29. Dim objApp As Outlook.Application
  30. Set objApp = Application
  31. On Error Resume Next
  32. Select Case TypeName(objApp.ActiveWindow)
  33. Case "Explorer"
  34. Set GetCurrentItem = objApp.ActiveExplorer.Selection.Item(1) '获取主题名称
  35. Case "Inspector"
  36. Set GetCurrentItem = objApp.ActiveInspector.CurrentItem '获取主题名称
  37. End Select
  38. Set objApp = Nothing
  39. End Function
  40. '复制附件
  41. Sub CopyAttachments(objSourceItem, objTargetItem)
  42. Set fso = CreateObject("Scripting.FileSystemObject")
  43. Set fldTemp = fso.GetSpecialFolder(2) ' TemporaryFolder
  44. strPath = fldTemp.path & ""
  45. If MsgBox("本邮件附件个数:" & objSourceItem.Attachments.Count & ",是否添加所有附件回复?", vbYesNo) = vbYes Then
  46.         For i = 1 To objSourceItem.Attachments.Count
  47.               Set objAtt = objSourceItem.Attachments(i)
  48.               objAtt.SaveAsFile path & objAtt.FileName
  49.               strFile = strPath & objAtt.FileName
  50.               objAtt.SaveAsFile strFile
  51.               objTargetItem.Attachments.Add strFile, , , objAtt.DisplayName
  52.               fso.DeleteFile strFile
  53.         Next i
  54.     Else
  55.           UserForm1.Show

  56. For j = 0 To UserForm1.ListBox2.ListCount - 1
  57.       n = UserForm1.ListBox2.List(j)
  58.       For i = 1 To objSourceItem.Attachments.Count
  59.             Set objAtt = objSourceItem.Attachments(i)
  60.             If objAtt = n Then
  61.                Set objAtt = objSourceItem.Attachments(i)
  62.                objAtt.SaveAsFile path & objAtt.FileName
  63.                strFile = strPath & objAtt.FileName
  64.                objAtt.SaveAsFile strFile
  65.                objTargetItem.Attachments.Add strFile, , , objAtt.DisplayName
  66.                fso.DeleteFile strFile
  67.             End If
  68.       Next i
  69. Next j
  70. End If
  71. Set fldTemp = Nothing
  72. Set fso = Nothing
  73. End Sub
复制代码
UserForm1窗体代码:
  1. 'Listbox1项目全选
  2. Private Sub CheckBox1_Click()
  3. Dim i, j
  4. If CheckBox1 = True Then
  5.     For i = 0 To ListBox1.ListCount - 1
  6.           ListBox1.Selected(i) = True
  7.     Next i
  8. Else
  9.       For j = 0 To ListBox1.ListCount - 1
  10.           ListBox1.Selected(j) = False
  11.      Next j
  12. End If
  13. End Sub
  14. 'Listbox2项目全选
  15. Private Sub CheckBox3_Click()
  16. Dim i, j
  17. If CheckBox3 = True Then
  18.     For i = 0 To ListBox2.ListCount - 1
  19.           ListBox2.Selected(i) = True
  20.     Next i
  21. Else
  22.       For j = 0 To ListBox2.ListCount - 1
  23.             ListBox2.Selected(j) = False
  24.       Next j
  25. End If
  26. End Sub
  27. '剔除Listbox1图片附件
  28. Private Sub CheckBox2_Click()
  29. If CheckBox2 = True Then
  30.     For i = 0 To ListBox1.ListCount - 1
  31.           n = Right(ListBox1.List(i), 4)
  32.           If n = ".jpg" Or n = ".png" Or n = ".jepg" Then
  33.              ListBox1.Selected(i) = False
  34.           Else
  35.                 ListBox1.Selected(i) = True
  36.           End If
  37.     Next i
  38. Else
  39.       For j = 0 To ListBox1.ListCount - 1
  40.             n = Right(ListBox1.List(i), 4)
  41.             If n = ".jpg" Or n = ".png" Or n = ".jepg" Then
  42.                   ListBox1.Selected(j) = False
  43.             End If
  44.       Next j
  45. End If
  46. End Sub
  47. '剔除Listbox2图片附件
  48. Private Sub CheckBox4_Click()
  49. If CheckBox4 = True Then
  50.     For i = 0 To ListBox2.ListCount - 1
  51.           n = Right(ListBox2.List(i), 4)
  52.           If n = ".jpg" Or n = ".png" Or n = ".jepg" Then
  53.              ListBox2.Selected(i) = True
  54.           End If
  55.     Next i
  56. Else
  57.       For j = 0 To ListBox2.ListCount - 1
  58.             n = Right(ListBox2.List(j), 4)
  59.             If n = ".jpg" Or n = ".png" Or n = ".jepg" Then
  60.                ListBox2.Selected(j) = False
  61.             End If
  62.       Next j
  63. End If
  64. End Sub

  65. Private Sub CommandButton1_Click()
  66. UserForm1.hide
  67. End Sub

  68. Private Sub CommandButton2_Click()
  69. UserForm1.hide
  70. End Sub

  71. '选择要添加附件
  72. Private Sub CommandButton3_Click()
  73. Dim i, j
  74. A:
  75. Label3 = ListBox1.ListCount
  76. Label4 = ListBox2.ListCount
  77. For j = ListBox1.ListCount - 1 To 0 Step -1
  78.      If ListBox1.Selected(j) = True Then
  79.          ListBox2.AddItem ListBox1.List(j), 0
  80.          ListBox1.RemoveItem (j)
  81.          GoTo A
  82.      End If
  83. Next j
  84. End Sub
  85. '选择要移除附件
  86. Private Sub CommandButton4_Click()
  87. A:
  88. Label3 = ListBox1.ListCount
  89. Label4 = ListBox2.ListCount
  90. For j = ListBox2.ListCount - 1 To 0 Step -1
  91.      If ListBox2.Selected(j) = True = True Then
  92.          ListBox1.AddItem ListBox2.List(j), 0
  93.          ListBox2.RemoveItem (j)
  94.          GoTo A
  95.      End If
  96. Next j
  97. End Sub

  98. Private Sub UserForm_Initialize()
  99. Dim objApp As Outlook.Application
  100. Set objApp = Application
  101. On Error Resume Next
  102. Select Case TypeName(objApp.ActiveWindow)
  103. Case "Explorer"
  104. Set Item = objApp.ActiveExplorer.Selection.Item(1) '获取主题名称
  105. Case "Inspector"
  106. Set Item = objApp.ActiveInspector.CurrentItem  '获取主题名称
  107. End Select
  108. Set objApp = Nothing
  109. Label2 = "邮件主题:" & vbclf & Item
  110. Dim olAtt As Attachment
  111. Dim i As Integer
  112. i = Item.Attachments.Count
  113. Label3 = i
  114. Label4 = 0
  115. With ListBox
  116.         For j = 1 To i
  117.              Set olAtt = Item.Attachments(j)
  118.              ListBox1.AddItem olAtt, 0
  119.         Next j
  120. End With
  121. ListBox1.ListIndex = 0
  122. End Sub
复制代码


选择界面

选择界面

OUTLOOK-VBA-选择需求附件回复.rar

2.9 KB, 下载次数: 13

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-4 01:31 , Processed in 0.041050 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表