【问题标题】:Closing an Excel Application using Outlook VBA after using an Excel function使用 Excel 函数后使用 Outlook VBA 关闭 Excel 应用程序
【发布时间】:2019-11-26 20:10:24
【问题描述】:

我正在为 Outlook 开发一种“BOT”(使用 Outlook VBA),通过邮件接收信息,拆分邮件正文,将其粘贴到 Excel 上并执行 Excel 宏。

添加调用 Excel 宏的部分后,我得到 ​​p>

'1004 - 应用程序定义或对象定义错误'

如果我第二次运行它。

xlApp.Application.Run "AINT.Cali_B_Click"

即使我将 Excel 变量设置为空并使用 .close.quit,Excel 仍在运行。

如何结束保持 Excel 打开的应用程序引用?

这是我的完整代码:

Private Sub inboxItems_ItemAdd(ByVal Item As Object)
    On Error GoTo ErrorHandler
    Dim Msg         As Outlook.MailItem
    Dim MessageInfo
    Dim Result
    Dim splitter()  As String
    Dim splitter2() As String
    Dim loopH As String
    Dim str         As Variant
    Dim LoopCali    As Integer
    Dim i, j          As Integer
    Dim xlApp      As Object
    Dim sourceWB   As Object
    Dim Header, QuoteSTG, AINT, Treinamento As Object
    Dim strFile, file_name    As String
    Dim shellcom As String

    i = 1

    If TypeName(Item) = "MailItem" Then
        If InStr(Item.Subject, "BOT") > 0 Then
            splitter = Split(Item.Body, vbCrLf)

            Set xlApp = CreateObject("Excel.Application")
            strFile = "C:\Users\e1257539\Desktop\SMOBOT\SMO_TOOL_BOT.xlsm"
            With xlApp
                .Visible = False
                .EnableEvents = False
                .DisplayAlerts = False
            End With
            Set sourceWB = Workbooks.Open(strFile)
            sourceWB.Activate
            Set Header = sourceWB.Sheets(4)
            Set QuoteSTG = sourceWB.Sheets(13)
            Set AINT = sourceWB.Sheets(7)
            Set Treinamento = sourceWB.Sheets(10)

            file_name = QuoteSTG.Range("A" + CStr(QuoteSTG.Range("B1").Value2)).Value2
            QuoteSTG.Range("A" + CStr(QuoteSTG.Range("B1").Value2)).Value2 = ""

            If splitter(2) = "Calibração" Then
                loopH = splitter(26)
                LoopCali = CInt(loopH)
                sourceWB.Save
                Header.Range("D6").Value2 = splitter(22)
                Header.Range("D8").Value2 = splitter(12)
                Header.Range("F4").Value2 = "AINT"
                Header.Range("F3").Value2 = "EXW"
                Header.Range("C2").Value2 = file_name
                Header.Range("C4").Value2 = "Calibração"
                Header.Range("L2").Value2 = "30"
                Header.Range("K12").Value2 = Item.Subject '< criar string?
                j = 40
                For i = 1 To LoopCali
                    splitter2 = Split(splitter(j), "-")
                    AINT.Range("N7").Value2 = splitter2(0)
                    AINT.Range("N13").Value2 = splitter2(1)
                    j = j + 2
                    If splitter(j) <> "" Then
                        AINT.Range("N14").Value2 = splitter(j)
                    End If 
                    j = j + 2
                    If splitter(j) <> "" Then
                        AINT.Range("N16").Value2 = splitter(j)
                    End If
                    j = j + 2
                    If splitter(j) <> "" Then
                        If splitter2(0) <> "RMT" Then
                            AINT.Range("N15").Value2 = splitter(j)
                        End If
                    End If
                    j = j + 2
                    If splitter(j) <> "" Then
                        AINT.Range("N17").Value2 = splitter(j)
                    End If
                    j = j + 2
                    xlApp.Application.Run "AINT.Cali_B_Click" '< calling the excel sub 
                Next i

            End If

        End If

    End If

    'Closing excel
    MkDir "C:\Users\e1257539\Desktop\SMOBOT\" + file_name
    sourceWB.SaveAs FileName:="C:\Users\e1257539\Desktop\SMOBOT\" + file_name + "\" + file_name
    sourceWB.Close (False)
    xlApp.Quit
    Set xlApp = Nothing
    Set sourceWB = Nothing
    Set AINT = Nothing
    Set QuoteSTG = Nothing
    Set Header = Nothing

ErrorHandler:
    MsgBox Err.Number & " - " & Err.Description
    If Not sourceWB Is Nothing Then
        sourceWB.Close (False)
    End If
    If Not xlApp Is Nothing Then
        xlApp.Quit
    End If
    Set xlApp = Nothing
    Set sourceWB = Nothing
    Set AINT = Nothing
    Set QuoteSTG = Nothing
    Set Header = Nothing
End Sub

【问题讨论】:

  • 如果您使 Excel 可见,您可能会看到问题所在。听起来真正的问题可能出在您的 Excel VBA 中,而不是您的 Outlook 代码中。
  • 您尚未指定包含宏的工作簿...尝试xlApp.Application.Run sourceWB.Name &amp; "AINT.Cali_B_Click" 您可能需要稍微使用该语法...使用您的即时窗口作为指南。
  • @TimWilliams @MBB70 我看了一下 excel 宏,但是它们只是将信息从一个单元格移动到另一个单元格,但我会进一步看一下。宏运行良好,即使没有指定工作簿,我也尝试使用xlApp.Application.Run sourceWB.Name &amp; "AINT.Cali_B_Click",但宏不适用于此。我尝试使用 Shell "taskkill /f /im excel.exe", vbHide ,结束 Excel 任务,但是当第二次运行任务终止时,我收到错误“462 - 远程服务器机器不存在或不可用”
  • 您在工作簿名称和宏名称之间缺少!。如果工作簿名称有空格,则需要用单引号括起来。

标签: excel vba outlook


【解决方案1】:

结果是在 VBA 代码上使用 xlApp.Application.Run "AINT.Cali_B_Click"xlApp.Application.Run sourceWB.Name &amp; "AINT.Cali_B_Click" 保留打开的引用。

在不打开任何代码的情况下调用代码的方法是使用CallByName

Call CallByName(AINT, "Cali_B_Click", VbMethod)

这样,VBA 代码可以调用函数并根据需要运行多次,而不会出现当前错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 2016-11-25
    • 2018-03-24
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 2012-09-13
    相关资源
    最近更新 更多