发送带有附加 Excel 的 Outlook 电子邮件,该电子邮件在收件人的特定选项卡处打开

Send Outlook email with attached Excel that opens at a specific tab for recipient

提问人:Sonny 提问时间:7/23/2023 最后编辑:Eugene AstafievSonny 更新时间:7/23/2023 访问量:94

问:

希望你一切安好。 我有一个VBA代码来生成电子邮件,并在Outlook上附加了Excel工作簿。工作正常。该按钮位于 1 个选项卡上,我想确保当收件人打开工作簿时,它是另一个特定的选项卡。 即生成电子邮件的按钮位于选项卡 1 上,用户将打开选项卡 2。由于有多个选项卡,我不能只发送选项卡 2。 有人可以建议是否有一个简单的解决方案吗? 谢谢

我的代码:

Sub Rectangle1_Click()
Dim xOutApp As Object
    Dim xOutMail As Object
    Dim xMailBody As String
    Dim signature As String
    On Error Resume Next
    Set xOutApp = CreateObject("Outlook.Application")
    Set xOutMail = xOutApp.CreateItem(0)
    
    With xOutMail
        .display
    End With

    signature = xOutMail.body

    
    xMailBody = "" & vbNewLine & vbNewLine & _
              "" & vbNewLine & _
              ""
                  On Error Resume Next
    With xOutMail
        .To = Range("T2")
        .CC = Range("U2")
        .BCC = ""
        .Importance = 2
        .Subject = Range("V2")
        .body = xMailBody & signature
        .Attachments.Add ActiveWorkbook.FullName
        .display   'or use .Send
    End With
    On Error GoTo 0
    Set xOutMail = Nothing
    Set xOutApp = Nothing
End Sub
Excel VBA 电子邮件 Outlook 办公自动化

评论

0赞 Tim Williams 7/23/2023
激活选项卡 2 并保存文件,然后再将其附加到电子邮件中。
0赞 VBasic2008 7/23/2023
当你说“我不能只发送标签 2”时,你的意思是你不知道怎么做还是你不想?我的意思是,您正在发送一个启用宏的工作簿以及形状(“按钮”)和发送电子邮件的代码等等。你为什么不描述一下你满意的理想场景呢?
0赞 Sonny 7/23/2023
嗨,蒂姆,这就是我通常做的事情。但我想知道是否有代码可以确保这一点,以防万一我匆忙。谢谢

答:

0赞 sam_sep1ol 7/23/2023 #1

此代码将创建Wordbook的临时副本并激活所需的选项卡,例如(Sheet2),生成带有附件的电子邮件,然后在电子邮件撰写后从临时副本中存储原始工作簿

Sub Rectangle1_Click()
    Dim xOutApp As Object
    Dim xOutMail As Object
    Dim xMailBody As String
    Dim signature As String
    On Error Resume Next
    Set xOutApp = CreateObject("Outlook.Application")
    Set xOutMail = xOutApp.CreateItem(0)
    On Error GoTo 0
    
    ' Copy the Excel workbook to a temporary file to preserve the original workbook's state
    ActiveWorkbook.SaveCopyAs "C:\Temp\TempWorkbook.xlsx"
    
    Dim targetTabName As String
    targetTabName = "Sheet2" ' Replace "Sheet2" with the name of your desired tab
    
    Worksheets(targetTabName).Activate
    
    With xOutMail
        .Display
    End With
    
    ' Restore the original workbook from the temporary file
    Application.DisplayAlerts = False ' Suppress alert for overwriting the original file
    ActiveWorkbook.Close SaveChanges:=False
    Kill ActiveWorkbook.FullName ' Delete the original workbook
    Name "C:\Temp\TempWorkbook.xlsx" As ActiveWorkbook.FullName 
    Application.DisplayAlerts = True 
    
    signature = xOutMail.Body
    xMailBody = "" & vbNewLine & vbNewLine & _
               "" & vbNewLine & _
               ""

    On Error Resume Next
    With xOutMail
        .To = Range("T2")
        .CC = Range("U2")
        .BCC = ""
        .Importance = 2
        .Subject = Range("V2")
        .Body = xMailBody & signature
        .Attachments.Add ActiveWorkbook.FullName
        .Display   'or use .Send
    End With
    On Error GoTo 0
    Set xOutMail = Nothing
    Set xOutApp = Nothing
