【问题标题】:VBA Runtime error 91 / 4605 when no Email was opened beforeVBA 运行时错误 91 / 4605 之前没有打开电子邮件
【发布时间】:2019-09-06 18:44:00
【问题描述】:

我在 Excel 中有一个将表格复制到新电子邮件的代码:

Option Explicit

Public Sub TESTEMAIL()

Const olMailItem As Long = 0

    Dim StrFile, signature As String
    Dim OutApp As Outlook.Application
    Dim Outmail As Outlook.MailItem
    Set OutApp = CreateObject("Outlook.Application")
    Set Outmail = OutApp.CreateItem(olMailItem)

Dim myRecipient As Object

Set OutApp = CreateObject("Outlook.Application")
Set Outmail = OutApp.CreateItem(olMailItem)

Set OutApp = Nothing

Outmail.Display
Dim wordDoc As Word.Document
Set wordDoc = Outmail.GetInspector.WordEditor

Range("A1:E10").Copy

Dim p1 As Picture
Set p1 = ActiveSheet.Pictures.Paste
p1.Cut


With wordDoc.Application.Selection

    .Start = Len(Outmail.Body)      ' error n° 91 
    .End = .Start
    .PasteSpecial wdPasteBitmap     ' Error n° 4605 or Error n°91

End With

End Sub

开机后每次使用代码都会报错:

错误代码 91“对象变量或未设置块变量

大多数情况下,以前没有打开 Outlook,或者以前没有打开过新电子邮件。

有时我还会收到错误代码 4605,表示文档已锁定,无法修改。
2 个错误出现在最后,并在代码中进行了标记。 (错误可能发生在 2 个不同的行上)

有时一切正常,但只有在之前在 Outlook 中打开过新电子邮件时,(如果 Outlook 关闭则事件)。

任何线索为什么会这样以及如何解决问题?

【问题讨论】:

  • 您已经有一个引用 wordDoc 包含消息内容,因此您应该使用它而不是 Outmail.Body。如果粘贴为图片有问题,可以尝试使用Range.CopyPicture方法复制Excel内容。
  • 你想做什么?你已经设置了Set OutApp = Nothing然后`Outmail.Display`你有多个OutApp
  • @Tim Williams worddoc 的返回值与Outmail.Body 不同,我更改为Range.Copypicture,但仍然无法正常工作,而且图片也不太清晰。跨度>
  • @0m3r 我已经把Set OutApp = Nothing 拿出来了,这个问题没有区别。我正在尝试将范围作为图片粘贴到电子邮件中,但不知何故,当 Outlook 尚未打开电子邮件时它不起作用。
  • 请参阅下面的答案,如果对您有用,请告诉我。

标签: excel vba outlook ms-word


【解决方案1】:

这是你想要做的吗?

例子

Option Explicit
Public Sub TESTEMAIL()
    Dim OutApp As Outlook.Application
    Set OutApp = CreateObject("Outlook.Application")

    Dim Outmail As Outlook.MailItem
    Set Outmail = OutApp.CreateItem(olMailItem)

    Dim wordDoc As Word.Document
    Set wordDoc = Outmail.GetInspector.WordEditor

    Dim Sht As Excel.Worksheet
    Set Sht = ActiveWorkbook.Sheets("Sheet1")

    Dim rng As Range
    Set rng = Sht.Range("A1:E10")
        rng.CopyPicture Appearance:=xlScreen, Format:=xlPicture

    With Outmail
        .To = "0m3r@email.com"
        .CC = ""
        .BCC = ""
        .Subject = "Hello"
        .Display

         wordDoc.Paragraphs(1).Range.PasteSpecial Link:=False, _
                                       DataType:=wdPasteBitmap, _
                                       Placement:=wdFloatOverText, _
                                       DisplayAsIcon:=False


         wordDoc.Paragraphs(1).SpaceAfter = 20 ' add space to 12 points

         wordDoc.Range.InsertBefore "Hello 0m3r" & vbCr

         wordDoc.Paragraphs(1).SpaceAfter = 20 ' add space to 12 points


    End With

End Sub

Make sure to Reference to Microsoft Word & Outlook xx.x Object Library

MSDN Paragraphs.SpaceAfter property (Word)

MSDN Range.PasteAndFormat method (Word)

MSDN PasteAndFormat Method

MSDN WdPasteDataType enumeration (Word)

【讨论】:

  • 问题是我的整个代码是添加一个短文本(输入代码),然后是这张图片,然后是签名。通过调整您的代码,我遇到了类似的问题。而且我用这种方法得到的图片与我用我的代码得到的图片不同(不太清楚)......最后我仍然不明白我的代码是如何只在 Outlook 没有打开新电子邮件时带来问题的之前...
  • @Pierre44 如果你喜欢wdPasteBitmap 我已经更新了代码,还可以看看如何添加文本。我添加了更多链接来帮助您
  • 嗯,这正是我想做的,感谢您的链接和一些额外的研究,我更新了我的代码。 (所以我支持你)。但是它没有解释为什么会出现这个问题以及如何准确解决错误......但我不再需要这个了:)
猜你喜欢
  • 2022-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多