Vba 确定Outlook是否可用于自动化

Vba 确定Outlook是否可用于自动化,vba,outlook,office-automation,Vba,Outlook,Office Automation,我有一个模块,将自动Outlook,但如果Outlook不可用,则应跳过该模块 仅仅检查是否安装了Outlook是不够的,因为如果有新的Office安装,启动Outlook只会启动配置向导。从我的观点来看,Outlook不可用于自动化,因此即使可能已安装该模块,也不应使用该模块 根据我的测试和本文中的建议,我可以成功地确定Outlook是否尚未配置,但在边缘情况下,这会失败。此时会出现一个对话框,要求选择一个配置文件。在这种情况下,检查返回true,但Outlook实际上不可用于自动化目的,因为

我有一个模块,将自动Outlook,但如果Outlook不可用,则应跳过该模块

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

根据我的测试和本文中的建议,我可以成功地确定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
Public函数将DetectOutlookProfile()检测为布尔值
将对象视为对象
作为对象的Dim objReg
Dim varSplit作为变体
暗淡的lngMajor尽可能长
将strPath设置为字符串
Dim varsubkey作为变体
Dim varSubKey作为变量
Const HKEY_当前_用户长度=&H80000001
关于错误转到错误处理程序
设置objReg=GetObject(“winmgmts:{impersonationLevel=impersonate}!\\。\root\default:StdRegProv”)
'获取Outlook实例,以便确定版本
'当前正由当前用户使用。
设置objOutlook=CreateObject(“Outlook.Application”)
varSplit=Split(objOutlook.Version,“.”)
lngMajor=varSplit(0)

如果lngMajor多亏了@David Zemens的建议,我找到了一个似乎有效的解决方案

似乎我甚至不需要为注册表检查而烦恼。我可以这样做:

Set objOutlook = CreateObject("Outlook.Application") 
DetectOutlookProfile = Len(objOutlook.GetNamespace("MAPI").CurrentProfileName)
无论Outlook是否没有配置文件或需要手动选择配置文件,它都将返回0


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

是否有帮助?我对此表示怀疑-我对登录任何特定的个人资料都不感兴趣。只有在选择了配置文件且Outlook已完全配置时,才应运行此功能。我无意自动配置Outlook。如果它不在那里,那么模块就不应该被执行。因此,
LogOn
方法在这里对我没有帮助。好的,那么你不想使用Outlook默认配置文件执行模块吗?嗯,事实上,我想。我其实不在乎它是哪一个配置文件,只要它已经被Outlook选中。我只是不打算对Outlook进行任何配置。但是,当出现“选择配置文件”对话框IMPOV时,用户尚未完成配置,因此在他们完成Outlook配置之前,不应使用该模块,而且他们必须自己完成配置,而不是使用我的代码。用户尚未完成配置--或者,他们故意配置Outlook以提示他们使用哪个配置文件,每次会议:)