Как изменить свойства (часовой пояс) повторяющихся встреч в Outlook 2010 VBA

Я пишу новую и исправленную версию макроса VBA Outlook, который будет проходить все встречи в календаре пользователя и изменять часовой пояс каждой повторяющейся серии на Central Standard. Однако, что бы я ни делал, я не могу заставить его правильно обращаться к повторению. В настоящее время при отладке макроса произойдет сбой при первом вызове ex.AppointmentItem.Subject (в инструкции Debug.Print после определения шаблона повторения rPattern). Центральный вопрос здесь: как я могу получить доступ и изменить всю серию повторяющихся встреч одновременно? Могу ли я а) изменить основную встречу, б) выполнить итерацию по всем встречам в серии (что может не установить все будущие вхождения так, как мне нужно), или в) выполнить итерацию по коллекции исключений и изменить повторение оттуда? Мне сказали, что итерация по коллекции исключений (хотя название и вводит в заблуждение) — единственный способ изменить повторение. Это правильно?

Я глубоко признателен за любую помощь, которую вы можете предоставить, спасибо!

Примечание. Элемент aItem‹>Null был закомментирован в качестве теста, по какой-то причине проверка элемента Null (даже попытка ключевого слова Nothing) всегда вызывала ошибку.

    Public Sub IterateAll()

   Dim olApp As New Outlook.Application
   Dim aObject As Object
   Dim calCollection As Outlook.Items
   Dim tzs As Outlook.TimeZones
   Dim tzCentral As Outlook.TimeZone
   Dim tzUTC As Outlook.TimeZone
   Dim olNameSpace As Outlook.NameSpace
   Dim rPattern As Outlook.RecurrencePattern
   Dim ex As Outlook.Exception


   Dim s As Outlook.TimeZone
   Dim e As Outlook.TimeZone


   Set olNameSpace = olApp.GetNamespace("MAPI")
   Set calCollection = olNameSpace.GetDefaultFolder(olFolderCalendar).Items
   Set tzs = Application.TimeZones
   Set tzCentral = tzs("Central Standard Time")
   Set tzUTC = tzs("UTC")

   For Each aObject In calCollection

       If aObject.IsRecurring Then
           Set rPattern = aObject.GetRecurrencePattern


           Debug.Print ("Subject: " + aObject.Subject)
           Debug.Print ("Old Time Zone is " & aObject.StartTimeZone)
           aObject.StartTimeZone = tzCentral
           aObject.EndTimeZone = tzCentral
               Debug.Print ("New Time Zone is " & aObject.StartTimeZone)

           aObject.Save

        End If
       Next

    End Sub

person flyingscotsman74656    schedule 02.08.2012    source источник


Ответы (1)


Я смог получить доступ ко всем повторяющимся встречам. См. этот образец. Я использую позднюю привязку с Outlook.

Option Explicit

Const olFolderCalendar = 9

Sub Sample()
    Dim oOlAp As Object, oOlns As Object, oOlfld As Object
    Dim colItems As Object, colFilteredItems As Object
    Dim oOlpatrn As Object, objItem As Object

    Set oOlAp = CreateObject("Outlook.Application")
    Set oOlns = oOlAp.GetNamespace("MAPI")
    Set oOlfld = oOlns.GetDefaultFolder(olFolderCalendar)

    Set colItems = oOlfld.Items

    Set colFilteredItems = colItems.Restrict("[IsRecurring] = TRUE")

    For Each objItem In colFilteredItems
        Set oOlpatrn = objItem.GetRecurrencePattern
        If oOlpatrn.PatternEndDate > Now Then
            Debug.Print objItem.Subject
        End If
    Next
End Sub

ПОСЛЕДУЮЩИЕ

Const olFolderCalendar = 9

