使用VBA从Excel到Outlook并使用CID将多个图像嵌入到电子邮件中

使用VBA从Excel到Outlook并使用CID将多个图像嵌入到电子邮件中,vba,outlook,Vba,Outlook,我正在尝试将几个图形(如PNG)从Excel VBA宏嵌入Outlook。 图像嵌入然而,它不是全部8个图像,而是第一个重复8次 Sub Test() Dim sheetNumber, size, i As Integer Dim chartNames(), FNames() As String Dim objChrt As ChartObject Dim myChart As Chart 'Activate Charts Sheet Shee

我正在尝试将几个图形(如PNG)从Excel VBA宏嵌入Outlook。 图像嵌入然而,它不是全部8个图像,而是第一个重复8次

Sub Test()
    Dim sheetNumber, size, i As Integer
    Dim chartNames(), FNames() As String
    Dim objChrt As ChartObject
    Dim myChart As Chart


    'Activate Charts Sheet
    Sheets("GRAFICAS").Activate
    'Calculate Number of Charts in Sheet
    chartNumber = ActiveSheet.ChartObjects.Count
    'Redimension Arrays to fit all Chart Export Names
    ReDim chartNames(chartNumber)
    ReDim FNames(chartNumber)
    'Loops through all the charts in the GRAFICAS sheet
    For i = 1 To chartNumber
        'Select chart with index i
        Set objChrt = ActiveSheet.ChartObjects(i)
        Set myChart = objChrt.Chart
        'Generate a name for the chart
        chartNames(i) = "myChart" & i & ".png"

        On Error Resume Next
        Kill ThisWorkbook.Path & "\" & chartNames(i)
        On Error GoTo 0
        'Export Chart
        myChart.Export Filename:=Environ$("TEMP") & "\" & chartNames(i), Filtername:="PNG"
        'Save path to exported chart
        FNames(i) = Environ$("TEMP") & "\" & chartNames(i)
    Next i
   'Declare the Object variables for Outlook.
    Dim objOutlook As Object
    'Verify Outlook is open.
    On Error Resume Next
    Set objOutlook = GetObject(, "Outlook.Application")
    'If Outlook is not open, end the Sub.
    If objOutlook Is Nothing Then
        Err.Clear
         MsgBox _
        "Cannot continue, Outlook is not open.", , _
        "Please open Outlook and try again."
        Exit Sub
    'Outlook is determined to be open, so OK to proceed.
    Else
        'Establish an Object variable for a mailitem.
        Dim objMailItem As Object
        Set objMailItem = objOutlook.CreateItem(0)
        'Build the mailitem.
        Dim NewBody As String
            On Error Resume Next
            With objMailItem
                .To = "dummy@test.com"
                .Subject = "Testing Lesson 31 email code"
                .Importance = 1 'Sets it as Normal importance (Low = 0 and High = 2)
                'Change the Display command to Send without reviewing the email.
               ' .Display
            End With
           For i = 1 To chartNumber
               objMailItem.Attachments.Add FNames(i)
               'Put together the HTML to embed
                NewBody = NewBody + HTMLcode & "<div align=center>" & "<IMG src=cid: myChart" & i & ".png></img>" & "</div>"
            Next
            MsgBox NewBody
               'Set the HTML body
                objMailItem.HTMLBody = NewBody
                'Display email before sending
                objMailItem.Display
    'Close the If block.
    End If
        Kill Fname
End Sub
子测试()
尺寸表编号、尺寸、i为整数
Dim chartNames(),FNames()作为字符串
作为图表对象的Dim objChrt
将我的图表变暗为图表
'激活图表页
工作表(“GRAFICAS”)。激活
'计算工作表中的图表数
chartNumber=ActiveSheet.ChartObjects.Count
'重新确定数组的尺寸以适合所有图表导出名称
ReDim图表名称(图表编号)
ReDim FNames(图表编号)
'循环浏览GRAFICAS表中的所有图表
对于i=1到图表编号
'选择索引为i的图表
Set objChrt=ActiveSheet.ChartObjects(i)
设置myChart=objChrt.Chart
'为图表生成名称
图表名称(i)=“myChart”&i&“.png”
出错时继续下一步
终止此工作簿。路径和图表名(i)
错误转到0
"出口图表"
myChart.Export文件名:=environo$(“TEMP”)和“\”&图表名(i),过滤器名:=“PNG”
'将路径保存到导出的图表
FNames(i)=环境$(“临时”)和“\”&图表名称(i)
接下来我
'声明Outlook的对象变量。
将对象视为对象
'验证Outlook是否已打开。
出错时继续下一步
Set objOutlook=GetObject(,“Outlook.Application”)
'如果Outlook未打开,请结束Sub。
如果objOutlook什么都不是,那么
呃,明白了
MsgBox_
“无法继续,Outlook未打开。”_
“请打开Outlook并重试。”
出口接头
'Outlook已确定为打开状态,请单击“确定”继续。
其他的
'为邮件项建立对象变量。
Dim objMailItem作为对象
设置objMailItem=objOutlook.CreateItem(0)
'生成邮件项。
像弦一样暗淡的新手
出错时继续下一步
带有objMailItem
.To=”dummy@test.com"
.Subject=“测试第31课电子邮件代码”
.Importance=1'将其设置为正常重要性(低=0,高=2)
'将显示命令更改为发送而不查看电子邮件。
"展示,
以
对于i=1到图表编号
objMailItem.Attachments.Add FNames(i)
'将要嵌入的HTML放在一起
NewBody=NewBody+HTMLcode&&&
下一个
MsgBox新车身
'设置HTML正文
objMailItem.HTMLBody=新车身
'发送前显示电子邮件
objMailItem.Display
'关闭If块。
如果结束
杀死Fname
端接头
MsgBox新车身输出:

最后一封电子邮件如下所示:

它应该显示所有图表,一个在另一个下面,但是它只需要myChart1.png并重复8次,尽管输出了NewBody

我做错了什么?我正在使用Outlook 2013和Excel 2013


更新:我添加了另一个图像,在本例中,它似乎重复了我添加的最后一个图像9次(与附加图像的数量相同)。我猜这是cid的问题,也许ID不是唯一的

必须在附件上适当设置PR_ATTACH_CONTENT_ID属性,以匹配cid属性的值:

Set attach = objMailItem.Attachments.Add(FNames(i))
'Put together the HTML to embed
Dim cid
cid = "myChart" & i & ".png"
NewBody = NewBody + HTMLcode & "<div align=center>" & "<IMG src=cid:" & cid & "</img>" & "</div><br><br>"
   Call attach.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x3712001F", cid)
Set attach=objMailItem.Attachments.Add(FNames(i))
'将要嵌入的HTML放在一起
暗淡cid
cid=“myChart”&i&“.png”
NewBody=NewBody+HTMLcode&“和”&“

” 调用attach.PropertyAccessor.SetProperty(“http://schemas.microsoft.com/mapi/proptag/0x3712001F“,cid)