Excel VBA 发送Outlook邮件引用工作表范围触发编译错误问题求助
问题根因
编译错误「sub or function not defined」的触发原因非常明确:你代码中调用的
RangeToHTML既不是Excel内置方法,也不是Outlook提供的公用方法,属于需要自己实现的自定义函数,当前VBA工程中没有对应的函数定义,所以无法识别调用逻辑。
解决步骤
- 第一步:在存放
sendEmail宏的同一个VBA模块中,添加RangeToHTML函数的标准实现代码:
Function RangeToHTML(rng As Range) As String 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 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 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.Close savechanges:=False Kill TempFile Set ts = Nothing Set fso = Nothing Set TempWB = Nothing End Function
- 第二步:修正原
sendEmail宏的两处问题- 你原来的逻辑会直接用转换后的表格覆盖掉开头的问候语,需要调整HTML拼接逻辑
- 直接用常量对应值
12替代xlCellTypeVisible,可以避免部分场景下的常量未定义问题
修正后的完整sendEmail代码如下:
Sub sendEmail() Application.OnTime Now + TimeValue("01:00:00"), "sendEmail" Dim EmailApp As Outlook.Application Set EmailApp = New Outlook.Application Dim EmailItem As Outlook.MailItem Set EmailItem = EmailApp.CreateItem(olMailItem) Dim rng As Range EmailItem.To = "test@gmail.com" EmailItem.CC = "test@yahoo.com" EmailItem.Subject = "Update" ' 筛选可见单元格 Set rng = Sheets("Sheet2").Range("B2:F22").SpecialCells(12) ' 拼接问候语和表格内容 EmailItem.HTMLBody = "Hi, Please see the below:<br><br>" & RangeToHTML(rng) EmailItem.Send ' 释放对象避免内存残留 Set EmailItem = Nothing Set EmailApp = Nothing End Sub
- 第三步:可选校验项
如果你之前没有添加Outlook引用,需要打开VBA编辑器→【工具】→【引用】,勾选「Microsoft Outlook XX.X Object Library」(XX.X对应你本地安装的Office版本号)后再运行代码。
内容的提问来源于stack exchange,提问作者Zohan
相关产品推荐
相关产品推荐

