根据两个工作簿中的 Excel 值发送电子邮件提醒

Posted

技术标签:

【中文标题】根据两个工作簿中的 Excel 值发送电子邮件提醒【英文标题】:Send email reminders based on Excel values in two workbooks 【发布时间】:2019-08-13 18:26:51 【问题描述】:

我正在尝试在任何特定培训到期日期后 45 天内向员工发送自动电子邮件,而无需打开文件来运行宏(如果可能)。此外,如果每次训练都没有电子邮件预览,因为每次运行宏时可能会弹出数百个。

我想从我的某一列中的值中提取确定电子邮件正文的培训名称。

我想从一个单独的 Excel 文件中提取到期日期,该文件是培训日期的记录。

我设法在到期日期后 45 天内将培训的电子邮件预览排入队列,但是代码允许 Excel 发送有关已到期培训的提醒。

我希望 Excel 在达到到期日期后停止。我尝试过:If mydate2 - datetoday2 <= 45 Then。这可行,但会向不活跃的员工发送电子邮件,但在培训记录文件中仍有他们的培训记录。

我尝试从列中提取培训名称,并让它们自动填充到电子邮件正文中。例如,电子邮件将显示“因过期而培训:”,然后让 excel 根据第 4 列中的值填写培训名称。

Sub datesexcelvba()
Dim myapp As Outlook.Application, mymail As Outlook.MailItem

Dim mydate1 As Date
Dim mydate2 As Long
Dim datetoday1 As Date
Dim datetoday2 As Long

Dim x As Long
lastrow = Sheets("sheet1").Cells(Rows.Count, 1).End(xlUp).Row

For x = 2 To lastrow

    mydate1 = Cells(x, 5).Value
    mydate2 = mydate1

    Cells(x, 11).Value = mydate2

    datetoday1 = Date
    datetoday2 = datetoday1

    Cells(x, 12).Value = datetoday2

    If mydate2 - datetoday2 <= 45 Then

        Set myapp = New Outlook.Application
        Set mymail = myapp.CreateItem(olMailItem)
        mymail.To = Cells(x, 6).Value

        With mymail
            .Subject = "Training Expiration Reminder"
            .Body = "Please contact your supervisor to enroll in the next possible recertification class. Training Expiring:" value=x3

            .Display
            '.send
        End With

        Cells(x, 7) = "REMINDER SENT"
        Cells(x, 7).Font.Bold = True

        Cells(x, 13).Value = mydate2 - datetoday2

    End If
Next

Set myapp = Nothing
Set mymail = Nothing
End Sub

【问题讨论】:

.Body = "..." value=x3 必须是 .Body = "..." &amp; cells(x,3).value,或与您的上下文相似。 Cyril 谢谢你,效果很好,我只需将它添加到那行代码的末尾,这是一个相当无缝的添加。非常感谢。 不要贪心,但你对我正在尝试的更大规模编码有什么建议吗?也许只是一些好的链接或关键字我可以自己研究一下?再说一次,我在编码方面相当无能……说真的,谢谢你的上述评论。 【参考方案1】:

发表评论作为答案,以便可以将其列为已回答

.Body = "..." value=x3 

需要

.Body = "..." & cells(x,3).value

,或类似于您的上下文。


关于提示/要点的问题,不要害怕划分代码,这样更容易处理这些部分。

您的代码有 2 或 3 个部分,您可以执行以下操作来调用不同的部分:

Public Sub execute()
    If ActiveSheet.name <> "SQDC" Then Exit Sub
    With Application
        .ScreenUpdating = False
        .DisplayAlerts = False
        .Calculation = xlManual
    End With
    '''
    task_one
    task_two
    task_three
    '''
    With Application
        .ScreenUpdating = True
        .DisplayAlerts = True
        .Calculation = xlAutomatic
    End With
End Sub

关于来回使用 Outlook 和 Excel,请将您的关键项目保存为变量,以便 Outlook 无需搜索单元格引用即可执行所需操作。

'at the top of the module, outside of the subroutine:
public email_address as string, employ_name as string

'where If mydate2 - datetoday2 <= 45 Then is TRUE
email_address = cells(x,6).value
employ_name = cells(x,3).value

然后您可以在代码的电子邮件部分中使用它们。假设您将 Excel 活动与 Outlook 活动区分开来,因此全局变量在那里,因此您可以在一个子例程中定义它们并在另一个子例程中使用它们。


帮助我在 VBA 中变得平庸的一件事是阅读其他人的问题并尝试回答它们(即使只是在你的脑海中),通过找到正确的术语等。最终你将有足够的知识来挣扎与他们中最好的人一起!

【讨论】:

以上是关于根据两个工作簿中的 Excel 值发送电子邮件提醒的主要内容,如果未能解决你的问题,请参考以下文章

python 从Excel工作簿中的所有电子表格创建CSV

VBA - 在工作簿中调整单元格范围以发送电子邮件

在 VBA 中使用 SQL 连接两个 Excel 工作簿中的数据(只读错误)

Python操作Excel之根据一个工作簿中的内容修改另一个中作簿

xlam Excel 插件是不是可以覆盖工作簿中的子项?

如何使用 SQL Server 通过电子邮件发送包含查询结果的 Excel 工作簿