提问人:Sonny 提问时间:7/23/2023 最后编辑:Eugene AstafievSonny 更新时间:7/23/2023 访问量:94
发送带有附加 Excel 的 Outlook 电子邮件,该电子邮件在收件人的特定选项卡处打开
Send Outlook email with attached Excel that opens at a specific tab for recipient
问:
希望你一切安好。 我有一个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
答:
此代码将创建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
为此,可以使用 Workbook_Open 事件激活您希望用户在打开工作簿时首先看到的工作表。每次打开工作簿时都会触发此事件。
您需要将此代码放在VBA编辑器的模块中。这是你如何做到这一点的:ThisWorkbook
- 按下可打开 VBA 编辑器。
Alt + F11
- 在左侧的“项目资源管理器”中,找到您的工作簿,然后双击 。
ThisWorkbook
- 粘贴以下代码:
Private Sub Workbook_Open()
Sheets("Sheet2").Activate
End Sub
替换为工作簿打开时要处于活动状态的工作表的名称。"Sheet2"
请注意,这是工作簿的全局设置。每次打开工作簿时,无论以何种方式打开,此代码都将运行并激活指定的工作表。
您的电子邮件发送代码可以保持不变。当收件人打开工作簿时,由于 Workbook_Open 事件,它将自动导航到指定的选项卡。
建议的 VBA 代码旨在放置在 VBA 编辑器中的对象内。此对象包含与工作簿本身相关的事件,例如打开、关闭工作簿或激活或停用工作簿的时间。ThisWorkbook
在本例中,我们将使用该事件。顾名思义,每当打开工作簿时,都会触发此事件。此事件中的代码将自动运行。当打开工作簿时,该行将使“Sheet2”成为活动工作表。Workbook_Open
Sheets("Sheet2").Activate
以下是在工作簿中添加事件的步骤:Workbook_Open
- 在 Excel 中按 打开 VBA 编辑器。
Alt + F11
- 在编辑器左侧的“项目资源管理器”中,找到您的工作簿。如果 Project Explorer 不可见,您可以按 显示它。
Ctrl + R
- 双击工作簿名称下方的“图标。这将打开一个与工作簿相关的新代码窗口。
ThisWorkbook
- 在新的代码窗口中,从左侧下拉菜单中选择“工作簿”,从窗口顶部的右侧下拉菜单中选择“打开”。
- 这将自动创建一个事件。在此事件中,将 .将“Sheet2”替换为要在工作簿打开时处于活动状态的工作表的名称。
Workbook_Open
Sheets("Sheet2").Activate
- 关闭 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_Click
Workbook_Open
评论
上一个:当单元格更改时触发电子邮件
下一个:VBA .body 文本太长
评论