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 требует архитектурного разделения, а не набора случайных исправлений. Я могу разобрать макрос, сохранить рабочую логику и адаптировать платформенные функции под обе системы.