根据两个工作簿中的 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 = "..." & 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 值发送电子邮件提醒的主要内容,如果未能解决你的问题,请参考以下文章
在 VBA 中使用 SQL 连接两个 Excel 工作簿中的数据(只读错误)