AppleScript et Excel

EXCEL

Faire cohabiter Excel et AppleScript, par Bernard REY <>

SOMMAIRE

Faire fonctionner Excel à partir d'AppleScript
Faire fonctionner AppleScript à partir d'une macro VBA d'Excel
Faire fonctionner ensemble AppleScript et VBA d'Excel
Créer une Macro
Enregistrement du Script
Exécuter le Script enregistré
Passer une valeur à une Procédure Sub
Retourner une valeur depuis une procédure Sub de VBA
Retourner une Valeur depuis une procédure Function
Retourner une Valeur depuis une procédure Sub
Codes d'erreurs retournés par une procédure
Codes d'erreur retournés par une procédure Sub
Codes d'erreur retournés par une procédure Function

Ces quelques lignes sont basées principalement sur différents documents d'origine Microsoft. Ces documents donnent quelques indications sur l'emploi d'Excel avec AppleScript et la cohabitation des deux langages de programmation. On en retrouve l'essentiel là :

Excel 4 et 5 : http://support.microsoft.com/support/kb/articles...
Excel 98 et 2001:
http://support.microsoft.com/support/kb/ARTICLES...

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

Excel 98 : http://support.microsoft.com/support/MacExcel/faq...
Excel 2001 :
http://support.microsoft.com/support/macexcel/faq...

Point important : avec Excel:2001, on peut mémoriser des opérations dans l'Editeur AppleScript !!!

 

Passer une valeur à une Procédure Sub

Pour passer une valeur :

1.Ouvrir le Classeur (Classeur1) créé précédemment puis démarrer l'Editeur Visual Basic (OPTION+F11).

2.Saisir : Sub Passer_1_Argument(x As Variant) Worksheets("Feuil1").Cells(1,1).Value = x End Sub

3.Dans le menu Fichier, cliquer Fermer et retourner à Microsoft Excel.

4.Dans le menu Fichier, cliquer Enregistrer.

5.Dans le menu Applications, cliquer Masquer Microsoft Excel.

6.Démarrer l'Editeur de scripts et saisir dans une nouvelle fenêtre : tell application "Microsoft Excel" set MaValeur to 10 Activate Evaluate "Classeur1!Passer_1_Argument(" & MaValeur & ")"
end tell

NOTE : Pour passer une variable à une procédure Visual Basic, il faut concaténer la variable à l'intérieur de l'instruction Evaluate. Pour passer une constante à la procédure, placer la valeur entre les parenthèses sans qu'il soit nécessaire de concaténer. Dans ce cas, la ligne devient :
Evaluate "Classeur1!Passer_1_Argument(10)"

7.Dans le menu Fichier, cliquer Enregistrer.

8.Choisir un dossier et un nom pour votre script dans la boîte de dialogue d'enregistrement puis cliquer Enregistrer.

9.Dans le menu Commandes, cliquer Exécuter.

Le script active Microsoft Excel et place la valeur 10 dans la cellule A1 de Feuil1

 

1 - Faire fonctionner Excel à partir d'AppleScript

On peut parfaitement faire fonctionner Excel à partir d'AppleScript... moyennant quelques précautions. En particulier il faut mettre des guillemets pour utiliser les noms de cellules et plages (au format "A1" aussi bien qu'au format "L1C1"). C'est basique, mais ça va mieux en le disant...

Il faut aussi, évidemment, franciser les noms ("L1C1" pour "R1C1", "Feuil1" au lieu de "Sheet1") si on emploie une version française d'Excel.

Pour voir, j'ai pu exécuter aussi bien avec "FormulaR1C1", "Formula", "FormulaLocal" ou "Value". Dans tous les cas, ça fonctionne. Attention, s'il faut franciser les noms de cellules ("L1C1"), "FormulaL1C1" ne marche pas. Mais on retrouve là aussi les trucs classiques de VBA Excel.

Voilà donc un premier script utilisable (avec Excel Fr) :

tell application "Microsoft Excel"  Activate Select Sheet "Feuil1" Select Range "L1C1" set Value of ActiveCell to 1 Select Range "A2" set Formula of ActiveCell to 2 Select Range "A1:A2" AutoFill Selection Destination Range "A1:A10" end tell

On peut faire plus simple, mais c'est juste pour montrer plusieurs manières.

 

Retourner une valeur depuis une procédure Sub de VBA

Une procédure Sub de Visual Basic renvoie la valeur 0 quand elle s'exécute normalement à partir d'un script AppleScript.

Si vous appelez une procédure Function, vous pouvez retourner toute valeur numérique, Booléenne ou Chaîne de caractères vers le script AppleScript. Que ce soit à partir d'une procédure Sub ou Function, la valeur est retournée à une variable AppleScript prédéfinie nommée "result"

