25

Outlook(VBA)で特定のコードを30分ごとに実行したい。

また、コードの実行時に Outlook ユーザーが邪魔されることはありません。バックエンドでのみ実行する必要があります。

というイベントがありApplication_Reminderます。Outlook でリマインダーが発生するたびに実行されます。ただし、これにはまだユーザーの操作が含まれます。完全なバックエンド プロシージャが必要です。

4

3 に答える 3

24

http://www.outlookcode.com/threads.aspx?forumid=2&messageid=7964

次のコードを ThisOutlookSession モジュールに配置します ([ツール] -> [マクロ] -> [VB エディター])。

Private Sub Application_Quit()
  If TimerID <> 0 Then Call DeactivateTimer 'Turn off timer upon quitting **VERY IMPORTANT**
End Sub

Private Sub Application_Startup()
  MsgBox "Activating the Timer."
  Call ActivateTimer(1) 'Set timer to go off every 1 minute
End Sub

次のコードを新しい VBA モジュールに配置します。

Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerfunc As Long) As Long
Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long

Public TimerID As Long 'Need a timer ID to eventually turn off the timer. If the timer ID <> 0 then the timer is running

Public Sub ActivateTimer(ByVal nMinutes As Long)
  nMinutes = nMinutes * 1000 * 60 'The SetTimer call accepts milliseconds, so convert to minutes
  If TimerID <> 0 Then Call DeactivateTimer 'Check to see if timer is running before call to SetTimer
  TimerID = SetTimer(0, 0, nMinutes, AddressOf TriggerTimer)
  If TimerID = 0 Then
    MsgBox "The timer failed to activate."
  End If
End Sub

Public Sub DeactivateTimer()
Dim lSuccess As Long
  lSuccess = KillTimer(0, TimerID)
  If lSuccess = 0 Then
    MsgBox "The timer failed to deactivate."
  Else
    TimerID = 0
  End If
End Sub

Public Sub TriggerTimer(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idevent As Long, ByVal Systime As Long)
  MsgBox "The TriggerTimer function has been automatically called!"
End Sub

キーポイント:

1) このタイマー機能では、特定のウィンドウが開いている必要はありません。バックグラウンドで動作します

2) アプリケーションを閉じるときにタイマーを無効にしないと、クラッシュする可能性があります

3) この例では、起動時にタイマーがアクティブになっていることを示していますが、別のイベントによって簡単に呼び出すこともできます。

4) 起動時にタイマーが有効になったことを示すメッセージ ボックスが表示されない場合は、マクロのセキュリティ設定が高すぎます。

5) 時間間隔の 1 回の反復後にタイマーを非アクティブ化するには、次を追加します。 If TimerID <> 0 Then Call DeactivateTimer サブ TriggerTimer の msgbox ステートメント

他の誰かが提案した

「注意すべき点として、TimerID が TriggerTimer の idevent と同じかどうかを確認しないと、要求した時間ではなく、頻繁に取得されます。」

Public Sub TriggerTimer(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idevent As Long, ByVal Systime As Long)
    'keeps calling every X Minutes unless deactivated
    If idevent = TimerID Then
        MsgBox "The TriggerTimer function has been automatically called!"
    End If
End Sub
于 2013-03-04T17:33:06.317 に答える
8

Win64 の場合、次のように変更する必要がありました。

Declare PtrSafe Function SetTimer Lib "user32" (ByVal hwnd As LongLong, ByVal nIDEvent As LongLong, ByVal uElapse As LongLong, ByVal lpTimerfunc As LongLong) As LongLong
Declare PtrSafe Function KillTimer Lib "user32" (ByVal hwnd As LongLong, ByVal nIDEvent As LongLong) As LongLong

Public TimerID As LongLong 'Need a timer ID to eventually turn off the timer. If the timer ID <> 0 then the timer is running

Public Sub TriggerTimer(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idevent As Long, ByVal Systime As Long)
  MsgBox "The TriggerTimer function has been automatically called!"
End Sub


Public Sub DeactivateTimer()
Dim lSuccess As LongLong
  lSuccess = KillTimer(0, TimerID)
  If lSuccess = 0 Then
    MsgBox "The timer failed to deactivate."
  Else
    TimerID = 0
  End If
End Sub

Public Sub ActivateTimer(ByVal nMinutes As Long)
  nMinutes = nMinutes * 1000 * 60 'The SetTimer call accepts milliseconds, so convert to minutes
  If TimerID <> 0 Then Call DeactivateTimer 'Check to see if timer is running before call to SetTimer
  TimerID = SetTimer(0, 0, nMinutes, AddressOf TriggerTimer)
  If TimerID = 0 Then
    MsgBox "The timer failed to activate."
  End If
End Sub
于 2015-05-05T23:32:19.037 に答える