VBA поддерживается в Excel для macOS, но Windows API, COM, ActiveX и многие системные пути там отсутствуют. Поэтому перенос начинается с инвентаризации платформенных вызовов, а не с изменения одной декларации PtrSafe.

Разделите код на бизнес-логику и системный слой. То, что работает с ячейками и формулами, часто можно сохранить, а работу с окнами, реестром и COM придётся заменить.

Что сделать в первую очередь

  • Соберите полный список Declare, CreateObject и ссылок на ActiveX.
  • Проверьте References на отсутствующие библиотеки.
  • Отметьте работу с путями, shell-командами и кодировками.
  • Зафиксируйте версии Excel и macOS для тестирования.

Почему возникает проблема

Макрос падает, когда вызывает компонент, существующий только в Windows, или использует несовместимый формат пути.

  • Declare обращается к DLL Windows.
  • Используется FileSystemObject или другой COM-объект.
  • Форма содержит ActiveX-контролы.
  • Пути собираются через обратный слеш.
  • Подключена библиотека, которой нет в Mac Excel.

Пошаговая диагностика

  • Скомпилируйте проект VBA и исправьте первую ошибку ссылки.
  • Выполните поиск по Declare, CreateObject, Shell и Environ.
  • Запустите макрос по блокам на тестовой копии файла.
  • Проверьте диалоги выбора файлов и права macOS.
  • Сравните результаты расчёта на обеих платформах.

Как исправить

Платформенный код изолируют условной компиляцией, а по возможности заменяют средствами VBA и объектной модели Excel.

  • Вынесите системные операции в небольшие функции-адаптеры.
  • Используйте условные константы Mac и Win только в платформенном слое.
  • Замените COM на коллекции VBA, встроенные функции или разрешённые сценарии.
  • Собирайте пути через платформенный разделитель.
  • Замените ActiveX на совместимые элементы форм или листа.

Как проверить результат

  • Проект компилируется без Missing References.
  • Один набор тестовых данных даёт одинаковый результат.
  • Диалоги и экспорт работают в разрешённых каталогах macOS.
  • Файл повторно открывается без повреждения и предупреждений.

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

  • Храните платформенные зависимости в одном модуле.
  • Не подключайте библиотеку, если достаточно позднего связывания.
  • Проверяйте макрос на обеих платформах перед выпуском.
  • Документируйте ограничения каждой версии Excel.

Чего не стоит делать

  • Не добавляйте PtrSafe механически ко всем Declare.
  • Не отключайте безопасность макросов глобально.
  • Не тестируйте перенос на единственной рабочей книге без копии.

Что подготовить для диагностики

  • Файл XLSM без конфиденциальных данных.
  • Текст ошибки и строка остановки.
  • Версии Excel Windows и macOS.
  • Описание ожидаемого результата макроса.

Частые вопросы

Можно ли полностью сохранить Windows API?

Нет, DLL Windows в macOS недоступны. Нужна замена функции или отдельная реализация для каждой платформы.

Подойдёт ли Office Scripts?

Иногда да, если задача выполняется в поддерживаемой среде Microsoft 365, но это отдельная технология с другим API.

Когда стоит обратиться за помощью

Если макрос большой и системные вызовы смешаны с расчётами, полезно сначала выделить ядро, затем поэтапно заменить несовместимые компоненты.

Итог

Перенос VBA на macOS требует архитектурного разделения, а не набора случайных исправлений. Я могу разобрать макрос, сохранить рабочую логику и адаптировать платформенные функции под обе системы.