You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Excel工作表中的图片插入邮件正文?现有VBA代码求修改

解决Excel内嵌无路径图片插入邮件正文的VBA方案

原批量发邮件VBA代码无法处理从PowerPoint直接复制粘贴到Excel的PNG图片(这类图片未保存到本地系统,无可用访问路径)。以下是修改后的完整代码及关键说明:

关键修改说明

  • 保留原区域内的图片对象,不再删除DrawingObjects
  • 临时将内嵌图片保存到系统临时目录,生成可访问的绝对路径
  • 转换HTML中的图片相对路径为绝对路径,确保Outlook能正确加载
  • 邮件发送后自动清理临时文件及图片文件夹,避免磁盘残留
  • 优化代码兼容性,无需引用Outlook库即可运行

修改后的完整代码

Sub Mail_Macro_High_Productivity()

Dim EmailApp As Object
Dim EmailItem As Object
Dim tbl_rng As String
Dim rng As Range
Dim ToEmail, CcEmail, Subject, ghNewBody, sht_name, signature As String
Dim i As Integer
Dim htmlContent As String
Dim tempPath As String ' 记录临时文件路径用于后续清理

    i = 2
    
'//  遍历高效邮件模板表格,获取变量值  //

    Do While Sheets("High Productivity Mail Template").Range("B" & i) <> ""

        Set EmailApp = CreateObject("Outlook.Application")
        Set EmailItem = EmailApp.CreateItem(0) ' olMailItem=0,兼容未引用Outlook库的场景
        sht_name = Sheets("High Productivity Mail Template").Range("C" & i)
        tbl_rng = Sheets("High Productivity Mail Template").Range("D" & i)
        Set rng = Sheets(sht_name).Range(tbl_rng)
        Sheets("High Productivity Mail Template").Activate
        ToEmail = Sheets("High Productivity Mail Template").Range("F" & i)
        CcEmail = Sheets("High Productivity Mail Template").Range("G" & i)
        Subject = Sheets("High Productivity Mail Template").Range("H" & i)
    
        With EmailItem
            .To = ToEmail
            .CC = CcEmail
            .BCC = " "
            .Subject = Subject

            ghNewBody = "<font style=""font-family: Calibri; font-size: 11pt;""></font>" & _
                        Range("J" & i) & "<br>" & "<br>" & Range("K" & i) & Range("L" & i)

            signature = CreateObject("Scripting.FileSystemObject").GetFile("C:\Users\Joynewton.K\AppData\Roaming\Microsoft\Signatures\Joy Newton Kapildev.htm").OpenAsTextStream(1, -2).ReadAll

            ' 调用修改后的RangetoHTML,获取HTML内容和临时路径
            htmlContent = RangetoHTML(rng, tempPath)

            .HTMLBody = ghNewBody & "<br><br>" & htmlContent & _
             "<br>" & "<br>" & signature

            '.display  //  取消注释可在发送前预览邮件  //
            .send
        End With

        ' 清理临时文件和文件夹
        If tempPath <> "" Then
            On Error Resume Next
            Kill tempPath ' 删除htm文件
            Kill Replace(tempPath, ".htm", ".files\*.*") ' 删除files文件夹内的所有文件
            RmDir Replace(tempPath, ".htm", ".files") ' 删除files文件夹
            On Error GoTo 0
        End If

        Set EmailApp = Nothing
        Set EmailItem = Nothing
        Set rng = Nothing
        Sheets("High Productivity Mail Template").Range("M" & i).Value = "Mail Sent"
    
    i = i + 1

    Loop

End Sub


Function RangetoHTML(rng As Range, ByRef tempFilePath As String) As String

Dim fso As Object
Dim ts As Object
Dim TempWB As Workbook
Dim tempFolder As String

'//  复制区域并创建临时工作簿接收数据  //

    tempFolder = Environ$("temp") & "/"
    tempFilePath = tempFolder & 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
        ' 保留图片对象,不再删除
        On Error GoTo 0
    End With

'//  将工作表发布为htm文件  //

    With TempWB.PublishObjects.Add( _
        SourceType:=xlSourceRange, _
        Filename:=tempFilePath, _
        Sheet:=TempWB.Sheets(1).Name, _
        Source:=TempWB.Sheets(1).UsedRange.Address, _
        HtmlType:=xlHtmlStatic)
        .Publish (True)
    End With

'//  读取htm文件内容并调整图片路径为绝对路径  //

    Set fso = CreateObject("Scripting.FileSystemobject")
    Set ts = fso.GetFile(tempFilePath).OpenAsTextStream(1, -2)
    RangetoHTML = ts.ReadAll
    ts.Close
    
    ' 将相对路径替换为绝对file:///路径,确保Outlook能加载图片
    RangetoHTML = Replace(RangetoHTML, "src=""files/", "src=""file:///" & Replace(tempFolder, "/", "\") & Replace(tempFilePath, ".htm", ".files\") & "")
    RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", "align=left x:publishsource=")

'//  关闭临时工作簿  //

    TempWB.Close savechanges:=False
    
    Set ts = Nothing
    Set fso = Nothing
    Set TempWB = Nothing

End Function

内容的提问来源于stack exchange,提问作者Newton Kapildev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 15:17:01