【问题标题】:Send email to email addresses in a range of cells将电子邮件发送到一系列单元格中的电子邮件地址
【发布时间】:2023-01-24 03:06:20
【问题描述】:

我正在尝试从 Excel 发送电子邮件,该电子邮件使用保存在 A2 数据表中的数据透视表范围发送附件,并且每天都是动态的。

.TO 字段我得到错误

对象不支持此方法。

Sub emailtest()

Dim objOutlook As Object
Dim objMail As Object
Dim rngTo As String
Dim rngSubject As String
Dim rngBody As String
Dim LastRow As Long
Set objOutlook = CreateObject("Outlook.Application")
Set objMail = objOutlook.CreateItem(0)

Sheets("Data").Select
LastRow = Worksheets("Data").Range("A" & Rows.Count).End(xlUp).Row

With objMail
.To = Worksheets("Data").Range("A2: A" & LastRow - 1)
.Subject = "Sell Fail Trade"
.Body = "Please find today's sell report"
.Attachments.Add "C\Temp Folder"
.Display 'Instead of .Display, you can use .Send to send the email _
            or .Save to save a copy in the drafts folder
End With
Set objOutlook = Nothing
Set objMail = Nothing
End Sub

【问题讨论】:

  • 你得到什么错误?在哪一行?您是否调试了代码并检查了所有值/对象是否符合预期?
  • .Body = rngBody = "Please find today's sell report" 看起来也不正确。
  • 谢谢代码已更新但在“To”处出现错误
  • 您不能为 .To 属性使用由多个单元格组成的范围。请参阅例如herehere 一些解决方案
  • 您需要构建结果字符串,然后才将基于范围对象构建的单个字符串分配给 To 属性。

标签: excel vba outlook


【解决方案1】:

To-property 需要一个字符串作为参数。如果你有超过一个人应该收到邮件,你需要将名字与;连接起来

如果 LastRow-1 大于 3,则您的范围内有多个单元格,Worksheets("Data").Range("A2: A" & LastRow - 1) 将为您提供一个二维值数组。是的,它是二维的,即使它只包含一列。

VBA 中有一个很好的函数,join 可以连接数组的内容,但在这种情况下不能使用它,因为它只适用于一维数组。

To 您将不得不手动遍历该范围以创建 to-string。我建议为此创建一个简单的、可重用的函数(例如,也可以用于 cc 字段)。

Function join2D(a As Variant, Optional delimiter As String = ";") As String
    ' Check if a is a single value
    If (VarType(a) And vbArray) = 0 Then
        join2D = a
        Exit Function
    End If
    
    Dim i As Long, j As Long
    For i = LBound(a, 1) To UBound(a, 1)
        For j = LBound(a, 2) To UBound(a, 2)
            Dim v
            v = a(i, j)
            If Not IsEmpty(v) And Not IsError(v) Then
                join2D = join2D & IIf(join2D = "", "", delimiter) & CStr(v)
            End If
        Next j
    Next i
End Function

然后在创建邮件的例程中编写:

.To = Join2D(Worksheets("Data").Range("A2: A" & LastRow - 1))

【讨论】:

  • 在下面的行中出现类型不匹配错误 { For i = LBound(a, 1) To UBound(a, 1)}
  • 你能用调试器检查 a 究竟包含什么吗?使用本地窗口(查看->本地窗口)。
【解决方案2】:

To 属性是一个字符串属性。它是 Outlook 项目的收件人的显示名称的分号分隔字符串列表。因此,您需要从 Excel 中的 Range 对象中提取一个字符串。例如,您可以尝试使用 Range.Value 属性,它返回或设置一个表示指定范围值的 Variant 值。

.To = Worksheets("Data").Range("A2: A" & LastRow - 1).Value

或者

.To = Worksheets("Data").Range("A2: A" & LastRow - 1).Value2

如果目标范围是多维的(或由多个单元格组成),则需要根据遍历每个单元格的范围值构建 To 字符串,然后才将其分配给 To 属性。

【讨论】:

  • 那不是问题。由于Value 是默认属性,您可以省略它。问题是该范围包含的单元格不止一个,因此Worksheets("Data").Range("A2: A" & LastRow - 1).Value 将返回一个二维数组
  • 我已经添加了应该处理单个单元格并且应该结合每个值来构建 to 字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
  • 2018-11-06
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
相关资源
最近更新 更多