Как автоматически менять время встреч в Outlook в зависимости от фазы Луны с помощью VBA и Power Automate

В современном деловом мире планирование встреч часто происходит без учёта астрономических факторов. Однако для некоторых профессионалов (астрологов, дизайнеров, специалистов по сельскому хозяйству, а также для тех, кто просто любит синхронизировать свою жизнь с природой) важно, чтобы расписание учитывало фазы Луны. В этой статье мы подробно разберём, как автоматически менять время уже запланированных встреч в Microsoft Outlook в зависимости от текущей фазы Луны, используя VBA и, при желании, Power Automate.


Краткое введение в фазы Луны

Луна проходит через восемь основных фаз за один лунный месяц (≈ 29,53 дня):

  1. Новолуние
  2. Растущий серп
  3. Первая четверть
  4. Растущий крик
  5. Полная луна
  6. Убывающий крик
  7. Последняя четверть
  8. Убывающий серп

Каждая фаза ассоциируется с определёнными энергетическими и психологическими характеристиками. Например, в новолуние часто рекомендуется планировать старт новых проектов, а в полную луну — завершать текущие задачи.

Зачем менять время встреч в Outlook?

  • Повышение продуктивности. Перенос встречи на более «позитивную» лунную фазу может способствовать лучшему восприятию задачи.
  • Синхронизация с клиентами. Если ваш клиент использует лунный календарь, совместное планирование укрепит деловые отношения.
  • Личный комфорт. Многие чувствуют себя лучше, когда их расписание согласовано с естественными ритмами.

Как получить данные о текущей фазе Луны?

Существует два основных подхода:

Использование внешнего API

Сервисы, такие как Farmsense Moon Phase API или Astro API, возвращают JSON‑ответ с датой и типом фазы.

Расчёт фаз в VBA

Если вы не хотите зависеть от сторонних сервисов, можно использовать классический алгоритм Jean Meeus (Astronomical Algorithms). Ниже – упрощённый вариант, достаточный для большинства задач.


' Функция возвращает номер фазы (0‑7)
Function MoonPhase(ByVal d As Date) As Integer
 Dim diff As Double
 Dim days As Double
 Dim newMoon As Date
 
 ' 1 января 2000 г. 12:00 UTC, известная новолуния
 newMoon = DateSerial(2000, 1, 6) + TimeSerial(18, 14, 0)
 
 diff = d ⎯ newMoon
 days = diff * 24 * 60 * 60 / 86400 ' количество дней с последнего новолуния
 days = days Mod 29.530588861 ' средняя синодическая месяц
 MoonPhase = Int((days / 29.530588861) * 8) Mod 8
End Function

Возвращаемое значение:

  • 0 — новолуние
  • 1 — растущий серп
  • 2 — первая четверть
  • 3 — растущий крик
  • 4 — полнолуние
  • 5 — убывающий крик
  • 6 — последняя четверть
  • 7, убывающий серп

Планирование логики изменения времени встречи

Допустим, вы хотите, чтобы все встречи, запланированные в полную луну, автоматически сдвигались на 30 минут раньше, а в новолуние — на 30 минут позже. Для остальных фаз оставляем время без изменений.

Автоматизация в Outlook с помощью VBA

Подготовка среды

  1. Откройте Outlook.
  2. Перейдите в Файл → Параметры → Настроить ленту и включите вкладку Разработчик.
  3. На вкладке Разработчик нажмите Visual Basic.
  4. В окне редактора VBA вставьте новый модуль (Insert → Module).

Полный код макроса


Option Explicit

'--- 1. Функция расчёта фазы Луны (см. раздел 3.2) ---
Function MoonPhase(ByVal d As Date) As Integer
 Dim diff As Double
 Dim days As Double
 Dim newMoon As Date
 
 newMoon = DateSerial(2000, 1, 6) + TimeSerial(18, 14, 0)
 diff = d ⏤ newMoon
 days = diff * 24 * 60 * 60 / 86400
 days = days Mod 29.530588861
 MoonPhase = Int((days / 29.530588861) * 8) Mod 8
End Function

'--- 2. Словарь с корректировкой времени для каждой фазы ---
Function GetShiftMinutes(ByVal phase As Integer) As Long
 Select Case phase
 Case 0 ' Новолуние
 GetShiftMinutes = 30 ' +30 мин
 Case 4 ' Полнолуние
 GetShiftMinutes = -30 ' -30 мин
 Case Else
 GetShiftMinutes = 0 ' без смещения
 End Select
End Function

'--- 3. Основная процедура, вызываемая вручную или по расписанию ---
Sub AdjustMeetingsByLunarPhase
 Dim ns As Outlook.Namespace
 Dim calFolder As Outlook.Folder
 Dim appt As Outlook.AppointmentItem
 Dim items As Outlook.Items
 Dim filter As String
 Dim startDate As Date, endDate As Date
 
 Set ns = Application.GetNamespace("MAPI")
 Set calFolder = ns.GetDefaultFolder(olFolderCalendar)
 
 ' Период, в котором будем искать встречи (например, текущий месяц)
 startDate = DateSerial(Year(Date), Month(Date), 1)
 endDate = DateAdd("m", 1, startDate) ⎯ 1
 
 filter = "[Start] >= '" & Format(startDate, "ddddd h:nn AMPM") & _
 "' AND [End] <= '" & Format(endDate, "ddddd h:nn AMPM") & "'"
 
 Set items = calFolder.Items.Restrict(filter)
 items.Sort "[Start]"
 
 For Each appt In items
 If appt.MeetingStatus <> olMeetingCanceled Then
 Dim phase As Integer
 Dim shift As Long
 
 phase = MoonPhase(appt.Start)
 shift = GetShiftMinutes(phase)
 
 If shift <> 0 Then
 Dim newStart As Date, newEnd As Date
 newStart = DateAdd("n", shift, appt.Start)
 newEnd = DateAdd("n", shift, appt.End)
 
 ' Проверяем, не пересекает ли новое время уже занятые слоты
 If Not IsConflict(calFolder, appt, newStart, newEnd) Then
 appt.Start = newStart
 appt.End = newEnd
 appt.Save
 End If
 End If
 End If
 Next appt
 
 MsgBox "Корректировка встреч завершена.", vbInformation
