【问题标题】:Create Outlook Email Body with rows having a particular value using Excel VBA使用 Excel VBA 创建具有特定值的行的 Outlook 电子邮件正文
【发布时间】:2019-01-30 20:10:44
【问题描述】:

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

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

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”符号,则应将选定的行范围复制到电子邮件正文中。

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

【问题讨论】:

    标签: excel vba email outlook


    【解决方案1】:

    这里的两个任务是分开的,所以我会这样编码。这将是我的方法。将您的 sub 分成两个逻辑过程。

    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,您不再需要验证任何内容,因为这一切都是在原始 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
    

    【讨论】:

    • 仅供参考,如果他们选择的范围不是从 B 列开始,这将中断。好吧,它不会中断,但它永远不会找到 X,所以永远不会有一个范围发送。
    • PS:如何通过仅单击所有工作表中存在的 1 个按钮在不同的工作表上重复此功能?我的意思是,电子邮件中的表格必须通过在所有工作表中添加数据来实现(与“X”相同的规则)。数据应从第一张表开始复制,例如。 TEST(1) 到最后一张纸,TEST(9)。谢谢!!!
    • 这是一个完全不同的问题,因此值得单独发布。请提出一个新问题 - 分享您拥有的代码,并说明您正在寻求哪些更改
    • 我创建了一个新问题,希望能正确发布!谢谢
    猜你喜欢
    • 2021-09-30
    • 2020-10-06
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多