【问题标题】:Determine if Outlook is available for automation确定 Outlook 是否可用于自动化
【发布时间】:2015-10-12 14:08:45
【问题描述】:

我有一个可以自动化 Outlook 的模块,但如果 Outlook 不可用,则应该跳过它。

仅检查是否安装了 Outlook 是不够的,因为如果有全新的 Office 安装,启动 Outlook 将启动配置向导。从我的 POV 来看,Outlook 不可用于自动化,因此即使可能已安装该模块,也不应使用该模块。

根据我的测试和question 中的建议,我可以成功地判断 Outlook 是否尚未配置,但存在失败的边缘情况。这是当有一个对话框要求选择配置文件时。在这种情况下,检查返回 true,但由于仍需要其他配置(例如选择配置文件),Outlook 实际上无法用于自动化目的。是否也可以捕获这种极端情况?

要重现“选择配置文件”问题,请转到控制面板 -> 邮件。在对话框中,有一个“启动 Microsoft Outlook 时,使用此配置文件”选项 - 选择“提示使用的配置文件”。然后,当您启动 Outlook 时,系统会要求您选择一个配置文件。就是下面的代码会失败的情况。

到目前为止,这是我几乎可以工作的代码......

Public Function DetectOutlookProfile() As Boolean
    Dim objOutlook As Object
    Dim objReg As Object
    Dim varSplit As Variant
    Dim lngMajor As Long
    Dim strPath As String
    Dim varSubKeys As Variant
    Dim varSubKey As Variant

    Const HKEY_CURRENT_USER As Long = &H80000001

On Error GoTo ErrHandler

    Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")

    'Get an instance of Outlook so that we can determine the version
    'being currently used by the current user. 
    Set objOutlook = CreateObject("Outlook.Application")
    varSplit = Split(objOutlook.Version, ".")
    lngMajor = varSplit(0)
    If lngMajor <= 14 Then
        'Outlook profile isn't version specific for Outlook 97-2010
        strPath = "Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles"
    Else
        'Outlook profile is version specific for Outlook 2013+
        strPath = "Software\Microsoft\Office\" & lngMajor & ".0\Outlook\Profiles"
    End If

    objReg.EnumKey HKEY_CURRENT_USER, strPath, varSubKeys
    For Each varSubKey In varSubKeys
        DetectOutlookProfile = True
        Exit For
    Next

ExitProc:
    On Error Resume Next
    Exit Function
ErrHandler:
    'Silently fail and return false
    Select Case Err.Number
        Case Else
            DetectOutlookProfile = False
            Debug.Print Err.Number & " (" & Err.Description & ")"
    End Select
    Resume ExitProc
    Resume
End Function

【问题讨论】:

  • thisthis 有帮助吗?
  • 我对此表示怀疑 - 我对登录任何特定的个人资料不感兴趣。只有在选择了配置文件并且完全配置了 Outlook 时,才应运行此操作。我无意自动配置 Outlook。如果它不存在,则不应该执行该模块。所以,LogOn 方法在这里并没有真正帮助我。
  • 好的,所以您不想使用 Outlook 默认配置文件执行模块?
  • 嗯,实际上,我愿意。我实际上并不关心它是 哪个 配置文件,只要 Outlook 已经选择了它。我只是不打算对 Outlook 进行任何配置。但是当有一个选择配置文件对话框时,IMPOV,用户还没有完成配置,因此在他们完成配置 Outlook 之前不应该使用该模块,他们必须自己做,而不是通过我的代码。
  • 用户尚未完成配置 -- 或者,他们故意将 Outlook 配置为 提示 他们在每个会话中使用哪个配置文件. :)

标签: vba outlook office-automation


【解决方案1】:

感谢@David Zemens 的建议,我找到了一个似乎可行的解决方案。

看来我什至不需要为注册表检查而烦恼。我可以简单地这样做:

Set objOutlook = CreateObject("Outlook.Application") 
DetectOutlookProfile = Len(objOutlook.GetNamespace("MAPI").CurrentProfileName)

无论 Outlook 没有配置文件还是需要手动选择配置文件,这将返回 0。

我认为需要进行注册表检查以确定 Outlook 是否配置了任何配置文件,以便可以编写代码以手动提示用户将配置文件传递给Login 方法。就我而言,我只是不想在任何一种情况下运行该模块,因此检查当前配置文件名称的Len() 就足够了。

【讨论】:

    猜你喜欢
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    相关资源
    最近更新 更多