В современном деловом мире планирование встреч часто происходит без учёта астрономических факторов. Однако для некоторых профессионалов (астрологов, дизайнеров, специалистов по сельскому хозяйству, а также для тех, кто просто любит синхронизировать свою жизнь с природой) важно, чтобы расписание учитывало фазы Луны. В этой статье мы подробно разберём, как автоматически менять время уже запланированных встреч в Microsoft Outlook в зависимости от текущей фазы Луны, используя VBA и, при желании, Power Automate.
Краткое введение в фазы Луны
Луна проходит через восемь основных фаз за один лунный месяц (≈ 29,53 дня):
- Новолуние
- Растущий серп
- Первая четверть
- Растущий крик
- Полная луна
- Убывающий крик
- Последняя четверть
- Убывающий серп
Каждая фаза ассоциируется с определёнными энергетическими и психологическими характеристиками. Например, в новолуние часто рекомендуется планировать старт новых проектов, а в полную луну — завершать текущие задачи.
Зачем менять время встреч в 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
Подготовка среды
- Откройте Outlook.
- Перейдите в Файл → Параметры → Настроить ленту и включите вкладку Разработчик.
- На вкладке Разработчик нажмите Visual Basic.
- В окне редактора 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 напрямую, но можно воспользоваться двумя способами:
- Запуск при открытии Outlook. Добавьте вызов
AdjustMeetingsByLunarPhaseв событиеApplication_Startup:
Private Sub Application_Startup
Call AdjustMeetingsByLunarPhase
End Sub
- Планировщик Windows. Сохраните макрос в виде
.vbs‑скрипта, который будет открывать Outlook и вызывать процедуру. Затем создайте задачу в Планировщике задач (например, каждый день в 00:00).
Альтернативный путь: Power Automate (Flow)
Если вы не хотите писать код, можно собрать поток в Power Automate:
- Создайте новый поток «Запланированный» (например, каждый день в 02:00).
- Добавьте действие HTTP для получения фазы Луны из публичного API.
- С помощью действия Получить события календаря (Outlook) выберите встречи за нужный период.
- Для каждой встречи используйте условный блок 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.
Попробуйте внедрить описанный подход в свою рабочую среду – и вы убедитесь, насколько приятнее становится планировать встречи, когда они «в унисон» с лунным ритмом.
Автор: ваш виртуальный помощник.
Дата публикации: