【问题标题】:Excel VBA to create email generator compatible with VLookupExcel VBA 创建与 VLookup 兼容的电子邮件生成器
【发布时间】:2018-12-05 22:26:21
【问题描述】:

我目前有一个电子表格,可以从另一张表格中提取信息。它使用一系列 Vlookup 公式,使用 Sheet1 中的客户详细信息生成消息。为了发送这些电子邮件,我一直在使用两个宏命令。一个简单的复制范围(B4:L36):

Sub Copy()
Copy Macro
Range("B4:L36").Select
Selection.Copy
End Sub

另一个命令打开一封空白电子邮件:

Sub MailIt()
Dim oMailItem As Object
Dim oOLapp As Object
Set oOLapp = CreateObject("Outlook.application")
Set oMailItem = oOLapp.CreateItem(0)
With oMailItem
.To = ""
.CC = ""
.Subject = ""
.Body = ""
.Display
End With
Set oOLapp = Nothing
Set oMailItem = Nothing
End Sub

然后我将消息作为图片粘贴到电子邮件正文中。我回到我的电子表格并从 E1:J1 范围内复制生成的标题并将其粘贴为我的电子邮件主题。最后,我从 L2 复制收件人地址并将其粘贴到我的电子邮件中并发送。

有没有办法有一个 VBA 命令:

  1. 查看 L2 中的地址并将其粘贴为电子邮件中的收件人地址(假设 VLookup 公式不会干扰此操作)。
  2. 从 E1:J1 复制标题范围并将其粘贴为电子邮件主题。
  3. 复制邮件范围 (B4:L36) 并将其粘贴为电子邮件正文(作为图片)。

作为visual example 电子表格正在做什么,请查看超链接。基本思想是它从 INFO 选项卡中获取详细信息并使用 VLookup 公式在 Proforma 选项卡中生成消息(出于数据保护的原因,我已将消息涂黑)。如果有更好的方法可以做到这一点,请告诉我 - 我总是很乐意了解更多!

我对此进行了大量研究,发现可以创建执行此操作的电子邮件,但是,我正在努力让它发挥作用,希望能得到一些帮助!

谢谢。

【问题讨论】:

  • 您可以简单地将.To = "" 替换为.To = Range("L2").Value 吗?同样,.Subject = Range("E1").Value&Range("F1").Value&Range("G1").Value...etc."?图片好像比较复杂,回复here
  • 我在使用该格式时收到“错误不匹配”。你有什么想法吗?
  • 我看到你有一个解决方案,但我仍然会回答这个问题。类型必须是字符串,但单元格中的值可能是某种类型的数字(int、long 等),因此您可以使用vartype 来确认它是字符串。您也可以在代码中使用.Text 代替.Value.
  • 对延迟回复表示歉意。感谢您,To 和 Subject 地址按预期工作 - 尽管 &Range 方面出现语法错误。是否有更简单的方法将指定的 Excel 范围复制到电子邮件正文中,如下面的解决方案?

标签: excel vba email


【解决方案1】:

每当我需要发送电子表格的一部分时,我通常直接通过 Excel 发送,不包括 Outlook:

Sub SendTheStuff()
    Dim strRecipients As String
    Dim strSubject As String

    strRecipients = Worksheets("Sheet 1").Cells(2, 12).Value   'your client's mail adress, assuming it to be on Sheet 1 of your book, adjust to your needs
    strSubject = Worksheets("Sheet 1").Cells(1, 5).Value   'The content of Sheet 1, Cell "E1" - see if you can combine the range you want into one cell to keep code simple - and adjust the Sheet if necessary

    Worksheets("Sheet 1").Range("B4:L36").Select
    With Selection
        ActiveWorkbook.EnvelopeVisible = True
        With ActiveSheet.MailEnvelope
            .Item.Subject = strSubject
            .Item.To = strRecipients
            .Item.Attachments.Add "T:\he\Path\To\An\Attachm.ent"   'you may even add a file in case you need to
            .Item.Send
        End With
    End With

ActiveWorkbook.EnvelopeVisible = False

End Sub

此方法使用 Excel 作为邮件客户端,对我来说效果很好 - 试试吧!

【讨论】:

  • 那个方法干净多了,没想到可以!我确实设法让它部分工作,电子邮件正文工作得很好,但我正在努力让收件人和主题部分工作。是否因为单元格值是一个公式,它正在创建错误?我已经在原始帖子中包含了一张图片,如果它让我想要做的事情更清楚的话。但是,谢谢,这已经是朝着正确方向迈出的惊人一步了!
  • 据我所知,例如.Cells(2, 12).Value应该返回公式的结果。刚刚尝试过:字符串已按应有的方式填充。如果在填充变量的行之后添加debug.print strRecipientsdebug.print strSubject,您会看到什么?
  • 太棒了,好像做到了!不过,有两个简单的问题,当我删除“.Item.Attachments”时,代码不起作用,我怎样才能在不崩溃代码的情况下删除它?另外,是否可以在excel中导入用户的签名或默认所有带有该用户签名的消息?
  • 您是否删除了整行代码,而不仅仅是.Item.Attachments?那时应该工作。从来没有尝试过添加签名,也不确定这是否可行。但作为一种解决方法,您至少可以在所选单元格中包含签名文本。不理想,但可行。很高兴到目前为止它对你有用。如果您对答案感到满意,我们将不胜感激。
  • 效果很好,谢谢。我一直在考虑绕过签名文本的方法。如果我在用户输入某个单元格时使用代码来识别用户(它会找到他们的 Windows 用户名),那么我可以使用另一个 vLookup 公式来根据用户更改签名。然后我可以扩展范围,以便它将签名与正文一起发送。听起来怎么样,是不是很复杂?
猜你喜欢
  • 2016-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-26
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
  • 1970-01-01
相关资源
最近更新 更多