如何在Excel Online(Office 365)中按指定日期8点触发邮件发送
解决方案:Excel Online(OneDrive共享)定时触发邮件提醒
注意:Excel Online本身不支持VBA自动定时触发
在线版Excel没有后台运行VBA的环境,无法直接通过VBA实现每天自动检查日期并发送邮件,推荐用Power Automate(微软流)实现云端自动化,或者使用桌面版Excel配合VBA(需保持工作簿打开)。
方案一:Power Automate(云端自动触发,推荐)
这是适合OneDrive共享Excel Online的最佳方案,无需依赖本地Excel:
- 打开Power Automate,登录你的Office 365账号,创建计划云流。
- 设置触发条件:选择“每天”,时间设为上午8点(注意时区要选你所在的时区)。
- 添加动作:选择
Excel Online (Business)→列出表格行,配置:- 位置:选“OneDrive for Business”或“OneDrive”(根据你的存储位置)
- 文档库:找到共享工作簿所在的文件夹
- 文件:选择你的目标工作簿
- 表格:选择
reminders工作表(如果没转成表格,先在Excel里把A列数据转成结构化表格)
- 添加动作:
筛选数组,设置筛选规则:- 从
列出表格行的输出中选择date列 - 运算符选“等于”
- 右侧输入表达式:
formatDateTime(utcNow(), 'yyyy-MM-dd')(把UTC时间转成本地日期格式,和你Excel里的日期格式匹配)
- 从
- 添加条件动作:判断筛选后的数组是否不为空(即当天日期在列表中存在)。
- 如果条件成立,添加
Outlook→发送电子邮件(V2)动作,填写收件人、主题、正文,和你原VBA代码的内容一致。 - 保存流,测试运行,之后每天上午8点会自动检查日期并发送邮件。
方案二:桌面版Excel配合VBA(需保持工作簿打开)
如果你会用桌面版Excel打开这个共享工作簿,可以用VBA的Application.OnTime实现定时触发,但需要保持Excel运行且电脑不休眠:
步骤1:修改VBA代码
- 打开桌面版Excel,打开目标工作簿,按
Alt+F11进入VBA编辑器。 - 双击
ThisWorkbook模块,粘贴以下代码(工作簿打开时设置定时):
Private Sub Workbook_Open() Dim triggerTime As Date triggerTime = Date + TimeValue("08:00:00") ' 若当前时间已过8点,设置为次日8点 If Now > triggerTime Then triggerTime = Date + 1 + TimeValue("08:00:00") End If ' 定时触发检查日期并发送邮件的过程 Application.OnTime triggerTime, "CheckAndSendEmail" End Sub
- 插入一个新的标准模块(右键插入→模块),粘贴以下代码:
Public Sub CheckAndSendEmail() Dim ws As Worksheet Dim lastRow As Long Dim i As Long Dim todayDate As Date Set ws = ThisWorkbook.Worksheets("reminders") lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row todayDate = Date ' 获取当天日期 ' 遍历A列日期(跳过表头,从第2行开始) For i = 2 To lastRow ' 匹配日期时发送邮件 If ws.Cells(i, "A").Value = todayDate Then SendEmailNow Exit For ' 找到匹配后退出循环,避免重复发送 End If Next i ' 设置次日的定时任务 Dim nextTriggerTime As Date nextTriggerTime = Date + 1 + TimeValue("08:00:00") Application.OnTime nextTriggerTime, "CheckAndSendEmail" End Sub Public Sub SendEmailNow() Dim EmailApp As Outlook.Application Set EmailApp = New Outlook.Application Dim NewEmailItem As Outlook.MailItem Set NewEmailItem = EmailApp.CreateItem(olMailItem) NewEmailItem.To = "to@company.com" NewEmailItem.Subject = "Here's your reminder" NewEmailItem.HTMLBody = "I am reminding you" NewEmailItem.Send ' 释放对象 Set NewEmailItem = Nothing Set EmailApp = Nothing End Sub
- 保存工作簿为
.xlsm格式(启用宏的工作簿)。
注意事项
- 必须保持该工作簿在桌面版Excel中打开,电脑不能休眠或关机,否则定时任务会失效。
- 若多人同时打开共享工作簿,可能会重复发送邮件,需额外添加防重复逻辑(比如在工作表中标记已发送)。
内容的提问来源于stack exchange,提问作者Kris
相关产品推荐
相关产品推荐

