使用objWord.Selection将Excel内容粘贴到Outlook时出现错误91
Outlook约会粘贴Excel区域首次运行报错的修复方案
错误原因
运行时错误'91'(对象变量未设置)出现在objSel.PasteAndFormat (wdChartPicture)语句,核心原因是首次打开Outlook约会窗口时,内置的Word编辑器组件还未完全加载完毕,导致objWord.Selection无法获取有效对象。第二次运行时窗口已处于就绪状态,代码就能正常执行。
修复方案
1. 等待Word编辑器就绪
在Mymail.Display后添加循环检测,直到objInsp.WordEditor返回有效对象,避免操作未初始化的组件。
2. 强制变量声明
开启Option Explicit,避免未声明变量导致的隐含错误(原代码中testRange、myRange等未声明)。
3. 优化粘贴定位
确保光标定位到约会正文末尾,避免因焦点问题导致选择对象无效。
修正后的完整代码
Option Explicit ' 强制声明所有变量,减少隐含错误 Sub Meeting_InvitesNEW() Dim olApp As Outlook.Application Set olApp = Outlook.Application Dim ObjMail As Outlook.MailItem ' 补全原代码未声明的变量 Set ObjMail = olApp.CreateItem(olMailItem) Dim Mymail As Outlook.AppointmentItem Call GetData ' 显式声明范围变量 Dim testRange As Range Set testRange = Range("$A$10:$AD$500") Dim myRange As Range Set myRange = Selection ' 检查选择范围是否合规 If Intersect(testRange, myRange) Is Nothing Then MsgBox "You are not on a loan", vbCritical, "Read me" Exit Sub Else Worksheets("Manager County Info").Range("14:18").EntireRow.Hidden = False Application.ScreenUpdating = False Worksheets("Manager County Info").Range("D7:I18").Copy Set Mymail = olApp.CreateItem(olAppointmentItem) Mymail.Display Dim objItem As Object Dim objInsp As Outlook.Inspector Dim objDoc As Word.Document Dim objWord As Word.Application Set objItem = Mymail Set objInsp = objItem.GetInspector ' 循环等待Word编辑器加载完成,避免假死 Do While objInsp.WordEditor Is Nothing DoEvents Loop Set objDoc = objInsp.WordEditor Set objWord = objDoc.Application ' 设置约会属性 With Mymail .RequiredAttendees = Worksheets("Loans").Range("k" & ActiveCell.Row).Value .Subject = Worksheets("Loans").Range("B" & ActiveCell.Row).Value & " (LGI Builder LO - " & Worksheets("Loans").Range("K" & ActiveCell.Row).Value & ")" _ & " COE " & Worksheets("Loans").Range("W" & ActiveCell.Row).Value & " (" & Worksheets("Loans").Range("Q" & ActiveCell.Row).Value & ")" .Start = Worksheets("Loans").Range("M" & ActiveCell.Row).Value & " " & Format(Worksheets("Loans").Range("O" & ActiveCell.Row).Value, "h:mm") .Duration = 90 .Importance = olImportanceHigh .ReminderMinutesBeforeStart = 180 .MeetingStatus = olMeeting If Worksheets("Loans").Range("K" & ActiveCell.Row).Value = "Mario Cerrato" Then .BusyStatus = olBusy Else .BusyStatus = olFree End If End With ' 定位光标到正文末尾再粘贴 objWord.Selection.EndKey Unit:=wdStory objWord.Selection.PasteAndFormat wdChartPicture ' 清理资源 Application.CutCopyMode = False Set objWord = Nothing Set objDoc = Nothing Set objInsp = Nothing Set objItem = Nothing Set Mymail = Nothing Set ObjMail = Nothing Set olApp = Nothing Application.ScreenUpdating = True End If End Sub
额外注意事项
- 需在VBA编辑器中引用Microsoft Word Object Library和Microsoft Outlook Object Library(路径:工具 -> 引用)
- 原代码中
ObjMail变量未实际使用,可根据需求保留或删除 - 如果未引用Word库,可将
wdChartPicture替换为对应数值14,wdStory替换为6
内容的提问来源于stack exchange,提问作者MEC
相关产品推荐
相关产品推荐

