用于从Outlook保存电子邮件的宏 - 发件人名称查询

时间:2016-05-25 08:48:57

标签: vba email outlook outlook-vba

因此,我所工作的组织要求所有项目或任务相关的电子邮件,作为正式流程的一部分,以特定的名称格式保存:

YYMMDD-HHMM-发送者姓名-RECIPIENTNAME-Subject.msg

我们不允许出于某种原因使用.pst文件,因为你可以想象,单独这样做是极端繁琐的,而且我很懒,所以我决定尝试使用一个有用的宏来自动执行此操作。一些密集的谷歌搜索让我在一个名为slipstick的网站的帮助下创建了以下内容:

Option Explicit
Public Sub SaveMessageAsMsg()
  Dim oMail As Outlook.MailItem
  Dim objItem As Object
  Dim sPath As String
  Dim dtDate As Date
  Dim sName As String
  Dim enviro As String
  Dim strFolderpath As String


    enviro = CStr(Environ("USERPROFILE"))
strFolderpath = "DESKTOP LOCATION HERE"

   For Each objItem In ActiveExplorer.Selection
   If objItem.MessageClass = "IPM.Note" Then
    Set oMail = objItem

  sName = oMail.Subject
  ReplaceCharsForFileName sName, "-"

  dtDate = oMail.ReceivedTime
  sName = Format(dtDate, "yyyymmdd", vbUseSystemDayOfWeek, _
    vbUseSystem) & Format(dtDate, "-hhnn", _
    vbUseSystemDayOfWeek, vbUseSystem) & "-" & sName & ".msg"

  sPath = strFolderpath & "\"
  Debug.Print sPath & sName
  oMail.SaveAs sPath & sName, olMSG

  End If
  Next

End Sub

Private Sub ReplaceCharsForFileName(sName As String, _
  sChr As String _
)
  sName = Replace(sName, "'", sChr)
  sName = Replace(sName, "*", sChr)
  sName = Replace(sName, "/", sChr)
  sName = Replace(sName, "\", sChr)
  sName = Replace(sName, ":", sChr)
  sName = Replace(sName, "?", sChr)
  sName = Replace(sName, Chr(34), sChr)
  sName = Replace(sName, "<", sChr)
  sName = Replace(sName, ">", sChr)
  sName = Replace(sName, "|", sChr)
End Sub

非常高兴地将选定的电子邮件保存在桌面上的文件夹中(以便在其他地方移动),格式为

YYYYMMDD-HHMM-Subject.msg

尽我所能,但我似乎也无法将发件人的名字带到那里。我尝试过使用

Dim sSenderName As String

Dim sSenderEmailAddress As String

在宏的创建文件名的部分添加适当的添加:

sName = Format(dtDate, "yyyymmdd", vbUseSystemDayOfWeek, _
        vbUseSystem) & Format(dtDate, "-hhnn", _
        vbUseSystemDayOfWeek, vbUseSystem) & "-" *& EXTRA BIT HERE* & "-" & sName & ".msg

但所有这些似乎都是在我的最终文件名中添加一个额外的连字符。

注意我并不打算将收件人添加到文件名中,任何包含多个食谱的东西都会将其发送到字符限制之外。

那么,我做错了什么?我是VBA的全新人,非常喜欢这个小项目,所以我很想知道我在哪里犯规。在我的辩护中,我是一名机械工程师,我很确定用锤子击打我的宏不会有帮助。

我正在考虑尝试写一些会产生一些弹出窗口的东西,让我在保存电子邮件之前填写相关信息,但这可能比我现在有点远。在我跑步之前必须走路。

感谢所有提示和评论。

1 个答案:

答案 0 :(得分:1)

如果您使用的是Dim sSenderEmailAddress As String而没有将其设置为任何可能导致双连字符的原因 - 它是空的。

尝试包括:

Dim sSenderEmailAddress As String
sSenderEmailAddress = oMail.SenderEmailAddress
在创建文件名之前

sName = Format(dtDate, "yyyymmdd", vbUseSystemDayOfWeek, _
        vbUseSystem) & Format(dtDate, "-hhnn", _
        vbUseSystemDayOfWeek, vbUseSystem) & "-" & sSenderEmailAddress & "-" & sName & ".msg

如果您愿意,您也应该能够以这种方式使用SenderName,尽管您可能仍然最好通过您的函数运行它来删除某些字符。