英文:
Paste specific worksheet range into email body
问题
I'm here to help you with the translation. Here's the translated content:
我是相当新的VBA编程,我需要帮助解决我工作中需要的问题。
我创建了一个工作表,以减少我的团队成员在工作日内所花费的时间,为了提供更多信息,我们使用这个工作表来填写团队处理的所有关键问题的信息。
当发生关键问题时,团队负责向公司发送通告,由于旧流程导致通告缺乏标准化,因此我决定创建了一个自定义电子邮件布局的工作表。
为了防止工作人员编辑此布局,我保护了工作表并创建了带有宏的按钮来生成这些通告,但是如同新手所期望的那样,它的工作效果不太理想。
以下是生成通告的工作表的屏幕截图。单元格从B6开始,结束于L27。工作表标识是“Planilha5”,我需要的是:当工作人员单击工作表中的“发送”按钮时,将在Microsoft Outlook 365中调用新消息,并填写VBA脚本中定义的信息,并且必须将工作表定义的范围粘贴到邮件消息的正文中。
这是我正在尝试修改以供使用的VBA脚本:
Sub EnviarAbertura()
Dim Outlook As Object, Novo_Email As Object, Email_Body As String, b1 As Variant
b1 = Planilha5.Range("B6:L27")
Set Outlook = CreateObject("Outlook.Application")
Email_Body = b1
Set Novo_Email = Outlook.CreateItem(0)
Corpo = Planilha5.Range("B6:L27").Copy
With Novo_Email
.SentOnBehalfOfName = "centraldecomandotd@natura.net"
.Subject = Planilha5.Range("G4")
.Body = Email_Body
.Display
End With
End Sub
当我注释掉这些行'b1 = Planilha5.Range("B6:L27")';'Email_Body = b1';'.Body = Email_Body',脚本可以正常工作,但邮件正文未填充。
我手动粘贴了工作表范围,如下截图所示,以展示我希望VBA脚本执行的操作。
请问是否有人可以帮助我解决这个VBA脚本的问题?
英文:
I'm quite new VBA programming and I need help with something that I need at my work.
I have a sheet that I created to reduce the time spent by my team workers on their job during the day and just to give more information, we use this sheet to fill all the information regarding critical issues that the team manage into war rooms.
The team is responsible to send announcements for the company when a critial issue is hapening and as the old process were generating a lack of standardization in these announcements, I decided to create this sheet with a custom layout for e-mails.
And to prevent workers to edit this layout, I protected the worksheets and created buttons with macros to generate these announcements, but as spected from a newbie person, it's not working properly as spected.
Below is a screenshot from this worksheet where the announcement is generated. The cells starts at B6 and ends at L27. The worksheet identification is "Planilha5" and what I need is: When the worker click over the SEND button present into the worksheet, a new message into Microsoft Outlook 365 is invoked and filled with the defined information into the VBA script and the worksheet defined range must be pasted into the body of the mail message.
And this is the VBA script that I'm trying to modify to be used:
Sub EnviarAbertura()
Dim Outlook As Object, Novo_Email As Object, Email_Body As String, b1 As Variant
b1 = Planilha5.Range("B6:L27")
Set Outlook = CreateObject("Outlook.application")
Email_Body = b1
Set Novo_Email = Outlook.CreateItem(0)
Corpo = Planilha5.Range("B6:L27").Copy
With Novo_Email
.SentOnBehalfOfName = "centraldecomandotd@natura.net"
.Subject = Planilha5.Range("G4")
.Body = Email_Body
.Display
End With
End Sub
When I comment the lines 'b1 = Planilha5.Range("B6:L27")'; 'Email_Body = b1'; '.Body = Email_Body', the script works properly without the body filled.
I have pasted manually the worksheet range into a screenshot below to show you guys what I'm specting to do with the VBA Script.
Please, could someone help me with this VBA script?
答案1
得分: 2
有两种主要的方法可以基于Excel数据设置邮件正文:
-
基于工作表内容构建HTML标记。这基本上是Ron在邮件正文中的邮件范围/选择页面上描述的内容,您可以在该页面找到以下示例代码:
Function RangetoHTML(rng As Range) Dim fso As Object Dim ts As Object Dim TempFile As String Dim TempWB As Workbook TempFile = Environ$("temp") & "\" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm" '复制范围并创建一个新工作簿以粘贴数据 rng.Copy Set TempWB = Workbooks.Add(1) With TempWB.Sheets(1) .Cells(1).PasteSpecial Paste:=8 .Cells(1).PasteSpecial xlPasteValues, , False, False .Cells(1).PasteSpecial xlPasteFormats, , False, False .Cells(1).Select Application.CutCopyMode = False On Error Resume Next .DrawingObjects.Visible = True .DrawingObjects.Delete On Error GoTo 0 End With '将工作表发布到htm文件 With TempWB.PublishObjects.Add( _ SourceType:=xlSourceRange, _ Filename:=TempFile, _ Sheet:=TempWB.Sheets(1).Name, _ Source:=TempWB.Sheets(1).UsedRange.Address, _ HtmlType:=xlHtmlStatic) .Publish (True) End With '从htm文件中读取所有数据并保存到RangetoHTML Set fso = CreateObject("Scripting.FileSystemObject") Set ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2) RangetoHTML = ts.ReadAll ts.Close RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", _ "align=left x:publishsource=") '关闭TempWB TempWB.Close SaveChanges:=False '删除在此函数中使用的htm文件 Kill TempFile Set ts = Nothing Set fso = Nothing Set TempWB = Nothing End Function
请注意,在获取HTML标记后,您需要使用
HTMLBody
属性,而不是纯文本的Body
属性。 -
您可以使用Range.Copy方法在Excel中复制所需的范围,然后通过使用Word编辑器将其直接粘贴到邮件正文中,查看
Inspector
类的WordEditor
属性。该属性返回显示的邮件的Microsoft Word文档对象模型。有关更多信息,请参阅第17章:处理项目正文。
英文:
There are two main ways of setting the message body based on the Excel data:
-
Build the HTML markup based on the worksheet content. That is basically what Ron described on the Mail Range/Selection in the body of the mail page where you can find the following sample code:
Function RangetoHTML(rng As Range) Dim fso As Object Dim ts As Object Dim TempFile As String Dim TempWB As Workbook TempFile = Environ$("temp") & "\" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm" 'Copy the range and create a new workbook to past the data in rng.Copy Set TempWB = Workbooks.Add(1) With TempWB.Sheets(1) .Cells(1).PasteSpecial Paste:=8 .Cells(1).PasteSpecial xlPasteValues, , False, False .Cells(1).PasteSpecial xlPasteFormats, , False, False .Cells(1).Select Application.CutCopyMode = False On Error Resume Next .DrawingObjects.Visible = True .DrawingObjects.Delete On Error GoTo 0 End With 'Publish the sheet to a htm file With TempWB.PublishObjects.Add( _ SourceType:=xlSourceRange, _ Filename:=TempFile, _ Sheet:=TempWB.Sheets(1).Name, _ Source:=TempWB.Sheets(1).UsedRange.Address, _ HtmlType:=xlHtmlStatic) .Publish (True) End With 'Read all data from the htm file into RangetoHTML Set fso = CreateObject("Scripting.FileSystemObject") Set ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2) RangetoHTML = ts.readall ts.Close RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", _ "align=left x:publishsource=") 'Close TempWB TempWB.Close savechanges:=False 'Delete the htm file we used in this function Kill TempFile Set ts = Nothing Set fso = Nothing Set TempWB = Nothing End Function
Note, after getting the HTML markup you need to use the
HTMLBody
property, not the plain textBody
. -
You can copy the required range in Excel by using the Range.Copy method and then paste directly to the message body by using the Word editor, see the
WordEditor
property of theInspector
class. The property returns the Microsoft Word Document Object Model of the message being displayed. See Chapter 17: Working with Item Bodies for more information.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论