2 - Faire fonctionner AppleScript à partir d'une macro VBA d'Excel

Retourner une Valeur depuis une procédure Function

Pour retourner une valeur :

1.Dans Microsoft Excel ouvrir le classeur (Classeur1) créé précédemment.

2.Démarrer l'Editeur Visual Basic (OPTION+F11) et saisir dans le module : Function Retour_Valeur(x As Integer) As Integer Retour_Valeur = x * 2 End Function

3.Dans le menu Application, cliquer Masquer Microsoft Excel.

4.Démarrer l'Editeur de scripts et saisir dans une nouvelle fenêtre : tell application "Microsoft Excel" Evaluate "Classeur1!Retour_Valeur(10)" set MaValeur to result + 1 display dialog MaValeur end tell

5.Dans le menu Fichier, cliquer Enregistrer.

6.Choisir un dossier et un nom pour votre script dans la boîte de dialogue d'enregistrement puis cliquer Enregistrer.

7.Dans le menu Commandes, cliquer Exécuter.

Une boîte de dialogue AppleScript affiche la valeur 21.

8.Cliquer OK.

 

On peut aussi faire fonctionner AppleScript depuis VBA d'Excel. Un exemple simple :

Sub Runscript() Dim str As String, temp As String, CR As String CR = Chr$(13) str = "tell application ""Finder""" str = str & CR & "set NomDisque to name of startup disk" str = str & CR & "end tell" temp = MacScript(str) MsgBox "Disque de démarrage = " & temp End Sub

Le principe est d'envoyer au Finder une chaîne de caractères qui sera exécutée comme un script. C'est l'instruction "MacScript" qui permet de lancer cette exécution. Pour faire un script en plusieurs lignes, on intercale des "retours chariot" ("Chr$(13)"). Pour faire parvenir un guillemet à AppleScript, il faut en mettre deux de suite dans VBA.

Il faut que l'instruction (ici "str") soit placée entre des parenthèses si on veut récupérer une valeur en retour, qu'on exécute un script enregistré ou qu'on envoie directement des instructions, comme ci-dessus. Avantage : on peut affecter ce résultat à une variable (ici "temp"), même si on n'a pas besoin du résultat pour s’en resservir plus loin. Excel attend le résultat avant de continuer à exécuter la suite de la procédure. Si on ne met pas de parenthèses, VBA se contente de lancer le script et passe à l’instruction suivante... sans attendre que le script soit totalement exécuté.

Maintenant, une macro Excel qui permet de choisir un document texte pour en modifier le "file type" et le "creator type" et lui donner ceux d'un document texte créé par Excel (mais ce n'est que pour faire un exemple, bien sûr, on peut en mettre d'autres de la même façon). La conséquence directement visible est que ce document aura l'icône correspondant aux documents texte créés par Excel... On voit comment marier les variables et les instructions AppleScript. A noter : les guillemets qui doivent encadrer la variable "LeChemin" transmise à AppleScript.

Sub ChangerTypes() Dim ChoixDocument As Variant Dim str As String, temp As String Dim LeChemin As String, CR As String
ChoixDocument = Application.GetOpenFilename (FileFilter:="TEXT", _ButtonText:="Choisir") If ChoixDocument = False Then MsgBox "Choix impossible, opération annulée." Exit sub Else LeChemin = CStr(ChoixDocument) CR = Chr$(13) str = "tell application ""Finder""" str = str & CR & "set file type of file """ & LeChemin & """ to ""TEXT""" str = str & CR & "set creator type of file """ & LeChemin & """ to ""XCEL""" str = str & CR & "end tell" temp = MacScript(str) End If End Sub

 

Retourner une Valeur depuis une procédure Sub

Pour retourner une valeur depuis une procédure Sub :

1.Dans Microsoft Excel ouvrir le classeur (Classeur1) créé précédemment.

2.Démarrer l'Editeur Visual Basic (OPTION+F11) et saisir dans le module : Sub Retour_Valeur_Sub() Sheets("Feuil1").Cells(1, 1).Value = 1 End Sub

3.Dans le menu Application, cliquer Masquer Microsoft Excel.

4.Démarrer l'Editeur de scripts et saisir dans une nouvelle fenêtre : tell application "Microsoft Excel" Evaluate "Classeur1!Retour_Valeur_Sub()" display dialog result as integer end tell

5.Dans le menu Fichier, cliquer Enregistrer.

6.Choisir un dossier et un nom pour votre script dans la boîte de dialogue d'enregistrement puis cliquer Enregistrer.

3 - Faire fonctionner ensemble AppleScript et VBA d'Excel

Codes d'erreurs retournés par une procédure

