Retour à la FAQ


Conseils pour passer un programme VBA de PC vers MAC de Bernard Rey


I - L'aide de Microsoft Excel 98 indique :

Modifications apportées à Visual Basic dans Microsoft Excel 98 Édition Macintosh

Microsoft Excel 97 pour Windows et Microsoft Excel 98 Édition Macintosh contiennent du code permettant de
prendre en charge les fonctionnalités et améliorations propres à chacune des plates-formes
(ou système d'exploitation) pour lesquelles ces produits ont été conçus.
(Les conventions de désignation des fichiers et des chemins et la prise en charge des périphériques d'impression sont des exemples de fonctionnalités propres à chaque environnement Windows ou Macintosh).
De plus, Microsoft Excel 98 Édition Macintosh diffère de Microsoft Excel 97 pour Windows dans les domaines suivants :
Sous Windows, la liaison et l'incorporation d'objets OLE sont toutes deux prises en charge, tandis que sur Macintosh, seule l'incorporation d'objets OLE est supportée.

Sur Macintosh, les contrôles ActiveX ne sont pas disponibles. Il en est de même pour la commande Contrôles supplémentaires (menu Outils et menu contextuel Boîte à outils) dans Visual Basic Editor.

Sur Macintosh, le système de messagerie PowerTalk n'est pas pris en charge. Il convient d'utiliser les méthodes et propriétés Microsoft Mail de l'objet Application à la place.

Sur Macintosh, vous ne pouvez pas définir la propriété WindowState.

-----------------------------------------------------------

Méthodes de développement de solutions inter-plates-formes

Utilisation des propriétés intégrées pour les chemins

Dans les applications dont les modèles d'objet prennent en charge les propriétés intégrées, utilisez ces dernières pour renvoyer un nom de fichier ou de dossier. Par exemple :

Dans Word, Excel et PowerPoint, utilisez la propriété Path de l'objet Application pour renvoyer le chemin à l'application.
Dans Word et Excel, utilisez la propriété PathSeparator de l'objet Application plutôt qu'une barre oblique inverse ou un signe deux-points pour séparer les noms de dossier dans un chemin.
Dans Word, utilisez la propriété DefaultFilePath de l'objet Options pour renvoyer un dossier (Modèles, par exemple).

Les chemins renvoyés par ces propriétés contiennent les séparateurs de chemin et les noms de lecteur appropriés. Pour savoir si l'application que vous utilisez comprend de telles propriétés, consultez la documentation du modèle d'objet de l'application.

Utilisation de la compilation conditionnelle

Pour les différences de plate-forme que vous ne pouvez pas résoudre par l'utilisation des propriétés intégrées
associées au modèle d'objet d'une application, utilisez la compilation conditionnelle. Vous devrez y faire appel
lorsque le code génère une erreur de compilation sur une plate-forme, mais pas sur l'autre.
La compilation conditionnelle permet de contrôler le code qui est compilé.
Par exemple, si vous voulez développer une fonction de recherche de fichiers exécutable sur les deux plates-formes,
vous pouvez créer une constante de compilation conditionnelle et la définir de manière à indiquer si le code est
compilé pour Windows ou pour Macintosh. Pour préciser que le code est compilé pour Macintosh, dans le menu Outils
de Visual Basic Editor, cliquez sur Propriétés de VBAProject, puis dans la zone Arguments conditionnels de
compilation, tapez Macintosh = 1.
Vous pourrez alors compiler et exécuter le code sur Macintosh.
Pour Windows, attribuez la valeur 0 (zéro) à la même constante.

#If Macintosh Then
Dim ffFind As FileFind
Set ffFind = Application.FileFind
With ffFind
.Options = msoOptionsNew
.Name = "Nouveau"
.SearchPath = "Macintosh HD:Mes Documents"
.Execute
For i = 0 To .Results.Count - 1
MsgBox .Results(i)
Next i
End With
#Else
Dim fsSearch As FileSearch
Set fsSearch = Application.FileSearch
With fsSearch
.FileName = "*Nouveau*"
.LookIn = "C:\Mes Documents"

.Execute
For i = 1 To .FoundFiles.Count
MsgBox .FoundFiles(i)
Next i
End With
#End If

Différences recensées entre plates-formes

Il arrive que ni les propriétés intégrées, ni la compilation conditionnelle ne permettent de résoudre certaines
différences de plate-forme. Par exemple, les contrôles ActiveX et les liaisons OLE ne sont pas pris en charge dans
Office 98 Édition Macintosh.
Pour plus d'informations sur ces différences, consultez Modifications apportées à Visual Basic dans Microsoft Excel 98 Édition Macintosh.

II - Divers (à partir de là, ce n'est pas toujours dans l'aide d'Excel !) :

MacOS n'accepte pas les caractères génériques (*, ?) pour rechercher un fichier. L'identification des fichiers
ne se fait pas au moyen d'extensions (.xls). Voir, pour plus d'infos sur ces deux points, la fonction MacID().

Note : Si on ouvre par VBA un classeur Excel importé d'un Mac, sans extension .xls (par exemple " Test "), Windows
ajoute automatiquement un " . " au nom (" Test. "). Au moment de l'enregistrement, il faut en tenir compte. VBA
devra identifier au préalable l'environnement (voir plus haut) et la présence ou non d'une extension… (Lara Stone)

La propriété WindowState peut se définir, contrairement à ce qui est annoncé par Microsoft (cf. ci-dessus, mais
aussi dans les fichiers d'aide). On ne peut lui affecter néanmoins que les valeurs xlMaximized ou xlNormal
(en fait, la valeur xlMinimized ne correspond à rien dans MacOS),
et uniquement avec un objet " Window ". Ex : ActiveWindow.WindowState = xlMaximized 'ou xlNormal

Pas de SendKeys (c'est indiqué dans l'aide de SendKeys)

Pas de Barre d'outils Commandes, ni de gestion des événements liés aux outils en question
(puisque les contrôles ActiveX ne sont pas disponibles). Il faut se contenter des outils de la barre " Formulaires "
et se limiter à l'événement " Click " Evidemment, il n'y a rien dans l'Aide

Pas de sélection multiple avec " GetOpenFilename " Bien que ce ne soit pas indiqué dans l'aide, si on met l'argument MultiSelect à True, ça plante.

La méthode SendMail est sensée fonctionner. L'ennui, c'est qu'il faut pour cela une messagerie compatible MAPI.
Je n'en connais pas sur Macintosh... (pas Outlook Express, par exemple !). Il faut donc contourner. Une
solution, de Jim Gordon (ça paraît loufoque, mais au moins ça marche !) :

Sub EnvoiParMail()
Application.CommandBars.Add(Name:="Envoi").Visible = False 'ou True
Application.CommandBars("Envoi").Controls.Add Type:=msoControlButton, _
Id:=2188, Before:=1
Application.CommandBars("Envoi").Controls(1).Execute
Application.CommandBars("Envoi").Delete
End Sub

Amusant : si on teste la valeur de Application.MailSystem on obtient la valeur 3, qui correspond à xlMicrosoftMail.
Ce qui normalement devrait permettre le fonctionnement de la méthode SendMail,
si on en croit ce que dit l'Aide (mais ce que dit l'Aide...)

La propriété RowSource n'est pas prise en charge (Claudy).

Les fonctions ayant trait aux Bases de données (SQL, ODBC) fonctionnent, mais pas de façon identique
(les choses ne s'arrangent pas avec Excel 2001, bien au contraire :les pilotes ne sont pas fournis sur le CD !)
On peut généraliser en disant que toutes les fonctions qui font appel à l'OS sont à vérifier et tester

Par contre, Excel:2001 sait employer QuickTime en ce qui concerne le streaming et la réalité virtuelle,
ce qu'Excel 2000 ne sait pas faire.

Pour compléter tout ça, deux adresses bien utiles pour avoir des infos :

Excel 98
http://support.microsoft.com/support/MacExcel/faq/XL98FAQ.asp

Excel 2001
http://support.microsoft.com/support/macexcel/faq/xl2001faq.asp

Pour plus de détails (toujours de Bernard Rey)
http://dj.joss.free.fr/XL VBA et AppleScript.htm

Et pour terminer, des adresses indispensables :

" Le " forum francophone : microsoft.public.fr.excel
Sa FAQ : http://dj.joss.free.fr/faq.htm
Le forum Macintosh (anglophone) : microsoft.public.excel.macintosh

 


[top]