【发布时间】: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 & "AINT.Cali_B_Click"您可能需要稍微使用该语法...使用您的即时窗口作为指南。 -
@TimWilliams @MBB70 我看了一下 excel 宏,但是它们只是将信息从一个单元格移动到另一个单元格,但我会进一步看一下。宏运行良好,即使没有指定工作簿,我也尝试使用
xlApp.Application.Run sourceWB.Name & "AINT.Cali_B_Click",但宏不适用于此。我尝试使用Shell "taskkill /f /im excel.exe", vbHide,结束 Excel 任务,但是当第二次运行任务终止时,我收到错误“462 - 远程服务器机器不存在或不可用” -
您在工作簿名称和宏名称之间缺少
!。如果工作簿名称有空格,则需要用单引号括起来。