End Sub

'--- 4. Проверка конфликтов (опционально) ---
Function IsConflict(ByVal folder As Outlook.Folder, ByVal curAppt As Outlook.AppointmentItem, _
 ByVal newStart As Date, ByVal newEnd As Date) As Boolean
 Dim testItems As Outlook.Items
 Dim testAppt As Outlook.AppointmentItem
 Dim filter As String
 
 filter = "[Start] < '" & Format(newEnd, "ddddd h:nn AMPM") & _
 "' AND [End] > '" & Format(newStart, "ddddd h:nn AMPM") & "'"
 Set testItems = folder.Items.Restrict(filter)
 
 For Each testAppt In testItems
 If testAppt.EntryID <> curAppt.EntryID Then
 IsConflict = True
 Exit Function
 End If
 Next
 IsConflict = False
End Function

Краткое пояснение к коду:

  • MoonPhase – вычисляет номер фазы Луны для даты начала встречи.
  • GetShiftMinutes – задаёт смещение в минутах в зависимости от фазы.
  • AdjustMeetingsByLunarPhase – основной цикл: проходит по всем встречам в выбранном диапазоне, меняет время, если требуется, и сохраняет изменения.
  • IsConflict – (необязательно) проверяет, не возникнет ли конфликт с другими встречами после смещения.

Как запускать макрос автоматически

Outlook не поддерживает «таймер» в VBA напрямую, но можно воспользоваться двумя способами:

  1. Запуск при открытии Outlook. Добавьте вызов AdjustMeetingsByLunarPhase в событие Application_Startup:

Private Sub Application_Startup
 Call AdjustMeetingsByLunarPhase
End Sub
  1. Планировщик Windows. Сохраните макрос в виде .vbs‑скрипта, который будет открывать Outlook и вызывать процедуру. Затем создайте задачу в Планировщике задач (например, каждый день в 00:00).

Альтернативный путь: Power Automate (Flow)

Если вы не хотите писать код, можно собрать поток в Power Automate:

  1. Создайте новый поток «Запланированный» (например, каждый день в 02:00).
  2. Добавьте действие HTTP для получения фазы Луны из публичного API.
  3. С помощью действия Получить события календаря (Outlook) выберите встречи за нужный период.
  4. Для каждой встречи используйте условный блок Switch (по фазе) и действие Обновить событие с нужным смещением.

Плюсы Power Automate:

  • Не требуется включать макросы (более безопасно в корпоративных средах).
  • Лёгкая интеграция с другими сервисами (Teams, Planner).

Тестирование и отладка

  • Создайте тестовый календарь. Добавьте несколько встреч в разные даты (новолуние, полнолуние, обычные дни).
  • Запустите макрос вручную (Alt + F8 → AdjustMeetingsByLunarPhase).
  • Проверьте, что время изменилось согласно правилам.
  • Если встреча не сместилась, откройте окно Immediate в VBA (Ctrl + G) и выведите отладочную информацию:

Debug.Print "Subject: " & appt.Subject & _
 " | Phase: " & phase & _
 " | Shift: " & shift

Возможные проблемы и их решения

Проблема Возможная причина Решение
Макрос не запускается В Outlook отключена поддержка макросов Файл → Параметры → Центр управления безопасностью → Параметры макросов → Включить все макросы (или «Подписанные»)
Смещение приводит к конфликту Время уже занято другой встречой Оставьте функцию IsConflict включённой или уменьшите величину смещения
Неправильная фаза Луны Алгоритм расчёта использует UTC, а вы работаете в другом часовом поясе Добавьте корректировку часового пояса: d = d + TimeZoneOffset/24
API не отвечает Отсутствие интернет‑соединения или лимит запросов Перейдите на локальный расчёт (раздел 3.2) или кэшируйте ответы

Расширения и идеи для будущих улучшений

  • Добавить пользовательские правила смещения (например, в фазе «Растущий крик» – +15 мин, в «Убывающий крик» – –15 мин).
  • Интегрировать цветовое кодирование встреч в Outlook (использовать Categories) в зависимости от фазы.
  • Создать дополнение (Add‑in) на C#/.NET, которое будет работать быстрее и предоставит UI‑настройки.
  • Синхронизировать с Google Calendar или Apple Calendar через их API.

Автоматическое изменение времени встреч в Outlook в соответствии с фазами Луны – это не просто «фишка», а реальный инструмент, позволяющий выстроить более гармоничное расписание. С помощью небольшого VBA‑скрипта (или Power Automate) вы получаете:

  • Полный контроль над правилами смещения.
  • Возможность масштабировать решение под любой период (день, неделя, месяц).
  • Гибкость: использовать локальный расчёт фаз или внешние API.

Попробуйте внедрить описанный подход в свою рабочую среду – и вы убедитесь, насколько приятнее становится планировать встречи, когда они «в унисон» с лунным ритмом.


Автор: ваш виртуальный помощник.
Дата публикации: