【问题标题】:VBA exception handling fail?VBA异常处理失败?
【发布时间】:2013-01-10 01:07:51
【问题描述】:

我创建了这个脚本来在收到电子邮件时播放 wav 文件。关键是只在工作时间播放声音。如果在工作时间以外收到电子邮件,则不会播放任何声音。

Private Declare PtrSafe Function PlaySound Lib "winmm.dll" _
  Alias "PlaySoundA" (ByVal lpszName As String, _
  ByVal hModule As LongPtr, ByVal dwFlags As Long) As Long

Sub PlayWavFile(WavFileName As String, Wait As Boolean)
    If Dir(WavFileName) = "" Then Exit Sub ' no file to play
    If Wait Then ' play sound synchronously
        PlaySound WavFileName, 0, 0
    Else ' play sound asynchronously
        PlaySound WavFileName, 0, 1
    End If
End Sub

Sub PlayASoundDuringBusinessHours(Item As Outlook.MailItem)

  Dim SecondsSinceMidnight
  Dim SecondsPerHour
  Dim NineOclockAm
  Dim NineOclockPm
  Dim TooEarly
  Dim TooLate

  On Error GoTo ErrHandler:
  SecondsSinceMidnight = Timer
  SecondsPerHour = 60 * 60
  NineOclockAm = SecondsPerHour * 9
  NineOclockPm = SecondsPerHour * 21
  TooEarly = Timer < NineOclockAm
  TooLate = Timer > NineOclockPm

  If Not (TooEarly) And Not (TooLate) Then
    PlayWavFile "c:\windows\media\blahblahblah.wav", False
  End If

ExitProcedure:
  Exit Sub
ErrHandler:
    MsgBox Err.Description, _
    vbExclamation + vbOKCancel, _
    "Error: " & CStr(Err.Number)
    Resume ExitProcedure:
End Sub

我在 Outlook 中有一条规则,它在邮件进入时使用此脚本并且它有效!有一段时间,无论如何。

我不知道问题出在哪里,但有时此脚本中会出现错误,我从 Outlook 中收到一个对话框,显示“规则错误”和“操作失败”。发生这种情况时,使用此脚本的 Outlook 规则将被禁用。

我的异常处理是否不足?什么可能导致此错误,我该如何正确处理?

更新:

规则非常基本。除了执行脚本之外,它几乎没有什么作用:

Apply this rule after the message arrives
on this computer only
run Project.PlayASoundDuringBusinessHours

【问题讨论】:

  • +1。顺便说一句,您可以在一定程度上改进您的代码。去掉TooEarlyTooLate,添加OkToPlaySound = (SecondsSinceMidnight &gt; NineOclockAm) And (SecondsSinceMidnight &lt; NineOclockPm)。然后,您可以将您的 If 语句更改为 If (OkToPlaySound) Then。 (您消除了一个变量,实际上使用了您已经声明和设置的SecondsSinceMidnight,并使If 语句更具可读性。)顺便说一句,错误可能不在此脚本中,但可能在 Outlook 规则中;如果它在脚本代码中,您的 MsgBox 应该停止它(和 Outlook)以显示错误对话框。
  • 感谢您的评论。我已更新问题以提供有关规则的更多详细信息。
  • 你是对的。这是一个简单的规则。 :-) 您是否检查过 Windows 事件日志(尤其是应用程序事件)以查看 Outlook 是否发布了任何内容?您还可以更改错误处理程序以记录错误消息,而不是使用 MsgBox,Outlook 可能会抑制它,因为它会阻止 Outlook 本身执行直到关闭。
  • 根据您的建议,我查看了 Windows 事件日志,但没有找到任何线索。我将研究记录错误。谢谢。
  • 为什么不使用Application_NewMail事件而不是规则,并使用逻辑来确定是否使用您的子代码中的代码播放声音?

标签: vba outlook windows-7 outlook-2010


【解决方案1】:

不是直接回答这个问题,但我的解决方案是切换到 ItemAdd。

例子:

http://msdn.microsoft.com/en-us/library/office/aa171270(v=office.11).aspx http://www.outlookcode.com/article.aspx?id=62

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-18
    • 2018-12-06
    • 2013-01-15
    • 2016-12-12
    • 2020-04-12
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多