【问题标题】:Automatic e-mail with changes in the body - VBA带有正文更改的自动电子邮件 - VBA
【发布时间】:2017-07-09 19:38:12
【问题描述】:

我必须创建一个 VBA 来发送自动电子邮件(电子邮件正文将收件人链接到他负责的特定项目)。我遇到的问题是某个收件人(即放置在“TO”中)可以负责更多任务。我正在使用的 VBA 向每个任务发送电子邮件(即使该人负责更多)。如果发送包含所有任务的电子邮件大于 1,我该怎么做才能通过收件人计数。我真的需要你的帮助。

<PRE>Sub SendEMail()
Dim OutApp As Object
Dim OutMail As Object
Dim lastRow As Long
Dim Ebody As String
lastRow = ThisWorkbook.Worksheets("Sheet1").Cells(Rows.Count, "B").End(xlUp).Row
For i = 2 To lastRow
Ebody = "<FONT SIZE = 4 name = Arial>" & "Dear " & Cells(i, "A").Value          
& "<br>" _
& "<br>" _
& "Please note that the below mentioned projectd are in scope for reporting." & "<br>" _
& "<br>" _
& Cells(i, "C").Value & " - " & Cells(i, "E").Value & "<br>" _
& "xxxxx will investigate and action your notification according to priority and to ensure public safety." & "<br>" _
& "For further information, please phone xxxxx on 6111 and quote reference number:" & "<br>" _
& "Your original report can be seen below:" & "</Font>" & "<br>" _
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
With OutMail
.To = Cells(i, "B").Value
.Cc = Cells(i, "D").Value
.Subject = "Your Registration Code"
.HtmlBody = Ebody
.Attachments.Add "C:\Test\Document.docx"
.Attachments.Add "C:\Test\Document1.docx"
.SentOnBehalfOfName = "Financial@yahoo.com"
.Display
End With
Next
End Sub </pre>

【问题讨论】:

  • 我在这种情况下所做的,是重组数据,使每一行表示 1 封电子邮件,如果有重复的电子邮件,我将额外的任务添加到单元格中并用逗号分隔数据。然后我执行 instr(",", cell)> 0,然后将任务调整到一个数组中,然后在发送之前将它们循环到电子邮件中。
  • 非常感谢。如果您能帮助我编写代码,那将非常有用。
  • 好的,但我是否正确理解了您的问题?
  • 当前表结构:第 1 列:电子邮件地址,第 2 列:项目编号(即任务),第 3 列:项目名称。有时电子邮件地址重复。在这种情况下,VBA 只需为各个项目发送一封电子邮件(即第二列)。项目编号和项目名称必须插入电子邮件正文中的不同行(即像项目符号点一样)。
  • 是的,因此您需要创建一个附加列,如果该行不重复,则该列将为空白,而如果该行不为空白,则它应该包含两个项目,并用逗号分隔这些值。

标签: excel vba


【解决方案1】:
Sub Emailer()
    Dim OutApp As Object
    Dim OutMail As Object
    Dim cell As Range, y, sbody
    Dim eml As Worksheet, bd As Worksheet
    Dim underlyingary, ISINarray, Accountarray, i

    Set eml = Sheets("Emailer"): Set bd = Sheets("Body"): Set OutApp = CreateObject("Outlook.Application")

    For Each y In eml.Range("A2:A" & eml.Range("A1000000").End(xlUp).Row)

    If eml.Range("F" & y.Row) <> "" Then
        underlyingary = Split(eml.Range("F" & y.Row), ",")
        Accountarray = Split(eml.Range("G" & y.Row), ",")
        ISINarray = Split(eml.Range("H" & y.Row), ",")
            For i = 0 To UBound(underlyingary)
                sbody = sbody & vbNewLine & "Underlying: " & WorksheetFunction.Proper(Trim(underlyingary(i))) & " Account Number: " & WorksheetFunction.Proper(Trim(Accountarray(i))) & " ISIN: " & WorksheetFunction.Proper(Trim(ISINarray(i))) & "<br>" & "<br>"
            Next i
    Else
            sbody = sbody & vbNewLine & "Underlying: " & WorksheetFunction.Proper(Trim(eml.Range("C" & y.Row))) & " Account Number: " & WorksheetFunction.Proper(Trim(eml.Range("D" & y.Row))) & " ISIN: " & WorksheetFunction.Proper(Trim(eml.Range("E" & y.Row))) & "<br>"
    End If

    On Error GoTo cleanup
            Set OutMail = OutApp.CreateItem(0)
            On Error Resume Next
            With OutMail
                .To = eml.Range("A" & y.Row)
                .Subject = bd.Range("B2")
                .cc = eml.Range("I" & y.Row)
                .htmlBody = bd.Range("A2") _
                    & "<br>" & "<br>" & _
                        bd.Range("A3") & _
                        Trim(eml.Range("B" & y.Row)) & _
                        bd.Range("A4") _
                    & "<br>" & "<br>" & _
                        sbody _
                    & "<br>" & _
                        bd.Range("A5") _
                    & "<br>" & "<br>" & "<li>" & _
                        bd.Range("A6").Text & "</li>" & _
                     "<br>" & "<br>" & "<li>" & _
                        bd.Range("A7").Text & "</li>" & _
                     "<br>" & "<br>" & "<li>" & _
                        bd.Range("A8").Text & "</li>" & _
                     "<br>" & "<br>" & _
                        bd.Range("A9") _
                    & "<br>" & bd.Range("A10")
                .display
            End With

            On Error GoTo 0
            Set OutMail = Nothing
    Next y
cleanup:
    Set OutApp = Nothing

End Sub

【讨论】:

  • 请注意这里有一些错综复杂的地方,首先我有一个电子邮件表和一个正文表(只是为了以后更容易更新)。我的数据结构如上。
  • 所以电子邮件的正文必须插入另一个工作表 - “正文”?
  • 在您方便的时候,您可以随意更改代码。我认为您的代码中有一些很好的 html 代码,所以我会保留它,我会在与您之前的代码一起使用的地方添加 sbody。我刚刚制作了一张名为 body 的不同表格,因为如果其他人想在没有 vba 技能的情况下更改 body,他们可以。
  • 快速提问:运行您提供的代码时,会出现 3 个要点,我不知道代码的哪一行对应于它们;另外 - 必须为每一行插入?
     bd.Range("A8").Text & "" & _ "
    " & "
    " & _ bd.Range("A9") _ & "
    " & bd.Range("A10")
  • 所以
  • 给出了要点,这是我需要为我正在使用的代码做的事情。您可以删除 .htmlbody 部分中的任何行
猜你喜欢
相关资源
最近更新 更多
热门标签