End Sub
-1赞 Shri 7/23/2023 #2

为此,可以使用 Workbook_Open 事件激活您希望用户在打开工作簿时首先看到的工作表。每次打开工作簿时都会触发此事件。

您需要将此代码放在VBA编辑器的模块中。这是你如何做到这一点的:ThisWorkbook

  1. 按下可打开 VBA 编辑器。Alt + F11
  2. 在左侧的“项目资源管理器”中,找到您的工作簿,然后双击 。ThisWorkbook
  3. 粘贴以下代码:
Private Sub Workbook_Open()
    Sheets("Sheet2").Activate
End Sub

替换为工作簿打开时要处于活动状态的工作表的名称。"Sheet2"

请注意,这是工作簿的全局设置。每次打开工作簿时,无论以何种方式打开,此代码都将运行并激活指定的工作表。

您的电子邮件发送代码可以保持不变。当收件人打开工作簿时,由于 Workbook_Open 事件,它将自动导航到指定的选项卡。

建议的 VBA 代码旨在放置在 VBA 编辑器中的对象内。此对象包含与工作簿本身相关的事件,例如打开、关闭工作簿或激活或停用工作簿的时间。ThisWorkbook

在本例中,我们将使用该事件。顾名思义,每当打开工作簿时,都会触发此事件。此事件中的代码将自动运行。当打开工作簿时,该行将使“Sheet2”成为活动工作表。Workbook_OpenSheets("Sheet2").Activate

以下是在工作簿中添加事件的步骤:Workbook_Open

  1. 在 Excel 中按 打开 VBA 编辑器。Alt + F11
  2. 在编辑器左侧的“项目资源管理器”中,找到您的工作簿。如果 Project Explorer 不可见,您可以按 显示它。Ctrl + R
  3. 双击工作簿名称下方的“图标。这将打开一个与工作簿相关的新代码窗口。ThisWorkbook
  4. 在新的代码窗口中,从左侧下拉菜单中选择“工作簿”,从窗口顶部的右侧下拉菜单中选择“打开”。
  5. 这将自动创建一个事件。在此事件中,将 .将“Sheet2”替换为要在工作簿打开时处于活动状态的工作表的名称。Workbook_OpenSheets("Sheet2").Activate
  6. 关闭 VBA 编辑器。

这是修改后的VBA代码:

Sub Rectangle1_Click()
    Dim xOutApp As Object
    Dim xOutMail As Object
    Dim xMailBody As String
    Dim signature As String

    Set xOutApp = CreateObject("Outlook.Application")
    Set xOutMail = xOutApp.CreateItem(0)
    
    With xOutMail
        .display
    End With

    signature = xOutMail.body

    xMailBody = "" & vbNewLine & vbNewLine & _
              "" & vbNewLine & _
              ""
    
    On Error Resume Next
    With xOutMail
        .To = Range("T2")
        .CC = Range("U2")
        .BCC = ""
        .Importance = 2
        .Subject = Range("V2")
        .body = xMailBody & signature
        .Attachments.Add ActiveWorkbook.FullName
        .display
    End With
    On Error GoTo 0
    Set xOutMail = Nothing
    Set xOutApp = Nothing
End Sub

Private Sub Workbook_Open()
    Sheets("Sheet2").Activate
End Sub

使用此修改后的代码,当您运行子例程时,它将发送包含工作簿的电子邮件作为附件。当收件人打开工作簿时,由于该事件,它将自动导航到指定的工作表。Rectangle1_ClickWorkbook_Open

评论

1赞 NotTheDr01ds 7/23/2023
嗨,代码机器人!这肯定是您拥有的可疑用户名!;-)你在过去一天左右的四个答案似乎可能全部或部分由人工智能(例如,ChatGPT)编写。请注意,这里不允许发布 AI 生成的内容。如果您使用 AI 工具来协助回答任何问题,我鼓励您将其删除。我们希望您能坚持下去,并通过发布您自己的优质内容继续成为我们社区的重要组成部分。谢谢!
1赞 NotTheDr01ds 7/23/2023
读者应该仔细和批判性地审查这个答案,因为人工智能生成的信息通常包含根本性的错误和错误信息。如果您发现质量问题和/或有理由相信此答案是由 AI 生成的,请留下相应的反馈。