如何使用 VBA 在 Outlook 365 上启动时显示所有日历?

Posted

技术标签:

【中文标题】如何使用 VBA 在 Outlook 365 上启动时显示所有日历?【英文标题】:How to show all calendars at startup on Outlook 365 using VBA? 【发布时间】:2022-01-10 14:42:19 【问题描述】:

我在 Windows 10 上使用 Outlook 365。 “我的日历”组中有三个日历。 我想在启动时显示所有日历,默认日历日历 1 使用 VBA 处于活动状态。 为此,我使用了下面的 VBA 代码,但是有两个问题。

一个问题是部分代码是多余的,这使得它很耗时。 默认情况下,启动后只有我的日历组中的 Calendar1 可见。 为了显示所有日历,代码使 Calendar2 和 Calendar3 可见。 运行这些命令后,Calendar3 处于活动状态。 启动后激活Calendar1,代码使Calendar1不可见,然后可见。

我认为,与其这样,使用对应于在导航窗格中选中“我的日历”复选框的命令是一种有效的方法。 但我不知道该怎么做。

另外一个问题是,使用这个宏启动后,我无法通过快捷键Cntl+Alt+1和Cntl+Alt+2切换日视图和月视图。 我认为检查“我的日历”的方法可以解决这个问题 因为我手动勾选复选框时可以通过快捷键切换这些视图。

那么你能告诉我解决这些问题的方法吗? 提前谢谢你。

Private WithEvents g_Items As Outlook.Items

Private Sub Application_Startup()
Dim Ns As Outlook.NameSpace

Set Ns = Application.GetNamespace("MAPI")
Set g_Items = Ns.GetDefaultFolder(olFolderCalendar).Items

setupInitialDisplayCalendars
End Sub

Public Sub setupInitialDisplayCalendars()

Dim navModCal As CalendarModule
Dim navGroup As NavigationGroup

Set navModCal = ActiveExplorer.NavigationPane.Modules.GetNavigationModule(olModuleCalendar)
Set navGroup = navModCal.NavigationGroups.Item("My Calendars")

If Not (navGroup Is Nothing) Then
navGroup.NavigationFolders.Item("Calendar2").IsSelected = True
navGroup.NavigationFolders.Item("Calendar3").IsSelected = True
navGroup.NavigationFolders.Item("Calendar1").IsSelected = False
navGroup.NavigationFolders.Item("Calendar1").IsSelected = True
End If
End Sub

【问题讨论】:

看看Select Multiple Calendars in Outlook。 【参考方案1】:

您可以使用NavigationFolders 对象来显示Outlook 导航页面上列出的日历。

Sub SelectCalendars()
    Dim objPane As Outlook.NavigationPane
    Dim objModule As Outlook.CalendarModule
    Dim objGroup As Outlook.NavigationGroup
    Dim objNavFolder As Outlook.NavigationFolder
    Dim objCalendar As Folder
    Dim objFolder As Folder
    
    Dim i As Integer
    
    Set Application.ActiveExplorer.CurrentFolder = Session.GetDefaultFolder(olFolderCalendar)
    DoEvents
    
    Set objCalendar = Session.GetDefaultFolder(olFolderCalendar)
    Set objPane = Application.ActiveExplorer.NavigationPane
    Set objModule = objPane.Modules.GetNavigationModule(olModuleCalendar)
    
    With objModule.NavigationGroups
        Set objGroup = .GetDefaultNavigationGroup(olMyFoldersGroup)
    End With

    For i = 1 To objGroup.NavigationFolders.Count
        Set objNavFolder = objGroup.NavigationFolders.Item(i)
        Select Case i

        ' Enter the calendar index numbers you want to open
            Case 1, 3, 4
                objNavFolder.IsSelected = True
             
        ' Set to True to open side by side
                objNavFolder.IsSideBySide = False
            Case Else
                objNavFolder.IsSelected = False
        End Select
    Next

' set the view here

    Set objPane = Nothing
    Set objModule = Nothing
    Set objGroup = Nothing
    Set objNavFolder = Nothing
    Set objCalendar = Nothing
    Set objFolder = Nothing
End Sub

要更改日历文件夹视图(日/周/月),您可以使用视图对象:

Dim objViews As Views
 Dim objView As View
 
Set objViews =  Application.ActiveExplorer.CurrentFolder.Views
 Set objView = objViews.Item("Calendar")
  With objView
      ' Set the calendar view to show a
      ' single day.
      .CalendarViewMode = olCalendarViewDay
  End With

 objView.Apply

CalendarView.CalendarViewMode 属性返回或设置一个OlCalendarViewMode,它确定CalendarView 对象的当前视图模式。

【讨论】:

感谢您的回复。您的方式与我的代码几乎相同。运行代码后,会显示日历 1、3 和 4,但日历 4 处于活动状态。这就是我的问题。我想在启动时显示“默认日历(日历 1)处于活动状态”的所有日历。所以我写了上面的代码。你的第二个代码让我的 Outlook 日历以某种方式冻结。 您能说得更具体些吗?为什么需要改变视图? 我想显示默认日历(日历 1)处于活动状态的所有日历,并且在启动时具有月视图,之后我想通过快捷键切换月视图和周视图, Cntl+Alt+1 和 Cntl+Alt+2。我的代码可以做第一个,但有点费时,我不能做第二个。我认为检查“我的日历”检查的方式可以解决这些问题,但我不知道该怎么做。 前段时间,我发现运行我的代码,然后在日历上点击两次,我可以在两个视图之间切换。这对我来说几乎没问题。但我想知道更有效的解决方案。 我会补充我的解释。我想显示默认日历(日历 1)在启动时处于活动状态的所有日历,因为我主要使用默认日历,这样对我来说很省时。

以上是关于如何使用 VBA 在 Outlook 365 上启动时显示所有日历?的主要内容,如果未能解决你的问题,请参考以下文章

访问 Outlook VBA 对象模型时单词冻结

如何设置outlook office365邮箱的中继

如何使用excel vba,对outlook进行操作?

Office 365 版本的Outlook 使用小技巧

在 Excel 中使用 VBA,如何在 Outlook 中粘贴表格然后将表格转换为文本?

Office 365 On MacOS 系列——Outlook配置项