Outlook的自定义主题行

我正在自动化一个Excel数据库,所以通过点击一个button,macros将自动发送一封电子邮件,使用电子邮件,主题和正文为特定的行条目。

在这里输入图像说明

例如,我想按下button,macros自动发送电子邮件到填充红色的单元格到他们各自的电子邮件与自定义主题。

我在网上发现了一些代码,一旦按下,就会发送一封自动发送的邮件。 但是,主题行不是自定义的。

这是我现在正在处理的代码:

Sub SendReminderMail() Dim OutLookApp As Object Dim OutLookMailItem As Object Dim iCounter As Integer Dim MailDest As String Dim SUBJECT As String Set OutLookApp = CreateObject("Outlook.application") Set OutLookMailItem = OutLookApp.CreateItem(0) With OutLookMailItem .SUBJECT = "" For iCounter = 1 To WorksheetFunction.CountA(Columns(4)) If SUBJECT = "" And Cells(iCounter, 4).Offset(0, -1) = "Send Reminder" Then .SUBJECT = Cells(iCounter, 6).Value ElseIf SUBJECT <> "" And Cells(iCounter, 4).Offset(0, -1) = "Send Reminder" Then SUBJECT = SUBJECT & ";" & Cells(iCounter, 6).Value End If Next iCounter MailDest = "" For iCounter = 1 To WorksheetFunction.CountA(Columns(4)) If MailDest = "" And Cells(iCounter, 4).Offset(0, -1) = "Send Reminder" Then MailDest = Cells(iCounter, 4).Value ElseIf MailDest <> "" And Cells(iCounter, 4).Offset(0, -1) = "Send Reminder" Then MailDest = MailDest & ";" & Cells(iCounter, 4).Value End If Next iCounter .BCC = MailDest .Body = "Reminder: Time to contact this firm" .Send End With Set OutLookMailItem = Nothing Set OutLookApp = Nothing End Sub 

目前我遇到的问题是:

  1. 电子邮件发送到正确的电子邮件地址,但主题总是在第6行的主题 – “提醒电子邮件安德鲁”。 它不会更改为其他联系人。 我需要每个电子邮件更改每个不同的联系人的主题。

  2. 我注意到,如果我有不同的联系人姓名,但他们列在同一个电子邮件地址下,那么这个macros只会通过电子邮件发送给第一个具有相同电子邮件的条目,而不是第二个。

任何帮助表示赞赏。 谢谢

所以很想留下评论,但仍有可能会错过XD

 Sub SendReminderMail() Dim OutLookApp As Object Dim OutLookMailItem As Object Dim lastRow As Long Dim iCounter As Long Dim MailDest As String Dim subj As String lastRow = ThisWorkbook.WorkSheets("Sheet6").Cells(Rows.Count, "D").End(xlUp).Row 'change worksheet For iCounter = 2 To lastRow Set OutLookApp = CreateObject("Outlook.application") Set OutLookMailItem = OutLookApp.CreateItem(0) With OutLookMailItem subj = "" MailDest = "" If Cells(iCounter, 3) = "Send Reminder" Then subj = Cells(iCounter, 6).Value MailDest = Cells(iCounter, 4).Value .BCC = MailDest .SUBJECT = subj .Body = "Reminder: Time to contact this firm" .Send End If End With Next iCounter End Sub 

我相信你正在寻找这一行之间的一切:

With OutLookMailItem

和这一行

End With

为电子表格中的每一行运行ONCE,对吗? 对于每个单独的行,如果在Cells(iCounter,4)有“发送提醒”文本,则需要将电子邮件发送给该人员。

如果是这样的话 – 这是永远不会发生的,因为你遍历这个代码从1到6

 For iCounter = 1 To WorksheetFunction.CountA(Columns(4)) If SUBJECT = "" And Cells(iCounter, 4).Offset(0, -1) = "Send Reminder" Then .SUBJECT = Cells(iCounter, 6).Value ElseIf SUBJECT <> "" And Cells(iCounter, 4).Offset(0, -1) = "Send Reminder" Then SUBJECT = SUBJECT & ";" & Cells(iCounter, 6).Value End If 

在执行此代码之前:

.Send

这就是为什么你的.SUBJECT总是“提醒给安德鲁电子邮件”。 这 “提醒给Ner发电子邮件”,但被“提醒给Roo发送电子邮件”覆盖,被“提醒给Andrew发送提醒”覆盖。

我把你的代码复制到VBA中,然后为自己运行,我不确定它是如何工作的,因为我无法运行它。

如果我上面的build议不是你想要做的,那么你的问题可能在于你没有使用a . 在您的ElseIf声明中的SUBJECT之前:

 For iCounter = 1 To WorksheetFunction.CountA(Columns(4)) If SUBJECT = "" And Cells(iCounter, 4).Offset(0, -1) = "Send Reminder" Then .SUBJECT = Cells(iCounter, 6).Value ElseIf SUBJECT <> "" And Cells(iCounter, 4).Offset(0, -1) = "Send Reminder" Then SUBJECT = SUBJECT & ";" & Cells(iCounter, 6).Value '^ period here End If Next iCounter 

如果你真的想要创buildOutlookMailItem.SUBJECT属性,你需要在它之前放一段时间,因为你想引用.SUBJECTOutlookMailItem的属性,而不是variablesSUBJECT (这是很混淆btw)。

其他一些说明:

您的For循环不需要从1开始,因为这是您的标题行。 未来可能会更容易做到这样的事情:

 lastRow = Range("D" & Rows.Count).End(xlUp).Row For iCounter = 2 to lastRow step 1 '/ VBA will iterate through each row until it hits the end '/ Assuming column D has data in it to your actual "last row" Next iCounter 

使用F8来遍历你的代码。 打开你的本地窗口,并观察每一步你的variables发生了什么。 将光标hover在黄线或任何以前的行上,以查看当前的variables/函数或之前的行完成执行的内容。

特别注意你的主题variables。

这一点也可能没有做你想做的事情:

 For iCounter = 1 To WorksheetFunction.CountA(Columns(4)) 

如果我把它放到一个电子表格中,列A到J的一堆值,然后运行:

 Sub testing() Dim X X = WorksheetFunction.CountA(Columns(4)) End Sub 

X是0我怀疑你想要在列D中的值的最后一行。

 Sub lastrow() Dim X X = Worksheets("Sheet1").Cells(Rows.Count, "D").End(xlUp).Row End Sub 

这给了我19.在列D中的最后一个单元格的值。 你不想计数或计数,因为它不会计算空白。 所以你可能有20行的数据,但是如果只有5行在D列中有一个值,你的循环将会经历5次,因为你把它的值从单元格中取出,而不是行。

主要的是,如果你要定期做这些,那么在F8和你的View / Locals窗口中进行操作,你就会开始看到出错的地方。

然后,在你尝试修改一个更大的复杂块之前,让一个非常简单的子代码,直到你理解它为止。 这会帮助你学会钓鱼。

我没有前景,所以我不能testing你的代码的其余部分,但是即使其他所有东西都是完美的,这个块也会给你带来麻烦。