Warm tip: This article is reproduced from serverfault.com, please click

excel-使用可变长度列表中的单元格值填充电子邮件文本

(excel - Fill email text with cell values from a list of variable length)

发布于 2020-12-03 16:10:44

我在“ A”列中有一个包含公司名称的列表。这些公司的员工在“ B”列中。在“ C”列中,他们开始工作的日期。
在此处输入图片说明

有的有10名员工,有的有1名员工。我想发送一封带有标准文本的电子邮件。在该文本中应该有雇员的姓名和开始日期。

Sub mailen()

Dim namen As String
Dim r As Range
Dim inhoud As String
Dim names As string
Dim dates As string

inhoud = "Hello client," & "<br>" & _
"Here some text that explains why we send this e-mail." & "<br>" & _
"It is about your employee(s): " & names & " " & "<br>" & _
"These employee(s) are working for you from the dates: " & dates & "." & "<br>"


For Each r In Range("O2", Range("O2").End(xlDown))
    If r.Value = r.Offset(-1, 0).Value Then
        r.Value = r.Value
    Else: namen = r.Value
    
        With CreateObject("Outlook.Application").createitem(0)
        .To = namen
        .Subject = "Test"
        .HTMLbody = inhoud
        .attachments.Add ("C:\.pdf")
        .send
        End With
    End If
Next r
End Sub

在“ O”列中是将电子邮件发送到的电子邮件地址。

我需要names用名称填充变量,并dates用日期填充变量

Questioner
Vincent Berg
Viewed
0
Evil Blue Monkey 2020-12-04 20:42:51

试试下面的代码:

Sub SubMailen()
    
    'Declarations.
    Dim RngMailingAddressList As Range
    Dim RngCompanyNameList As Range
    Dim RngEmployeeNameList As Range
    Dim RngStartingDateList As Range
    Dim RngTarget01 As Range
    Dim RngTarget02 As Range
    Dim StrMailingAddress As String
    Dim StrMessage As String
    
    'Setting ranges as the first cell of their column.
    Set RngMailingAddressList = Range("O2")
    Set RngCompanyNameList = Range("A2")
    Set RngEmployeeNameList = Range("B2")
    Set RngStartingDateList = Range("C2")
    
    'Resetting ranges to cover the whole list (based upon RngMailingAddressList).
    Set RngMailingAddressList = Range(RngMailingAddressList, RngMailingAddressList.End(xlDown))
    Set RngCompanyNameList = Range(RngCompanyNameList, RngCompanyNameList.Offset(RngMailingAddressList.Rows.Count - 1))
    Set RngEmployeeNameList = Range(RngEmployeeNameList, RngEmployeeNameList.Offset(RngMailingAddressList.Rows.Count - 1))
    Set RngStartingDateList = Range(RngStartingDateList, RngStartingDateList.Offset(RngMailingAddressList.Rows.Count - 1))
    
    'Covering each cell in RngMailingAddressList.
    For Each RngTarget01 In RngMailingAddressList
        
        'Checking if the address has not been encountered before.
        If Excel.WorksheetFunction.CountIf(Range(RngMailingAddressList.Cells(1, 1), RngTarget01), RngTarget01.Value) = 1 Then
            
            'Setting StrMailingAddress.
            StrMailingAddress = RngTarget01.Value
            
            'Setting first part of StrMessage.
            StrMessage = "Hello client," & "<br>" & _
            "Here some text that explains why we send this e-mail." & "<br>" & _
            "It is about your employee(s):" & "<br>"
            
            'Covering all the cells in RngCompanyNameList.
            For Each RngTarget02 In RngCompanyNameList
                'Checking if RngTarget02 has the same company name as the row of the address the mail is about to be sent.
                If RngTarget02.Value = Cells(RngTarget01.Row, RngCompanyNameList.Column).Value Then
                    'Adding name and starting date of the employee to StrMessage.
                    StrMessage = StrMessage & Cells(RngTarget02.Row, RngEmployeeNameList.Column).Value & " (working for you from " & Cells(RngTarget02.Row, RngStartingDateList.Column).Value & ")" & "<br>"
                End If
            Next
            
            'Setting and sending the mail.
            With CreateObject("Outlook.Application").createitem(0)
                .To = StrMailingAddress
                .Subject = "Test"
                .HTMLbody = StrMessage
                .attachments.Add ("C:\.pdf")
                .send
            End With
            
        End If
    Next
End Sub

我想将员工的姓名和开始日期放在一起会更有意义。该代码检查是否已经遇到了邮件地址,并且每次发送的邮件不超过一个。它根据给定地址同一行中指定的公司名称创建员工姓名和开始日期的列表。这意味着,如果同一家公司有2封(或更多)不同的电子邮件,则将发送2封(或更多)电子邮件(每封电子邮件1封),同时附上雇员姓名的完整列表和开始日期。给定的公司。该代码应独立于列表的排序顺序工作。

我从来没有通过代码发送过电子邮件,所以我认为你的代码中处理此类任务的部分以及我已经集成到我的代码中的部分已经在工作。可以通过添加均值来指定现在设置为“此处解释为什么发送此电子邮件的邮件”的消息部分,另外一个指定电子邮件主题的消息和另一个指定可能的消息的方法来改进代码。电子邮件的附件。