【问题标题】:How to create a time trigger that would send the mails every week如何创建每周发送邮件的时间触发器
【发布时间】:2019-03-13 15:33:12
【问题描述】:

我想请你帮个忙。如果单元格 (I3) 包含 txt "YES",我得到一个带有代码的电子表格,该代码会发送电子邮件。

基本上,如果单元格 (J3) 为空,则 (I3) 返回值“YES”,然后代码向单元格 (B3) 中的地址发送一封电子邮件,一旦完成,日期就会出现在单元格 (J3) 中(I3) 中的值变为“NO”。所以下一次代码知道不需要向特定的人发送电子邮件。

我得到了这个互联网代码。对代码进行了一些修改以适应 sheet1。我对此很陌生,请耐心等待。

在单元格 (C3) 我有开始日期,单元格 (H3) 是完成/到期日期。我希望我的电子表格能够在我不打开工作簿的情况下自动发送电子邮件。 我想要一个时间触发器,如果​​特定任务在 30 天内到期,并且如果每个星期一可以生成一封电子邮件,直到它达到 0 天,然后一封电子邮件过期 - 5。

不确定电池 (I3) 或 (J3) 是否仍在使用中。

我希望我清楚地解释了一切。

 Dim uRange
 Dim lRange
 Dim BCell As Range
 Dim iBody As String
 Dim iTo As String
 Dim iSubject As String
 Dim DaysOverdue

 Public Sub SetEmailParams()

 Set uRange = Sheet1.Range("I2")
 Set lRange = Sheet1.Range("I" & Rows.Count).End(xlUp)

 iBody = Empty
 iSubject = Empty
 iTo = Empty

 For Each BCell In Range(uRange, lRange)

 If BCell.Value = "YES" Then

 If DateDiff("d", Format(Now(), "dd/mm/yyyy"), Format(Range("G3"), 
"dd/mm/yyyy")) <= 0 Then

 DaysOverdue = DateDiff("d", Format(BCell.Offset(0, -6)), 
 Format(BCell.Offset(0, -1)))

 iTo = BCell.Offset(0, -7).Value
 iSubject = "Reminder"
 iBody = "The job assigned to you under this describtion - " & 
 BCell.Offset(0, -4) & " in the name of " & BCell.Offset(0, -3) & " for the 
 confirmation date of " & BCell.Offset(0, -1) & " is due " & DaysOverdue & " 
 days."

 SendEmail

 BCell.Offset(0, 1).Value = Now()

 End If

 End If

 Next BCell

 End Sub

 Private Sub SendEmail()

 Dim OutApp As Object
 Dim OutMail As Object
 Dim strbody As String

 Set OutApp = CreateObject("Outlook.Application")
 Set OutMail = OutApp.CreateItem(0)

 On Error Resume Next
 With OutMail
 .To = iTo
 .CC = ""
 .BCC = ""
 .Subject = iSubject
 .Body = iBody
 'You can add a file like this
 '.Attachments.Add ("C:\test.txt")
 .Send 'or use .Send to automatically send without displaying
 End With
 On Error GoTo 0

 Set OutMail = Nothing
 Set OutApp = Nothing

End Sub

【问题讨论】:

  • 如果您想在工作簿关闭时运行代码,那么您需要使用 Windows 任务计划程序之类的东西。 stackoverflow.com/questions/22771185/…
  • @Redas Valantina 您的 cmets 建议,由于公司政策,可能无法采用任务调度程序选项。在这种情况下,您可能需要考虑MailItem.DeferredDeliveryTime Property (Outlook)MailItem Object。然而,如果excel vbaOutlook instance 一起使用,它会简单得多,因为编程变得更简单。您没有计划每小时发送一次邮件,因此每天一次的Workbook_open 事件应该不是问题。如果您将所有任务移至Outlook VBA,它可能能够执行所有此类任务,但它将失去 Excel 的灵活性,因为Recipients 将基于标准。

标签: excel vba excel-formula


【解决方案1】:

要发送自动邮件,您可以使用SendInBlue API 或mail gun
要转换 Excel 工作表,请使用 sheetjs

希望对你有帮助

【讨论】:

  • 会看看。谢谢你的信息。
【解决方案2】:

您可以创建一个 BAT 文件,打开此工作簿,当工作簿打开时,运行读取所有单元格内容的 Auto_Open 宏。

在 ThisWorkbook 中写下这段代码:

Private Sub Workbook_Open()

    MsgBox "Welcome"

End Sub

这是我之前提到的BAT文件的一个例子:

1.- 打开记事本

2.- 写这个:

start Excel.exe "C:\Temporal\TEST.xlsm"

3.- 另存为 MyBat.bat

4.- 转到面板控制 --> 管理工具 --> 任务计划程序 --> 创建基本任务

5.- 设置你要执行这个bat文件的时间!

我希望这对你有用! 干杯!

【讨论】:

  • 嗨,劳尔,谢谢。我使用我工作的公司的计算机。所以,我没有这台笔记本电脑的管理员权限。无论如何非常感谢;)
  • 这意味着您无权从事您在此处描述的工作?
  • 不是真的,这是我自己的项目。试图为老年人制作一些不同的东西来用于我们正在进行的项目。我使用 Gsheets 完成了许多电子表格。但是这个想在 MS excel 中创建。只是我没有这台笔记本电脑的管理员权限,因为总部非常重视/高度重视计算机安全
【解决方案3】:

参考我的 cmets,下面给出了使用 Mail.DeferredDeliveryTime 的示例。 此示例在下周一早上 8 点发送每封带有特定主题的电子邮件。

Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
  Dim Mail As Outlook.MailItem
  If TypeOf Item Is Outlook.MailItem Then
    Set Mail = Item
    If Mail.Subject = "sample" Then
      Mail.DeferredDeliveryTime = GetNextWeekday(vbMonday) & " 08:00 AM"
    End If
  End If
End Sub

Private Function GetNextWeekday(ByVal DayOfWeek As VbDayOfWeek) As Date
  Dim diff As Long
  diff = DayOfWeek - Weekday(Date, vbSunday)
  If diff > 0 Then
    GetNextWeekday = DateAdd("d", diff, Date)
  Else
    GetNextWeekday = DateAdd("d", 7 + diff, Date)
  End If
End Function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    相关资源
    最近更新 更多