Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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
Outlook在使用Excel VBA发送邮件时有时会崩溃_Excel_Vba_Outlook - Fatal编程技术网

Outlook在使用Excel VBA发送邮件时有时会崩溃

Outlook在使用Excel VBA发送邮件时有时会崩溃,excel,vba,outlook,Excel,Vba,Outlook,我在Excel中使用VBA代码执行以下操作: 检索订单请求 拉取SAP报告 验证订单请求 连接到SAP进行事务处理 发送电子邮件 循环(从#4)直到完成所有订单 在回复第二封电子邮件时,发送电子邮件部分可能有15%的时间崩溃。我可以通过确认以下错误继续自动化流程,重新启动Outlook,然后脚本继续运行,就像什么都没有发生一样 我想这可能是这个机器人的内存问题,因为只有这个机器人失败了。我确实理解,在代码点击End Sub之后,所有变量都应该从内存中清除 该代码仅用于应答。它在SAP事务完成后

我在Excel中使用VBA代码执行以下操作:

  • 检索订单请求
  • 拉取SAP报告
  • 验证订单请求
  • 连接到SAP进行事务处理
  • 发送电子邮件
  • 循环(从#4)直到完成所有订单
  • 在回复第二封电子邮件时,发送电子邮件部分可能有15%的时间崩溃。我可以通过确认以下错误继续自动化流程,重新启动Outlook,然后脚本继续运行,就像什么都没有发生一样

    我想这可能是这个机器人的内存问题,因为只有这个机器人失败了。我确实理解,在代码点击
    End Sub
    之后,所有变量都应该从内存中清除

    该代码仅用于应答。它在SAP事务完成后被调用

    Sub-EmailReply()
    Application.ScreenUpdating=False
    呼叫开放关税
    Dim olApp作为Outlook.Application
    将命名空间设置为Outlook.Namespace
    将对象所有者设置为Outlook.Recipient
    将拓扑文件夹设置为Outlook.MAPIFolder
    以Outlook.MailItem的形式发送邮件
    我想我会坚持多久
    将wdDoc设置为Word.Document
    Dim EmailAddress作为对象
    Dim fdr_未作为Outlook.MAPIFolder处理
    Dim fdr_挂起为Outlook.Mapi文件夹
    作为Outlook.Mapi文件夹处理的Dim fdr_
    设置myNameSpace=Outlook.Application.GetNamespace(“mapi”)
    Set objOwner=myNameSpace.CreateRecipient(“retailrma@company.com")
    解决问题
    如果是objOwner,那么解决了
    Set topOlFolder=myNameSpace.GetSharedDefaultFolder(objOwner,olFolderInbox)
    如果结束
    设置fdr_Unprocessed=topOlFolder.Folders(“RMA-未处理”)
    设置fdr_Pending=topOlFolder.Folders(“RMA-Pending”)
    设置fdr_Processed=topOlFolder.Folders(“RMA-已处理”)
    对于fdr_中的每个oLMail未处理项
    如果(oLMail.Subject=范围(“电子邮件主题”)。文本和格式(oLMail.ReceivedTime,“中间时间”)=格式(范围(“电子邮件日期”)。文本,“中间时间”)和oLMail.SenderEmailAddress=范围(“电子邮件地址”)。文本)_
    或者(oLMail.Subject=范围(“电子邮件主题”)。文本和格式(oLMail.ReceivedTime,“中间时间”)=格式(范围(“电子邮件日期”)。文本,“中间时间”))
    '如果可以找到电子邮件,则回复电子邮件或发送电子邮件
    '将电子邮件模板工作表上的副本范围定义为word文档
    暗拷贝范围作为范围
    'Set wdDoc=oLMail.GetInspector.WordEditor
    “确定是否应以英语或法语回复电子邮件
    如果范围(“电子邮件语言”)=“En”,则
    第一行=3
    第一列=3
    LastRow=246
    LastColumn=9
    ElseIf范围(“电子邮件语言”)=“Fr”然后
    第一行=3
    第一列=11
    LastRow=246
    LastColumn=16
    如果结束
    工作表(“电子邮件模板”)。选择
    工作表(“电子邮件模板”)。范围(单元格(第一行,第一列),单元格(最后行,最后列))。自动筛选字段:=1,标准1:=“显示”
    Set replyll=oLMail.replyll
    设置EmailAddress=范围(“电子邮件地址”)
    设置CopyRange=范围(单元格(第一行,第一列),单元格(最后行,最后列))。特殊单元格(xlCellTypeVisible)
    '没有电子邮件地址时的错误处理
    如果EmailAddress=0,则
    RMAStatus=“无效的电子邮件地址”
    Application.ScreenUpdating=True
    出口接头
    如果结束
    答复
    .To=电子邮件地址
    .CC=”retailrma@company.com"
    .展示
    .BodyFormat=olFormatHTML
    设置wdDoc=oLMail.GetInspector.WordEditor
    复制范围,复制
    wdDoc.Application.Selection.PasteAndFormat Type:=WDFormatOriginalFormat'将已批准/未批准的IMEI粘贴到outlook回复电子邮件中
    .发送
    以
    '将电子邮件移动到已处理的文件夹
    oLMail.Move fdr_已处理
    '重置电子邮件模板
    工作表(“电子邮件模板”)。范围(单元格(第一行,第一列),单元格(最后行,最后列))。自动筛选字段:=1
    转到ExitSendEmail
    如果结束
    下一封邮件
    ExitSendEmail:
    Application.ScreenUpdating=True
    端接头
    
    首先,确保在代码中正确定义了所有对象:

    Dim oLNameSpace As Outlook.Namespace
    
    但在代码的后面部分使用了另一个对象:

     Set myNameSpace = Outlook.Application.GetNamespace("mapi")
    
    另一个可能的薄弱环节是用于编辑电子邮件的Word对象模型

    Set wdDoc = oLMail.GetInspector.WordEditor
    
    尝试改用
    MailItem
    类的属性

    您还可以在每次迭代之间添加延迟。有关更多信息,请参阅函数。下面的示例使用
    定时器
    功能暂停应用程序。该示例还使用
    DoEvents
    在暂停期间让位于其他进程

    Dim PauseTime, Start, Finish, TotalTime
    If (MsgBox("Press Yes to pause for 5 seconds", 4)) = vbYes Then
        PauseTime = 5    ' Set duration.
        Start = Timer    ' Set start time.
        Do While Timer < Start + PauseTime
            DoEvents    ' Yield to other processes.
        Loop
        Finish = Timer    ' Set end time.
        TotalTime = Finish - Start    ' Calculate total time.
        MsgBox "Paused for " & TotalTime & " seconds"
    Else
        End
    End If
    
    Dim暂停时间、开始、完成、总时间
    如果(MsgBox(“按Yes暂停5秒”,4))=vbYes,则
    暂停时间=5'设置持续时间。
    开始=计时器“设置开始时间。
    定时器<启动+暂停时间时执行
    DoEvents对其他流程的产量。
    环
    完成=定时器设置结束时间。
    TotalTime=完成-开始'计算总时间。
    MsgBox“暂停时间”&总时间和“秒”
    其他的
    终点
    如果结束
    
    可能不相关,但
    工作表(“电子邮件模板”)。范围(单元格(第一行,第一列),单元格(最后行,最后列))。自动筛选字段:=1
    为。您需要为内部
    单元格
    调用限定工作表。您所说的“Outlook崩溃”是什么意思?您是否看到运行时错误?或者Outlook应用程序死掉了?你有不同的v