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

时间:2013-10-31 16:03:50

标签: date outlook outlook-vba

我有一个模板,我每周发送一份报告,在四个不同的地方(正文中有三个,主题行中有一个)是一个对应于前一周的星期一的日期。 (基本上,这是我报告的那一周的“一周”日期,这始终是前一周。)

我想在光标所在的位置添加日期。 (如果我能以某种方式在模板中设置我想要添加日期的书签,那就更好了。)我已经做了很多关于插入文本的研究,并且我继续遇到与示例相同的两个问题我一直在寻找:

  1. 我可以编写一个宏来打开一条新消息并填充各个区域(主题行,正文等),但是我不能让那个宏只处理我已经拥有的消息开。

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

    Selection.TypeText Text:="Hello!"
    
  3. 这些方法都不适用于我。


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

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

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


    *编辑#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
    

    (您可能还会注意到我在日期格式中添加了-8。我认为如果我无法始终添加我正在寻找的确切日期,我至少可以将其关闭。)

4 个答案:

答案 0 :(得分:3)

这是一种快速简单的方法来替换电子邮件中的文本。我认为唯一的问题可能是计算星期一的日期。我会在一分钟内更新

Sub ReportProduction()
Dim myTemplate As Outlook.MailItem
    Set myTemplate = Application.CreateItemFromTemplate(Environ("Appdata") & _
        "\Microsoft\Templates\ReportProduction.oft")
    myTemplate.HTMLBody = Replace(myTemplate.HTMLBody, "xxxxxxxxxxxxxxx", Format(Now + DaysUntilMonday - 7, "MMMM dd, yyyy"))
    myTemplate.Subject = Replace(myTemplate.Subject, "xxxxxxxxxxxxxxx", Format(Now + DaysUntilMonday - 7, "MMMM dd, yyyy"))
    myTemplate.Display
    Set myTemplate = Nothing
End Sub

我采用了以下方法,因为它计算了未来星期一并使用它,这是我已经拥有的代码。 它使用如格式(现在+ DaysUntilMonday - 7,“MMMM dd,yyyy”)所以得到即将到来的星期一,然后减去7给你前一个星期一。可以对代码进行修改,以便一次性计算前一个星期一

Function DaysUntilMonday() As Integer
Dim currentDay As Integer
Dim retVal As Integer
currentDay = DatePart("w", DateTime.Now)
    If currentDay = vbSunday Then 'vbSunday 1 Sunday (default)
        retVal = 1
    ElseIf currentDay = vbMonday Then 'vbMonday 2 Monday
        retVal = 7
    ElseIf currentDay = vbTuesday Then 'vbTuesday 3 Tuesday
        retVal = 6
    ElseIf currentDay = vbWednesday Then 'vbWednesday 4 Wednesday
        retVal = 5
    ElseIf currentDay = vbThursday Then 'vbThursday 5 Thursday
        retVal = 4
    ElseIf currentDay = vbFriday Then 'vbFriday 6 Friday
        retVal = 3
    ElseIf currentDay = vbSaturday Then 'vbSaturday 7 Saturday
        retVal = 2
    End If
DaysUntilMonday = retVal
End Function

答案 1 :(得分:1)

由于移动性,我暂时无法发布准备好的代码,但我相信您可以通过两个提示自行解决: 对于格式问题,请使用.htmlbody而不是body 上周一使用datediff;从今天开始减去7天加上今天的werkday号码。

我希望这有帮助, 最大

答案 2 :(得分:0)

我还没有找到完美的答案,但我找到了一个非常可行的解决方案,所以我想我会分享它,以防将来有人遇到同样的问题。

首先,@ Sorceri要求查看我用来生成电子邮件的代码,所以这里是:

Sub ReportProduction()
Dim myTemplate As Outlook.MailItem
Set myTemplate = Application.CreateItemFromTemplate(Environ("Appdata") & _
    "\Microsoft\Templates\ReportProduction.oft")
myTemplate.Display
End Sub

就像我之前说的那样,它只是启动我提前创建的电子邮件模板。

现在我使用以下代码在正文中进行查找/替换(我刚刚找到并调整以适应我的需要):

Dim myInspector As Outlook.Inspector
Dim myObject As Object
Dim myItem As Outlook.MailItem
Dim myDoc As Word.Document
Dim mySelection As Word.Selection
Dim strItem, strGreeting As String

Set myInspector = Application.ActiveInspector
Set myObject = myInspector.CurrentItem

'The active inspector is displaying a mail item.
If myObject.MessageClass = "IPM.Note" And myInspector.IsWordMail = True Then
    Set myItem = myInspector.CurrentItem
    'Grab the body of the message using a Word Document object.
    Set myDoc = myInspector.WordEditor
    myDoc.Range.Find.ClearFormatting
    Set mySelection = myDoc.Application.Selection
    With mySelection.Find
        .Text = "xxxxxxxxxxxxxxx"
        .Replacement.Text = Format(Now - 8, "MMMM dd, yyyy")
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    If mySelection.Find.Execute = True Then
        mySelection.Find.Execute Replace:=wdReplaceAll
    End If
End If

我觉得其中一些可能有点矫枉过正,但它运行得很完美。因为这只是在身体上进行查找/替换,所以我之后添加了以下内容来处理主题行。

Dim Insp As Inspector
Dim obj As Object

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

    obj.Subject = Replace(obj.Subject, "xxxxxxxxxxxxxxx", _
        Format(Now - 8, "MMMM dd, yyyy"))

    Set obj = Nothing
    Set Insp = Nothing

它并不完美,我确信它可以以某种方式进行优化,以便第一个查找/替换处理正文和主题行,但我对结果非常满意。

我只是希望我更了解日期格式,以便我可以让它进入前一周的星期一,而不是仅仅计算八天。

答案 3 :(得分:-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

我还需要添加以下功能:

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