Sub Sample()
    Dim oOlAp As Object, oOlns As Object, oOlfld As Object
    Dim colItems As Object, colFilteredItems As Object
    Dim oOlpatrn As Object, objItem As Object
    Dim tzs As Object, tzCentral As Object

    Set oOlAp = CreateObject("Outlook.Application")
    Set oOlns = oOlAp.GetNamespace("MAPI")
    Set oOlfld = oOlns.GetDefaultFolder(olFolderCalendar)

    Set colItems = oOlfld.Items

    Set colFilteredItems = colItems.Restrict("[IsRecurring] = TRUE")

    Set tzs = Application.TimeZones
    Set tzCentral = tzs("Central Standard Time")

    For Each objItem In colFilteredItems
        Set oOlpatrn = objItem.GetRecurrencePattern
        If oOlpatrn.PatternEndDate > Now Then
            Debug.Print "Old Time Zone is " & objItem.StartTimeZone
            objItem.StartTimeZone = tzCentral
            Debug.Print "New Time Zone is " & objItem.StartTimeZone
            objItem.Save
        End If
    Next
End Sub
person Siddharth Rout    schedule 03.08.2012
comment
Я не знаком с поздним связыванием, не могли бы вы уточнить? - person flyingscotsman74656; 03.08.2012
comment
Проблема, с которой я сталкиваюсь, заключается в том, что я могу получить доступ ко всем повторяющимся встречам, я просто не могу изменить их так, как мне действительно нужно. Есть ли способ изменить время повторяющейся серии? - person flyingscotsman74656; 03.08.2012
comment
Я только что проверил это, и это работает. Вы сохраняете встречу после изменения часового пояса? См. приведенный выше код. - person Siddharth Rout; 03.08.2012
comment
Позднее связывание — это когда вам не нужно заранее устанавливать ссылку. Если вы делаете это в Outlook VBA, то это не имеет значения. В позднем связывании вы объявляете свои объекты как объекты, например Dim oOlAp As Object. Вы можете заменить его объявлением из своего кода. - person Siddharth Rout; 03.08.2012
comment
Это также изменит конечный часовой пояс? - person flyingscotsman74656; 03.08.2012
comment
Я только что проверил его, и он прекрасно работал на индивидуальных встречах. Однако есть одно предостережение, я знаю, что это меняет все часовые пояса встреч, но что мне делать с сериалом? Кажется, я не могу изменить часовой пояс для серии, и что даже запуск вашего кода не изменит внешний вид (в календаре) рассматриваемой встречи. Кажется, что серия переопределяет настройку индивидуальной встречи. Одна из целей, которую я хотел бы достичь, — правильно отображать встречи (показывать в нужное время, а не просто указывать нужное время). - person flyingscotsman74656; 03.08.2012
comment
Спасибо за ваши усилия, я очень ценю их! - person flyingscotsman74656; 03.08.2012
comment
Нет, это изменит только начальный часовой пояс. Точно так же вы можете изменить конечный часовой пояс. После изменения часовых поясов попробуйте закрыть и перезапустить Outlook. Теперь он правильно отражает? - person Siddharth Rout; 03.08.2012
comment
Я добавил код для изменения конечного часового пояса каждой встречи и перезапустил Outlook, но, к сожалению, серия встреч остается в неправильном часовом поясе, хотя каждая отдельная встреча была установлена ​​правильно. Я понимаю, что это не было целью программы, но даже в этом случае мне любопытно, можем ли мы использовать этот метод, чтобы это произошло. Моя конечная цель — сделать так, чтобы каждая серия отображалась в нужное время, это моя цель превыше всего. Я был бы счастлив, если бы даже произвольное и конечное количество назначений появлялось в нужное время, и не обязательно сериями. - person flyingscotsman74656; 06.08.2012
comment
Делая все это, я нахожу странным, что графический интерфейс позволяет вам сделать это легко, но почти невозможно сделать это в VBA. - person flyingscotsman74656; 06.08.2012
comment
Вы закрыли и перезапустили Outlook после запуска вышеуказанного кода? - person Siddharth Rout; 07.08.2012
comment
Я действительно это сделал, хотя операторы отладки показали, что часовые пояса менялись для каждой встречи, ряд оставался в том же часовом поясе, что и раньше, и по-прежнему отображался во временном интервале предыдущего часового пояса. - person flyingscotsman74656; 07.08.2012
comment
Можете ли вы обновить свой вопрос с помощью последнего кода, который вы используете? Позвольте мне проверить это для вас :) - person Siddharth Rout; 07.08.2012