Dans certaines situations, une procédure Sub or Function peut ne pas s'exécuter correctement pour des raisons diverses. Cette partie expose les moyens de faire savoir au script AppleScript qu'une erreur s'est produite dans la procédure Visual Basic.

 

Pour faire exécuter une macro Excel à partir d'AppleScript et jouer avec les échanges de données, un petit exemple plus complet qui permet de faire un aller-retour entre AppleScript et Excel. Le résultat rendu par la macro VBA Excel est réinjecté dans Excel. Oui, je sais, c'est d'un intérêt moyen, c'est juste comme ça, pour montrer qu'on récupère le résultat et que le script attend avant de passer à l'instruction suivante :

Dans VBA Excel, on colle : Function Multiplic(MaValeur As Integer) [A1] = MaValeur MaValeur = MaValeur * 2 Multiplic = MaValeur End Function

Dans l’Editeur AppleScript, on exécute : tell application "Microsoft Excel" set intUneValeur to 4 set MacroMulti to "MonClasseur!Multiplic(" & intUneValeur & ")" set intMulti to Evaluate (MacroMulti) set Value of Cell "A2" to intMulti end tell

Note : Il faut recourir à une "Function Xx()" si on veut avoir un résultat en retour. En utilisant une "Sub Xx()" on déclenche l'exécution, mais on n'a en retour que "True" ou "False", selon que l'exécution s'est bien déroulée ou non. Il faut impérativement donner le nom du classeur pour désigner la macro, même si le classeur est le classeur actif.

Si on en croit le dictionnaire AppleScript d'Excel, on peut faire exécuter beaucoup de choses à Excel par le biais des scripts. Essentiellement des opérations portant sur les feuilles de calcul ou de graphiques. Pour les macros, il semble évidemment préférable de se "contenter" de lancer l'exécution de macros préalablement enregistrées dans un module VBA, ce qui n'est déjà pas si mal !!!

Pour plus d'efficacité, il vaut mieux passer le moins possible d'une application à l'autre et ne le faire que lorsque c'est inévitable.

