Ошибка обработки исключений VBA?

Я создал этот скрипт для воспроизведения файла 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

person Poisonous Llama    schedule 26.01.2013    source источник
comment
+1. Кроме того, вы можете немного улучшить свой код. Избавьтесь от TooEarly и TooLate и добавьте OkToPlaySound = (SecondsSinceMidnight > NineOclockAm) And (SecondsSinceMidnight < NineOclockPm). Затем вы можете изменить свой оператор If на If (OkToPlaySound) Then. (Вы удаляете одну переменную и фактически используете SecondsSinceMidnight, который вы уже объявили и установили, и делаете оператор If более читаемым.) Ошибка может быть не в этом скрипте, BTW, но может быть в правиле Outlook; если это было в коде сценария, ваш MsgBox должен остановить его (и Outlook), чтобы отобразить диалоговое окно с ошибкой.   -  person Ken White    schedule 26.01.2013
comment
Спасибо за ваш комментарий. Я обновил вопрос, чтобы предоставить более подробную информацию о правиле.   -  person Poisonous Llama    schedule 26.01.2013
comment
Ты прав. Это простое правило. :-) Проверяли ли вы журнал событий Windows (в частности, события приложений), чтобы узнать, публикует ли что-нибудь Outlook? Вы также можете изменить свой обработчик ошибок, чтобы он регистрировал сообщение об ошибке вместо использования MsgBox, которое Outlook может подавлять, поскольку это остановит выполнение самого Outlook до закрытия.   -  person Ken White    schedule 26.01.2013
comment
По вашему совету я просмотрел журнал событий Windows, но не нашел никаких зацепок. Я посмотрю, как зарегистрировать ошибку. Спасибо.   -  person Poisonous Llama    schedule 26.01.2013
comment
Вместо правила, почему бы не использовать событие Application_NewMail и использовать логику, чтобы определить, воспроизводить ли звук или нет с кодом, который у вас есть в вашем подразделе?   -  person Luke    schedule 03.06.2013


Ответы (1)


Не прямой ответ на вопрос, но мое решение состояло в том, чтобы переключиться на ItemAdd.

Примеры:

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

person niton    schedule 06.02.2013