如何设置具有动态日期的电子邮件模板,或者创建宏来插入日期?

Mik*_*ike 5 outlook vba date

我有一个每周发送的报告模板,在四个不同的位置(三个在正文中,一个在主题行)是与前一周的星期一相对应的日期。(基本上,这是我报告的那一周的“一周”日期,总是前一周。)

我想在光标所在的位置添加一个日期。(如果我能以某种方式在模板中为我想要添加日期的位置设置书签,那就更好了。)我已经对插入文本进行了大量研究,并且在我的示例中不断遇到相同的两个问题一直在发现:

  1. 我可以编写一个宏来打开一条新消息并填充各个区域(主题行、正文等),但我无法让该宏仅处理我已经打开的消息。

  2. 对于我尝试过的所有在我已经打开的消息上实际运行的示例,我只能让它向正文添加文本。我希望创建一些简单的东西,就像 Word 所做的那样:

    Selection.TypeText Text:="Hello!"
    
    Run Code Online (Sandbox Code Playgroud)

这些方法对我来说都不起作用。


*编辑#1:当然,在我发布此内容后,我发现我找到的解决方案之一只是将文本添加到光标所在的位置,现在可以工作。

TypeName(Application.ActiveWindow) = "Inspector" Then
    SendKeys Format(Now, "MMMM dd, yyyy")
    DoEvents
End If
Run Code Online (Sandbox Code Playgroud)

如果我坚持这种方法,我只需要知道如何设置它,以便插入前一周星期一的日期,而不是今天的日期(我并不总是在同一天运行报告,所以我可以不仅仅是告诉它做一些简单的事情,比如从今天的日期中减去八天)。我还想知道是否可以告诉它通过执行查找/替换之类的操作将该日期插入到多个位置。


*编辑#2:我还遇到了一个快速查找/替换主体的不错的例子。它唯一的问题是它完全去除了所有格式,包括表格、颜色等。

Dim Insp As Inspector
Dim obj As Object

    Set Insp = Application.ActiveInspector
    Set obj = Insp.CurrentItem

    obj.Body = Replace(obj.Body, "xxxxxxxxxx", Format(Now - 8, "MMMM dd, yyyy"))

    Set obj = Nothing
    Set Insp = Nothing
Run Code Online (Sandbox Code Playgroud)

(您可能还注意到我-8在日期格式中添加了 a 。我想如果我不能让它始终添加我正在寻找的确切日期,我至少可以让它接近。)

Mik*_*ike -1

我终于弄清楚了如何插入我需要的确切日期,并将其简化为一个简单的宏,该宏打开模板并将正文和主题行中的日期更改为前一周星期一的日期。由于这个解决方案完成了我最初想要完成的所有任务,因此我认为我应该创建一个新的答案。我担心删除或编辑以前的答案,因为有人可能仍然发现它的信息有用。话不多说,这是我现在使用的代码:

Sub ReportProduction()
Dim StartDay_of_LastWeek As String
Dim Insp As Inspector
Dim obj As Object
Dim myTemplate As Outlook.MailItem
StartDay_of_LastWeek = Format(GetWeekStartDate(CDate(Now - 7), vbMonday), _
    "MMMM dd, yyyy")
Set myTemplate = Application.CreateItemFromTemplate(Environ("Appdata") _
    & "\Microsoft\Templates\ReportProduction.oft")

    myTemplate.Display

    Set Insp = Application.ActiveInspector
    Set obj = Insp.CurrentItem

    obj.HTMLBody = Replace(obj.HTMLBody, "xxxxxxxxxxxxxxx", StartDay_of_LastWeek)
    obj.Subject = Replace(obj.Subject, "xxxxxxxxxxxxxxx", StartDay_of_LastWeek)

    Set obj = Nothing
    Set Insp = Nothing

End Sub
Run Code Online (Sandbox Code Playgroud)

我还需要添加以下功能:

Function GetWeekStartDate(ByVal strDate, _
    Optional ByVal lngStartDay As Long = 2) As String
GetWeekStartDate = DateAdd("d", -Weekday(CDate(strDate), _
    lngStartDay) + 1, CDate(strDate))
End Function
Run Code Online (Sandbox Code Playgroud)