Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 用剪贴板中的图片替换电子邮件中的文本_Excel_Vba_Outlook_Ms Word - Fatal编程技术网

Excel 用剪贴板中的图片替换电子邮件中的文本

Excel 用剪贴板中的图片替换电子邮件中的文本,excel,vba,outlook,ms-word,Excel,Vba,Outlook,Ms Word,我每天都会发一份报告。 其中有一个链接到某个区域的图像,我需要将其粘贴到电子邮件中并发送。 我已将电子邮件另存为outlook模板文件,必要时可对其进行修改。 我的代码是从Excel运行的。 我创建一个Outlook对象并从.oft模板文件打开Outlook电子邮件,然后我想找到标识符文本(在此处插入图像),并将其替换为Excel中的链接图像,该图像已从剪贴板复制。 我正在尝试将其添加为InLineShape,以便它在电子邮件正文中正常运行。 我一直在尝试使用电子邮件正文中定义的WordEdit

我每天都会发一份报告。
其中有一个链接到某个区域的图像,我需要将其粘贴到电子邮件中并发送。
我已将电子邮件另存为outlook模板文件,必要时可对其进行修改。
我的代码是从Excel运行的。
我创建一个Outlook对象并从.oft模板文件打开Outlook电子邮件,然后我想找到标识符文本(在此处插入图像),并将其替换为Excel中的链接图像,该图像已从剪贴板复制。 我正在尝试将其添加为InLineShape,以便它在电子邮件正文中正常运行。
我一直在尝试使用电子邮件正文中定义的WordEditor进行编辑。
我研究了HTML来实现它,但我认为WordEditor对象是一种更好的方法。 粘贴后,我需要将比例高度设置为0.75,以便正确显示。
从那里,只需点击发送

下面是我的代码的快速示例:

Set OutlookApp = CreateObject("Outlook.Application")
Set OutlookEmail = OutlookApp.CreateItemFromTemplate(templatePath) 
OutlookEmail.Display 'Just for code checking
ThisWorkbook.Worksheets("Email Sheet").Pictures("Summary Email Screenshot").Copy 
Set EmailText = OutlookEmail.GetInspector.WordEditor 
With EmailText.Range.Find 
    .ClearFormatting
    .Execute findText:="*INSERT IMAGE HERE*", MatchWholeWord:=True, MatchCase:=True, _
        MatchWildcards:=False, ReplaceWith:="^c", Replace:=wdReplaceOne
End With

EmailText.InlineShapes(EmailText.InlineShapes.count).ScaleHeight = 75 
'OutlookEmail.Send
问题出现在我发送前的最后一行。
所发生的情况是,它不是作为内联形状插入的,而是一个形状,以便它浮动在文本顶部。
我需要它作为一个InLineShape,这样的内容后,图像向下移动,显示,而不是被它覆盖。 我在论坛上嘲弄了一段时间,试图找到答案,但没有结果。

我非常精通Excel VBA,但这是我第一次尝试Outlook和Word VBA,请耐心听我说

默认情况下,粘贴图像时,Word将使用“从文件/Options/Advanced插入/粘贴图片”部分的设置“剪切、复制和粘贴”。因此,在某些机器上,图像可能粘贴为一个内线形状,而在其他机器上则粘贴为一个形状

如果只是在代码中粘贴,则使用
PasteSpecial
可以使用wdFloatOverText或wdInLine的相应WdOLEPlacement枚举值指定inline或with text wrap

由于粘贴命令来自替换文本
^c
,因此这种方法不适用于这种情况。这意味着需要更改选项设置。而且,为了让它对用户友好,在代码末尾应该将它改回原处

下面是一些示例代码,演示如何检查当前选项,必要时进行更改,并在过程结束时重置。我不熟悉通过Outlook对象模型使用Word,但我认为我已经正确地为
Word.Application
实例化了一个对象,这样在Excel或Outlook中执行的VBA将知道
选项的含义。除了最后一行,这应该在问题代码示例中的
Set
With
之间

Dim wrapType As Long
Dim wordApp as Object

Set wordApp = EMailText.Application
wrapType = wordApp.Options.PictureWrapType
If wrapType <> wdWrapMergeInline Then
    wordApp.Options.PictureWrapType = wdWrapMergeInline
End If
'Do other things, then reset

wordApp.Options.PictureWrapType = wrapType
Dim wrapType尽可能长
Dim wordApp作为对象
设置wordApp=EMailText.Application
wrapType=wordApp.Options.PictureWrapType
如果wrapType wdWrapMergeInline,则
wordApp.Options.PictureWrapType=wdWrapMergeInline
如果结束
'做其他事情,然后重置
wordApp.Options.PictureWrapType=wrapType

啊,我明白你的意思了。如果有帮助,我完全愿意使用除.Find和.Execute之外的方法。我使用它们只是为了找到我需要的文本。如果有一种方法可以将光标设置到文本所在的位置并将其删除,那么我可以使用PasteSpecial插入图像,避免选项设置和重置。@Bassta您可以使用“查找”而不需要替换。但是如果Find.Execute成功(返回布尔值),则为Find声明一个
Range
变量(
Dim rng as Word.Range:Set rng=EMailText.Content:With rng.Find
),然后
rng.Delete:rng.PasteSpecial…
。我想两者都可以,这将是一个个人品味的问题。我尝试了你的建议,它将图片作为内联粘贴,但发生了两件意想不到的事情:EMailText。Delete line删除了电子邮件中我的标识符之前的所有内容,并且在我的问题中概述的之前崩溃的行仍然失败,即使图像已粘贴按要求内联。@Bassta我看不出问题的相关部分有任何崩溃。如果正确使用范围变量,则不应删除“所有内容”——但为此,我需要查看您使用的代码。如果您仍然对这种方法感兴趣,最好在一个新问题中询问另一种方法,您可以在那里发布代码。我会留下这个,并将它标记为“答案”,因为它可能会帮助其他人…好吧,我通过一些尝试和错误发现了为什么在我的标识符之前的文本会被删除。事实证明,我需要将.MatchWildcards参数更改为false,这样就停止了,但我仍然无法缩放粘贴的图像。