Ci-dessous, une traduction/adaptation du document qu'on trouve sur le site Microsoft, concernant VBA et AppleScript. Ça se limite à l'exécution de Macros VBA à partir d'AppleScript, mais permet d'approfondir certains points (en particulier les codes d'erreur).

 

Codes d'erreur retournés par une procédure Sub

Une procédure Sub Visual Basic ne peut pas retourner une valeur explicite à la procédure AppleScript appelante. Toutefois, une procédure Sub peut stocker une valeur dans une cellule de classeur ou un nom défini. Ensuite, le script AppleScript peut aller lire la valeur de la cellule ou le nom pour voir si une erreur s'est produite. L'exemple suivant utilise un nom pour contenir le code retourné par une erreur dans la procédure Sub :

1.Dans Microsoft Excel ouvrir le classeur (Classeur1) créé précédemment.

2.Dans le menu Insertion, sélectionner Nom, puis cliquer Définir.

3.Saisi MonErreur dans la boîte Définir un nom.

4.Effacer tout texte dans la case Fait référence à puis y saisir ="ok". Cliquer OK.

5.Démarrer l'Editeur Visual Basic (OPTION+F11) et saisir dans le module : Sub Retour_Erreur_Sub() Dim x as Integer ThisWorkbook.Names("MonErreur").RefersTo = "ok" On Error GoTo handle: x = MsgBox(Prompt:="Cliquer Oui pour une erreur, sinon " & _"Cliquer Non", Buttons:=vbYesNo) If x = vbYes Then Error 1004 ' Génère une erreur d'exécution. End If Exit Sub handle: ThisWorkbook.Names("MonErreur").RefersTo = Err
End Sub

6.Dans le menu Application, cliquer Masquer Microsoft Excel.

7.Démarrer l'Editeur de scripts et saisir dans une nouvelle fenêtre : tell application "Microsoft Excel" Activate
Evaluate "Classeur1!Retour_Erreur_Sub()"
if not(Evaluate "Classeur1!MonErreur") = "ok" then set MonErreur to Evaluate ("Classeur1!MonErreur") set MonErreur to MonErreur as integer
display dialog "Une erreur est survenue : " & MonErreur
else display dialog "Pas d'erreur."
end if
end tell

8.Dans le menu Fichier, cliquer Enregistrer.

9.Choisir un dossier et un nom pour votre script dans la boîte de dialogue d'enregistrement puis cliquer Enregistrer.

10. Dans le menu Commandes, cliquer Exécuter.

Le script active Microsoft Excel et affiche un message.

11. Cliquer Oui.

Ceci crée une erreur dans la procédure Sub et modifie la valeur du nom"MonErreur". Ensuite une boîte de dialogue d'AppleScript affiche :
"Une erreur est survenue : 1004"

12. Cliquer OK.

NOTE : Si vous cliquez Non à l'étape 10, le script affiche le message "Pas d'erreur"

 

Créer une Macro

1.Démarrer Microsoft Excel.

2.Démarrer l'Editeur Visual Basic (OPTION+F11), puis cliquer Module dans le menu Insertion.

3.Saisir dans le module : Sub Test_Enregistrement() MsgBox "Ceci est une macro Excel." End Sub

4.Dans le menu Fichier, cliquer Fermer et retourner à Microsoft Excel.

5.Dans le menu Fichier, cliquer Enregistrer.

6.Enregistrer le classeur sous le nom "Classeur1".

7.Cliquer Masquer Microsoft Excel dans le menu Application.

 

Enregistrement du Script

Pour enregistrer le script :

1.Démarrer l'Editeur de scripts.

2.Dans le menu Commandes, cliquer sur Mémoriser.

3.Dans le menu Application, cliquer sur Microsoft Excel.

4.Sélectionner Macro dans le menu Outils, et cliquer Macros...

5.Dans la liste de macros, cliquer Test_Enregistrement, puis cliquer Exécuter.

Une boîte de dialogue affiche le message "Ceci est une macro Excel."

6.Cliquer OK.

7.Dans le menu Application, cliquer Editeur de scripts.

8. Dans le menu Commandes, cliquer Arrêter.

Le script enregistré ressemble à : tell application "Microsoft Excel" Activate Evaluate "Classeur1!Test_Enregistrement()" end tell

NOTE : Pour lancer des procédures Visual Basic (y compris les macros) à partir d'un script AppleScript, le nom de la procédure doit être suivi de parenthèses.

9.Dans le menu Fichier, cliquer Enregistrer.

10. Choisir un dossier et un nom pour votre script dans la boîte de dialogue d'enregistrement puis cliquer Enregistrer.

 

Codes d'erreur retournés par une procédure Function

Comme une fonction peut retourner une valeur, il est plus simple de passer un code d'erreur en retour que dans le cas d'une procédure Sub.

Pour récupérer les codes d'erreur dans une fonction :

1. Dans Microsoft Excel ouvrir le classeur (Classeur1) créé précédemment.

2. Dans le menu Insertion, sélectionner Nom, puis cliquer Définir. Function Retour_Erreur_Fonction () As Integer Dim x As Integer On Error GoTo handle: x = MsgBox(Prompt:="Cliquer Oui pour une erreur, sinon " & _ "cliquer Non", Buttons:=vbYesNo) If x = vbYes Then Error 1004 ' Génère une erreur d'exécution. Else Retour_Erreur_Fonction = 0 End If Exit Function handle: Retour_Erreur_Fonction = Err End Function

3. Dans le menu Application, cliquer Masquer Microsoft Excel.

4. Démarrer l'Editeur de scripts et saisir dans une nouvelle fenêtre : tell application "Microsoft Excel" Activate Evaluate "Classeur1!Retour_Erreur_Fonction()" if not (result = 0) then set MonErreur to result as integer
display dialog "Une erreur est survenue : " & MonErreur else display dialog "Pas d'erreur" end if end tell

5.Dans le menu Fichier, cliquer Enregistrer.

6.Choisir un dossier et un nom pour votre script dans la boîte de dialogue d'enregistrement puis cliquer Enregistrer.

7.Dans le menu Commandes, cliquer Exécuter.

Le script active Microsoft Excel et affiche une boîte de dialogue.

8.Cliquer Oui.

Ceci crée une erreur d'exécution dans la fonction, et la valeur renvoyée par la fonction et le code d'erreur. Puis une boîte de dialogue AppleScript affiche : "Une erreur est survenue : 1004."

9.Cliquer OK.

NOTE : Si vous cliquez Non à l'étape 7, le script affiche le message "Pas d'erreur"

 

Exécuter le Script enregistré

Pour exécuter le script :

1.Avec le script enregistré précédemment ouvert dans l'Editeur de scripts, cliquer Exécuter dans le menu Commandes.

La macro Test_Enregistrement s'exécute, le message "Ceci est une macro Excel."s'affiche.

2.Cliquer OK.

3.Dans le menu Application, cliquer Editeur de scripts.

Passer des arguments vers et depuis une procédure Visual Basic

Les exemples suivants passent des arguments depuis un script AppleScript vers une procédure Sub or Function de Visual Basic pour Applications.

Comme indiqué, le nom de la procédure doit comprendre le nom du classeur et être suivi de parenthèses pour fonctionner à partir d'un script AppleScript. Pour passer des arguments à une procedure, placez-les entre les parenthèses.