使用Excel VBA创建具有特定值的行的Outlook电子邮件正文

时间:2019-01-30 20:10:45

标签: excel vba email outlook outlook-vba

我已经使用一个示例来创建代码,以使用“按钮”(文件中的红色)从Excel(使用Outlook)发送电子邮件。

该代码有效。有一个预选的行范围[B1:K20],由于 Application.InputBox 函数,可以手动对其进行修改。

Sub MAIL()

Dim rng As Range
Dim OutApp As Object
Dim OutMail As Object
Dim StrBodyIn, StrBodyEnd As String

StrBodyIn = "Bonjour," & "<br>" & _
           " " & "<br>" & _
          "Buongiorno," & "<br>"

StrBodyEnd = " " & "<br>" & _
             "Cordialement" & "<br>" & _
             " " & "<br>" & _
             Range("M2") & "<br>"

Set rng = Nothing

On Error Resume Next
Set rng = Sheets("TEST").Application.InputBox("Range", xTitleId, "B1:K20", Type:=8)
On Error GoTo 0

If rng Is Nothing Then
    MsgBox "ATTENZIONE!!!" & _
           vbNewLine & "Seleziona un range di celle valido.", vbOKOnly
    Exit Sub
End If

With Application
    .EnableEvents = False
    .ScreenUpdating = False
End With

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

On Error Resume Next
With OutMail
    .To = "email@gmail.com"
    .CC = ""
    .BCC = ""
    .Subject = "SITUATION"
    .HTMLBody = "<p style='font-family:calibri;font-size:16'>" & StrBodyIn & RangetoHTML(rng) & "<p style='font-family:calibri;font-size:16'>" & StrBodyEnd
    .Display 'or use .Send
End With
On Error GoTo 0

With Application
    .EnableEvents = True
    .ScreenUpdating = True
End With

Set OutMail = Nothing
Set OutApp = Nothing
End Sub

我想添加一个条件。

如果在“ A”列中写有“ X”符号,则应将所选行范围复制到电子邮件的正文中。

Here the image

在我的示例中,应复制n°1、2和n°5行。

1 个答案:

答案 0 :(得分:1)

这里的两个任务是分开的,因此我将这样编写它们。这就是我的方法。将您的潜艇分成两个逻辑过程。

  1. 确定身体范围
  2. 发送范围内的电子邮件

确定身体范围

将您的按钮链接到此宏。宏将接受输入并将其转换为单个列范围(Column B)。然后,我们将遍历所选范围并查看Column A,以确定是否存在x。如果存在x,我们将把范围调整为原始大小,并将其添加到单元格集合(Final)中。

循环完成后,宏将执行以下操作之一:

  1. 如果范围为空,它将提示您的消息框并结束该子项(您的电子邮件宏从不启动)
  2. 如果范围不为空,我们将调用您的EMAIL宏,并将范围传递给它。

Sub EmailRange()

Dim Initial As Range, Final As Range, nCell As Range

On Error Resume Next
    Set Initial = Sheets("TEST").Application.InputBox("Range", xTitleId, "B1:K20", Type:=8)
On Error GoTo 0

For Each nCell In Initial.Resize(Initial.Rows.Count, 1)
    If nCell.Offset(, -1) = "X" Then
        If Not Final Is Nothing Then
            Set Final = Union(Final, nCell.Resize(1, Initial.Columns.Count))
        Else
            Set Final = nCell.Resize(1, Initial.Columns.Count)
        End If
    End If
Next nCell

If Not Final Is Nothing Then
    MAIL Final
Else
    MsgBox "ATTENZIONE!!!" & vbNewLine & "Seleziona un range di celle valido.", vbOKOnly
End If

End Sub

发送范围内的电子邮件

请注意,宏现在具有输入(在第一行)。如果调用了该子程序,则您无需再进行任何验证,因为这都是在原始子程序中完成的!

Sub MAIL(Final as Range)

Dim OutApp As Object, OutMail As Object
Dim StrBodyIn As String, StrBodyEnd As String

StrBodyIn = "Bonjour," & "<br>" & " " & "<br>" & "Buongiorno," & "<br>"
StrBodyEnd = " " & "<br>" & "Cordialement" & "<br>" & " " & "<br>" & Range("M2") & "<br>"

Application.EnableEvents = False
Application.ScreenUpdating = False

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

    On Error Resume Next
        With OutMail
            .To = "email@gmail.com"
            .CC = ""
            .BCC = ""
            .Subject = "SITUATION"
            .HTMLBody = "<p style='font-family:calibri;font-size:16'>" & StrBodyIn & RangetoHTML(Final) & "<p style='font-family:calibri;font-size:16'>" & StrBodyEnd
            .Display 'or use .Send
        End With
    On Error GoTo 0

  Set OutMail = Nothing
  Set OutApp = Nothing

Application.EnableEvents = True
Application.ScreenUpdating = True

End Sub