【问题标题】:Outlook vba errorOutlook vba 错误
【发布时间】:2014-05-21 12:20:43
【问题描述】:

我在 Outlook VBA 方面不是很有经验。我正在使用 Outlook 2007,并且我正在尝试编写一个 VBA 代码,该代码将在我收到任何电子邮件时运行。此代码将读取主题行并将电子邮件详细信息保存在 Excel 文件中,这些文件的主题中包含“Update***”一词。该代码仅第一次工作,当我收到另一封主题为 Update*** 的电子邮件时,代码显示错误 462。我检查了所有功能并将它们指向对象。然后代码在第二次运行时显示错误13。我更正了错误 13,但现在当我收到电子邮件时,VBA 既不更新 excel 文件也不显示任何错误消息。我的 Outlook 宏已启用,并且我确保它未处于设计模式。

在 Outlook 会话中粘贴的代码:

    'Option Explicit

    Private WithEvents myOlItems  As Outlook.Items


Private Sub Application_Startup()
Dim olApp As Outlook.Application
Dim objNS As Outlook.NameSpace
  Set olApp = Outlook.Application
  Set objNS = olApp.GetNamespace("MAPI")
  Set myOlItems = objNS.GetDefaultFolder(olFolderInbox).Items
End Sub

Private Sub myOlItems_ItemAdd(ByVal Item As Object)

On Error GoTo ErrorHandler

Dim Msg As Outlook.MailItem
Dim appExcel As Excel.Application
Dim wkb As Excel.Workbook
Dim wks As Excel.Worksheet
Dim rng As Excel.Range
Dim strSheet As String
Dim strPath As String
Dim intRowCounter As Integer
Dim intColumnCounter As Integer


strSheet = "AppData.xls"
strPath = "C:\Email\"
strSheet = strPath & strSheet

If TypeName(Item) = "MailItem" Then
Set Msg = Item
If InStr(Msg.Subject, "Update***") <> 0 Then

Set appExcel = CreateObject("Excel.Application")
appExcel.Workbooks.Open (strSheet)
Set wkb = appExcel.ActiveWorkbook
Set wks = wkb.Sheets(1)
wks.Activate

intRowCounter = CInt(wks.Cells.Find("*", wks.Range("A1"), , , xlByRows,     xlPrevious).Row) 'substitute of this line of code :intRowCounter = wks.UsedRange.Rows.Count


appExcel.Application.Visible = True



intColumnCounter = 1
intRowCounter = intRowCounter + 1
Set rng = wks.Cells(intRowCounter, intColumnCounter)
rng.Value = Msg.To
intColumnCounter = intColumnCounter + 1
Set rng = wks.Cells(intRowCounter, intColumnCounter)
rng.Value = Msg.SenderEmailAddress
intColumnCounter = intColumnCounter + 1
Set rng = wks.Cells(intRowCounter, intColumnCounter)
rng.Value = Msg.Subject
intColumnCounter = intColumnCounter + 1
Set rng = wks.Cells(intRowCounter, intColumnCounter)
rng.Value = Msg.SentOn
intColumnCounter = intColumnCounter + 1
Set rng = wks.Cells(intRowCounter, intColumnCounter)
rng.Value = Msg.ReceivedTime





End If
End If
ProgramExit:
Exit Sub
ErrorHandler:
MsgBox Err.Number & " - " & Err.Description
Resume ProgramExit
appExcel.Quit


wkb.Save
appExcel.Quit
Set appExcel = Nothing
Set wkb = Nothing
Set wks = Nothing
Set rng = Nothing
Set Msg = Nothing
Set Item = Nothing


End Sub'

【问题讨论】:

  • appExcel.Quit 在您保存之前? wkb.Save。实际上,您在哪里保存文件并关闭它? Resume ProgramExit 将确保保存不会发生。
  • 在开发时删除On Error GoTo ErrorHandler。它会掩盖你得到的任何错误,你不会知道为什么。

标签: excel vba outlook


【解决方案1】:

将您的错误处理更改为此

'
'~~> Rest of the code
'

wkb.Save

End If
End If

ProgramExit:
    On Error Resume Next
    wkb.Close (False)

    appExcel.Quit

    Set Rng = Nothing
    Set wks = Nothing
    Set wkb = Nothing
    Set appExcel = Nothing
    On Error GoTo 0

    Set Msg = Nothing
    Set Item = Nothing

    Exit Sub
ErrorHandler:
    MsgBox Err.Number & " - " & Err.Description
    Resume ProgramExit

【讨论】:

  • 我使用了On Error Resume Next,以防程序首先执行ErrorHandler:并且没有打开Excel/Workbook实例。因此它会在执行ProgramExit: 时忽略它
  • 我希望wkb.SaveIf-endif 内?查看更新后的帖子
  • 试过但同样的事情又发生了..没有错误没有更新。
  • 单步执行代码并检查代码是否在If InStr(Msg.Subject, "Update***") &lt;&gt; 0 Then 行之后执行,或者在该行之后放置一个简单的'Msgbox "Hello"`,看看你是否看到那个消息框?
  • 非常感谢 shiddharth.. 这段代码有效,但我不知道为什么,但 intRowCounter = CInt(wks.Cells.Find("*", wks.Range("A1"), , , ) 行xlByRows, xlPrevious).Row) 取值 811 并从该行开始粘贴数据。你的 msgBox 想法真的很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 2014-03-21
  • 1970-01-01
  • 1970-01-01
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多