【问题标题】:How do I send multiple returned values in an email?如何在一封电子邮件中发送多个返回值?
【发布时间】:2023-01-31 01:08:51
【问题描述】:

目的是发送一封包含代码返回的所有值的电子邮件。

输出是最后一个值而不是电子邮件中的所有值。

Sub Email()

Dim Outlook, OutApp, OutMail As Object
Dim EmailSubject As String, EmailSendTo As String, MailBody As String
Dim SigString As String, Signature As String, fpath As String
Dim Quarter As String, client() As Variant
Dim Alert As Date, Today As Date, Days As Integer, Due As Integer

Set Outlook = OpenOutlook

Quarter = Range("G4").Value
Set rng = Range(Range("G5"), Range("G" & Rows.Count).End(xlUp))

'Resize Array prior to loading data
ReDim client(rng.Rows.Count)

'Check column G for blank cells and return F cells
For Each Cell In rng
    If Cell.Offset(0, 1).Value = "" Then
        ReDim client(x)
        Alert = Cell.Offset(0, 0).Value
        Today = Format(Now(), "dd-mmm-yy")
        Days = Alert - Today
        Due = Days * -1
        client(x) = Cell.Offset(0, -3).Value & " " & Cell.Offset(0, -1).Value
    End If
Next
    For x = LBound(client) To UBound(client)
        List = client(x) & vbNewLine
        List = List + List
    Next x
        
'Check dates to send subject line'
    If Days < 0 Then
        mail = True
        EmailSubject = Quarter & " Vat Returns are Overdue"
        MailBody = "<p>The Vat Returns are overdue by " & Due & " Days. See the clients below: </p>" & List
    ElseIf Days <= 14 Then
        mail = True
        EmailSubject = "Vat Returns are due within Two weeks"
        MailBody = "<p>The Vat Returns are due in " & Days & " Days. See the clients below: </p>" & List
    End If
  
'Fetch signature
    SigString = Environ("appdata") & _
                "\Microsoft\Signatures\.htm"
    Signature = GetBoiler(SigString)
    
'Fetch link for file location
    fpath = "K:
    
'Skip if mail=false
    If mail = True Then
    
'Send Mail
        Set OutApp = CreateObject("Outlook.Application")
        Set OutMail = OutApp.CreateItem(o)
        With OutMail
            .Subject = EmailSubject
            .To = ""
            '.bcc
            sHTML = "<HTML><BODY>"
            sHTML = sHTML & "<p>Hi, </p>"
            sHTML = sHTML & MailBody
            sHTML = sHTML & "<p>If the Vat Return have been filed, please update the database using the link below.</p>"
            sHTML = sHTML & "<A href='" & fpath & "'></A>"
            sHTML = sHTML & "<p>Regards,</p>"
            .HTMLBody = sHTML & Signature
            .HTMLBody = .HTMLBody & "</BODY></HTML>"
            .Display
        End With
        
        Set Outlook = Nothing
        Set OutMail = Nothing
        Set OutApp = Nothing
        
        mail = False
        EmailSendTo = ""
        
    End If

End Sub

该代码返回 if 语句中的最后一个值并将其放入电子邮件中。

我想遍历数据范围。如果 G:G 列中的单元格为空,则返回 F:F 列中的单元格值。

我可以将多封电子邮件发送到一个电子邮件地址,每封电子邮件中有一个单元格值。
我想发送一封包含所有(多个)单元格值的电子邮件。

我去掉了个人信息,但这不会影响代码的运行。

【问题讨论】:

  • For each Cell in rng 循环中,您引用了 client(x),但是 x 直到 For x = lbound(client) to ubound(client) 中的循环之后才被赋予一个值。从它的外观来看,x 的第一次使用将始终为 0,然后当您到达 For x 行时它仍将是 0,因为 client 数组将有一个 lboundubound 为 0 .
  • @DarrenBartrup-Cook 在最后一个循环中 x 的值更改为 3。这个特定的 if 语句中有 3 个值。在 if 语句中调用它时是否可以显示所有 3 个值(检查主题行)?

标签: excel vba


【解决方案1】:

如果直接构建列表,则不需要 client() 数组。

Today = Format(Now(), "dd-mmm-yy")
For Each cell In Rng
    If cell.Offset(0, 1).Value = "" Then
        Alert = cell.Offset(0, 0).Value
        Days = Alert - Today
        Due = Days * -1
        If Len(List) > 0 Then List = List & vbNewLine
        List = List & cell.Offset(0, -3).Value & " " & cell.Offset(0, -1).Value
    End If
Next

注意OutApp.CreateItem(o)应该是OutApp.CreateItem(0)

【讨论】:

  • 这行得通。但是,电子邮件显示为值 1“空格”值 2 等。是否可以在每个值后换行?
  • @Brendacodedotcom 使用"&lt;br&gt;"代替vbNewLine
  • 谢谢。我改用“<p><p>”。
猜你喜欢
  • 2011-05-19
  • 2015-05-17
  • 1970-01-01
  • 2011-02-08
  • 2011-09-06
  • 2011-07-14
  • 2016-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多