Expertise technique

Compatibilité VBA Mac & Windows

Développer des macros VBA qui fonctionnent sur les deux plateformes exige une connaissance précise des différences techniques entre Excel pour Mac et Excel pour Windows. Ce guide couvre les pièges courants et les solutions éprouvées.

Pourquoi la compatibilité VBA Mac/Windows est un enjeu critique

De nombreuses entreprises opèrent dans des environnements mixtes : les équipes créatives et marketing utilisent souvent des Mac, tandis que les équipes finance et opérations travaillent sous Windows. Un fichier Excel contenant des macros VBA doit fonctionner de manière identique sur les deux systèmes, sous peine de bloquer des processus métier entiers.

VBA sur Mac est un sous-ensemble de VBA sur Windows. De nombreuses fonctionnalités présentes sous Windows sont absentes, limitées ou implémentées différemment sur macOS. Un code qui compile et s'exécute parfaitement sous Windows peut provoquer une erreur de compilation immédiate sur Mac. C'est pourquoi l'optimisation du code VBA doit intégrer ces contraintes dès le départ.

Les mises à jour de Microsoft 365 pour Mac modifient régulièrement le support VBA. Des fonctionnalités autrefois absentes peuvent apparaître, et inversement. Il est indispensable de tester après chaque mise à jour majeure.

Les erreurs sont souvent silencieuses. Une macro peut s'exécuter sans erreur sur Mac mais produire des résultats incorrects (chemins de fichiers invalides, boîtes de dialogue qui ne s'ouvrent pas, données non sauvegardées).

Différences clés entre Mac et Windows

Voici les incompatibilités les plus fréquentes que nous rencontrons lors de nos missions de développement VBA cross-platform.

Boîtes de dialogue fichiers

Application.GetOpenFilename fonctionne sur les deux plateformes, mais avec des options limitées sur Mac. Application.FileDialog n'est pas disponible sur Mac dans certaines versions. L'alternative Mac historique est AppleScript via MacScript(), remplacé par AppleScriptTask depuis Office 2016.

Contrôles ActiveX

Les contrôles ActiveX (CommandButton, TextBox, ComboBox insérés directement sur une feuille) ne fonctionnent pas sur Mac. Utilisez exclusivement des contrôles de formulaire (Form Controls) ou des UserForms, qui sont compatibles avec les deux plateformes.

Appels API système

Les déclarations Declare Function ... Lib "kernel32" n'existent pas sur Mac. Il n'y a pas d'équivalent direct aux API Windows (user32.dll, shell32.dll). Les fonctionnalités qui dépendent de ces API (manipulation de fenêtres, accès au registre, opérations filesystem avancées) doivent être réécrites ou contournées.

Chemins de fichiers

Windows utilise le backslash (\) et Mac utilise le slash (/) comme séparateur. Les chemins réseau UNC (\\serveur\partage) ne sont pas reconnus sur Mac. Utilisez toujours Application.PathSeparator pour construire des chemins portables.

Compilation conditionnelle : la solution universelle

Module_CrossPlatform.bas
' Sélection de fichier cross-platform
Function ChoisirFichier() As String
Dim chemin As Variant
#If Mac Then
' Mac : utiliser GetOpenFilename (compatible)
chemin = Application.GetOpenFilename(_
FileFilter:="Fichiers Excel (*.xlsx), *.xlsx")
#Else
' Windows : FileDialog avec plus d'options
With Application.FileDialog(msoFileDialogFilePicker)
.Title = "Sélectionner un fichier"
.Filters.Clear
.Filters.Add "Fichiers Excel", "*.xlsx;*.xlsm"
If .Show = -1 Then
chemin = .SelectedItems(1)
End If
End With
#End If
If chemin <> False Then
ChoisirFichier = CStr(chemin)
Else
ChoisirFichier = ""
End If
End Function

Point clé : la directive #If Mac Then est évaluée à la compilation, pas à l'exécution. Le code Windows n'est même pas compilé sur Mac, ce qui évite les erreurs de compilation liées à des objets inconnus sur cette plateforme.

Bonnes pratiques de développement cross-platform

Ces règles, appliquées systématiquement dès le début du développement, évitent la majorité des problèmes de compatibilité.

1

Toujours utiliser Application.PathSeparator

Ne jamais écrire "\" en dur dans un chemin. Construire les chemins avec Application.PathSeparator ou la constante Application.DefaultFilePath.

2

Éviter les contrôles ActiveX

Utiliser uniquement des contrôles de formulaire (Form Controls) sur les feuilles et des UserForms pour les interfaces complexes. Les deux sont compatibles Mac et Windows.

3

Encapsuler les appels système dans des fonctions dédiées

Créer des fonctions wrapper (comme ChoisirFichier() ci-dessus) qui isolent la logique spécifique à chaque plateforme. Le code métier appelle la fonction sans se soucier du système.

4

Tester sur les deux plateformes

Chaque livraison doit être validée sur Excel pour Mac et Excel pour Windows. Les émulateurs et machines virtuelles ne reproduisent pas toujours fidèlement le comportement VBA natif.

Module_Chemins.bas
' Construction portable de chemins de fichiers
Function ConstruireChemin(dossier As String, _
fichier As String) As String
Dim sep As String
sep = Application.PathSeparator
' Supprimer le séparateur final s'il existe
If Right(dossier, 1) = sep Then
dossier = Left(dossier, Len(dossier) - 1)
End If
ConstruireChemin = dossier & sep & fichier
End Function
' Obtenir le dossier du classeur actif
Function DossierClasseur() As String
DossierClasseur = ThisWorkbook.Path
' Fonctionne sur Mac et Windows
' Retourne "/" sur Mac, "\" sur Windows
End Function

Quand recommander Windows

La compatibilité cross-platform a un coût en complexité et en fonctionnalités. Dans certains cas, nous recommandons de cibler exclusivement Windows pour tirer parti de tout l'écosystème VBA.

Automatisation COM inter-applications

L'automatisation d'Outlook, Word ou PowerPoint depuis Excel via COM fonctionne de manière fiable uniquement sous Windows. Sur Mac, les interactions inter-applications sont limitées et instables.

Appels API Windows

Les fonctionnalités nécessitant des appels à kernel32.dll, user32.dll ou shell32.dll (manipulation de fenêtres, timers haute résolution, accès au registre) n'ont aucun équivalent sur Mac.

Applications critiques en performance

Excel VBA sous Windows est systématiquement plus rapide que sous Mac, notamment pour les opérations sur les tableaux en mémoire et les accès fichier. Pour les traitements de plus de 500 000 lignes, l'écart de performance peut atteindre un facteur 2 à 3.

Connexions bases de données

ADO/ADODB pour se connecter à SQL Server, Access ou MySQL est exclusivement Windows. Sur Mac, les options de connexion bases de données depuis VBA sont extrêmement limitées.

Notre approche : lors de la phase d'analyse, nous identifions les contraintes de plateforme de votre équipe et recommandons l'architecture la plus adaptée. Dans la majorité des cas, un développement cross-platform est possible sans compromis fonctionnel majeur. Pour les projets nécessitant des fonctionnalités avancées, nous proposons un développement VBA sur mesure ciblant la plateforme optimale.

Un projet VBA multi-plateforme ?

Nous développons des macros VBA compatibles Mac et Windows, testées et documentées pour les deux environnements. Parlez-nous de votre contexte technique.