脱机/在线自动化Outlook

时间:2017-06-29 20:59:17

标签: vba outlook outlook-vba

我的大部分任务都是通过Outlook 2016完成的,即我所做的大部分工作都是编写和回复电子邮件。如果我没有将Outlook切换到离线状态,我会从不断的流入中分心。而且经常在一个小时左右的时间内我不需要回应,因为任务已经处理完毕。

我可以手动切换Outlook离线/在线,但我想知道是否有一个可以自动执行此操作的宏。

我的日程安排如下

早上7点在线 8:45离线 10:45在线 10:50离线 12:45在线 12:50离线 14:30在线 14:35离线 15:55在线 16:00离线 16:55在线 17:00离线

能否手动覆盖?

这可能吗?

我可以做基本的Excel宏,但我从来没有制作过Outlook宏

3 个答案:

答案 0 :(得分:0)

扩展MAPI(C ++或Delphi) - 您可以使用IMAPIOfflineMgr::SetCurrentState
对于除C ++或Delphi之外的其他语言,您可以使用Redemption及其RDOSessionOffline属性:

set Session = CreateObject("Redemption.RDOSession")
Session.MAPIOBJECT = Application.Session.MAPIOBJECT
Session.Offline = true

请注意,IMAPIOfflineMsg interfaace无法在不同进程(例如outlook.exe和excel.exe)之间进行封送,因此IMAPIOfflineMgr和RDOSession.Offline都无法在Excel VBA中运行。您可以尝试模拟"离线工作"按钮使用Accessibility API,或者再次使用Redemption及其SafeExplorer对象:

set sExplorer = CreateObject("Redemption.SafeExplorer")
sExplorer.Item = Application.ActiveExplorer
set Ribbon =  sExplorer.Ribbon
oldActiveTab = Ribbon.ActiveTab
Ribbon.ActiveTab = "Send / Receive"
set Control = Ribbon.Controls("Work Offline")
Control.Execute
Ribbon.ActiveTab = oldActiveTab 'restore the active tab

答案 1 :(得分:0)

感谢Diane at Slipstick,以及我自己的一些工作,我找到了解决方案。见https://forums.slipstick.com/threads/95555-vba-to-switch-outlook-online-offline/

有三组宏 - 一组用于离线切换,一组用于在线切换,然后是宏用于为调度分配任务。前两个宏在这里,第三个你可以在上面的论坛参考中找到。

希望这有助于某人

Sub SetOffline()

Dim oNS As NameSpace
Set oNS = Application.Session

If oNS.ExchangeConnectionMode <> olCachedOffline And _
oNS.ExchangeConnectionMode <> olOffline Then

Dim olApp As Outlook.Application
Dim olNS As Outlook.NameSpace
Dim objExpl As Outlook.Explorer
Set olApp = Application
Set olNS = olApp.GetNamespace("MAPI")
Set objExpl = olApp.ActiveExplorer

objExpl.CommandBars.ExecuteMso ("ToggleOnline")

End If

End Sub

Sub OnlineStatus()
Dim oNS As NameSpace
Set oNS = Application.Session

If oNS.ExchangeConnectionMode = olOnline

Dim olApp As Outlook.Application
Dim olNS As Outlook.NameSpace
Dim objExpl As Outlook.Explorer
Set olApp = Application
Set olNS = olApp.GetNamespace("MAPI")
Set objExpl = olApp.ActiveExplorer

objExpl.CommandBars.ExecuteMso ("ToggleOnline")

End If
End Sub

答案 2 :(得分:0)

感谢您找到信息Jo8888

代码以令人困惑的方式定义对象(有些未使用)

这是每个潜艇

的单行版本
Sub ToggleStatus()
    Application.ActiveExplorer.CommandBars.ExecuteMso ("ToggleOnline")
End Sub


Sub ReportStatus()

    Debug.Print Application.Session.ExchangeConnectionMode        ' prints out status (numeric value)


    ' here are the numeric values of the connectionMode constants that are defined in outlook

    '    olNoExchange             = 0,
    '    olOffline                = 100,
    '    olCachedOffline          = 200,
    '    olDisconnected           = 300,
    '    olCachedDisconnected     = 400,
    '    olCachedConnectedHeaders = 500,
    '    olCachedConnectedDrizzle = 600,
    '    olCachedConnectedFull    = 700,
    '    olOnline                 = 800

End Sub