首页 > 解决方案 > Excel VBA - 电子邮件主题行包含偏移单元格的值

问题描述

我对 VB 很陌生,如果有任何帮助,我将不胜感激。先感谢您。

当特定单元格具有特定值时,我试图发送一封电子邮件。例如,当单元格 E3 的值为 1 时,我想发送电子邮件 1,当它的值为 2 时,我想发送电子邮件 2。这部分工作正常。我还希望主题行是左侧3个单元格的内容,即当单元格E3被触发发送电子邮件时,我希望主题行是B3的内容,当E4被触发时,我想要以B4的内容为准。这是我失误的地方,我尝试了各种偏移和范围选项,但我只是在电子邮件中得到一个空白主题行。这就是我所拥有的:

Dim xRg As Range
Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next
    If Target.Cells.Count > 1 Then Exit Sub
  Set xRg = Intersect(Range("E3:E5"), Target)
    If xRg Is Nothing Then Exit Sub
    If IsNumeric(Target.Value) And Target.Value = 1 Then
        Call Mail_small_Text_Outlook
    ElseIf IsNumeric(Target.Value) And Target.Value = 2 Then
        Call Mail_small_Text_Outlook2
        End If
End Sub
Sub Mail_small_Text_Outlook()
    Dim xOutApp As Object
    Dim xOutMail As Object
    Dim xMailBody As String
    Set xOutApp = CreateObject("Outlook.Application")
    Set xOutMail = xOutApp.CreateItem(0)
    xMailBody = "Good Day" & vbNewLine & _
              "Content Mail 1"
    On Error Resume Next
    With xOutMail
        .To = "xxx@mci.co.za"
        .CC = ""
        .BCC = ""
        .Subject = ActiveCell.Offset(0, -3).Value
        .Body = xMailBody
        .Display   'or use .Send
    End With
    On Error GoTo 0
    Set xOutMail = Nothing
    Set xOutApp = Nothing
End Sub
Sub Mail_small_Text_Outlook2()
    Dim xOutApp As Object
    Dim xOutMail As Object
    Dim xMailBody As String
    Set xOutApp = CreateObject("Outlook.Application")
    Set xOutMail = xOutApp.CreateItem(0)
    xMailBody = "Good Day" & vbNewLine & _
              "Content Mail 2"
    On Error Resume Next
    With xOutMail
        .To = "xxx@mci.co.za"
        .CC = ""
        .BCC = ""
        .Subject = ActiveCell.Offset(0, -3).Value
        .Body = xMailBody
        .Display   'or use .Send
    End With
    On Error GoTo 0
    Set xOutMail = Nothing
    Set xOutApp = Nothing
End Sub

标签: excelvba

解决方案


我不使用 ActiveCell,而是将“Target”作为参数添加到Mail_small_Text_Outlook. 这样你就可以确定你引用的单元格是同一个单元格。

如果您需要使用 ActiveCell(出于某种原因)并且您没有得到正确的结果,您可以使用类似的方法:
MsgBox ActiveCell.Address
仔细检查您使用的单元格是否是您期望的单元格。

我还建议将Mail_small_Text_OutlookandMail_small_Text_Outlook2合并到一个 sub 中并添加一个参数来指定您要使用的电子邮件正文。这样,打开 Outlook 和创建实际电子邮件的代码只在一个地方,因此如果您需要更改/调试它,您只需执行一次。

最后的 sub 可能看起来像这样 Mail_small_Text_Outlook(Target As Range, EmailBody As Integer)


推荐阅读