Piloter des macros Excel
Suite à une discussion récente sur les forums du site :
J’ai des macros dans un classeur Excel. Comment les piloter à partir d’Access ?
Dans Excel
Imaginons que vous ayez ces 2 macros dans un module de votre classeur Excel :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
' --- ' AFFICHAGE D'UN MESSAGE... SIMPLE ;-) ' --- Sub MessageSimple() MsgBox "Ceci est une macro Excel" End Sub ' --- ' RENSEIGNER UNE CELLULE PARAMETREE ' --- Sub RenseignerCellule( _ ByVal strFeuille As String, _ ByVal strCellule As String, _ ByVal strValeur As String) ' Renseigner la cellule demandée Sheets(strFeuille).Range(strCellule).Value = strValeur End Sub |
Exécuter une macro simple
Repassez dans Access…
- Démarrez Visual Basic Editor (touches
ALT
+F11
). - Commencez par établir une référence à Microsoft Excel Objects, dans le menu Outils / Références.
- Cliquez sur le menu Insertion / Module, puis recopiez dans le module le code suivant :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
' --- ' PILOTAGE EXCEL SIMPLE ' --- Sub PilotageMacro1() Dim xl As Excel.Application Dim wbk As Excel.Workbook ' Démarrer Excel et le rendre visible Set xl = New Excel.Application xl.Visible = True ' Ouvrir le classeur qui contient les macros Set wbk = xl.Workbooks.Open("C:\Users\Hervé\Desktop\Classeur\Macro.xlsm") ' Exécuter une macro xl.Run "MessageSimple" ' Fermer le classeur sans l'enregistrer wbk.Close False Set wbk = Nothing ' Quitter Excel xl.Quit Set xl = Nothing End Sub |
Ce bloc de code exécute la macro MessageSimple
d’Excel, puis ferme le classeur Excel sans l’enregistrer. C’est la méthode Run
qui permet d’exécuter une macro par son nom.
Exécuter une macro avec arguments
Si la macro Excel contient des arguments, comme la macro RenseignerCellule
, le principe est le même : il suffit de fournir les paramètres à la suite de la méthode Run
. Ce qui donne :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
' --- ' PILOTAGE EXCEL - MACRO AVEC ARGUMENTS ' --- Sub PilotageMacro2() Dim xl As Excel.Application Dim wbk As Excel.Workbook ' Démarrer Excel et le rendre visible Set xl = New Excel.Application xl.Visible = True ' Ouvrir le classeur qui contient les macros Set wbk = xl.Workbooks.Open("C:\Users\Hervé\Desktop\Classeur\Macro.xlsm") ' Exécuter une macro xl.Run "RenseignerCellule", "Feuil1", "B5", "Dimanche" MsgBox "Pause", vbInformation ' Fermer le classeur sans l'enregistrer wbk.Close False Set wbk = Nothing ' Quitter Excel xl.Quit Set xl = Nothing End Sub |
Dans ce code, j’ai rajouté une pause (par MsgBox
) au niveau d’Access, avant la fermeture du classeur Excel, pour avoir le temps de vérifier que la cellule B5
de la feuille 1 contient bien la valeur « Dimanche » !
Pour tester…
- Vous avez construit le classeur Excel avec les 2 macros données en début d’article.
- Vous disposez d’une base Access avec les procédures
PilotageMacro1
etPilotageMacro2
. - Aménagez les chemins de l’instruction
Workbooks.Open
(il s’agit du chemin complet vers le classeur Excel). - Le classeur Excel est supposé fermé au départ.
- Exécutez l’une des 2 procédures Access.
paidge > Dans un premier temps, il faut que la procédure soit
Public
plutôt quePrivate
. Sinon elle n’est pas visible de l’extérieur (y compris d’un autre module Excel). Ça fait quoi, en changeant déjà ça ?Bonjour,
Dans un classeur Excel 2003, j’ai une private sub sur Sheet1 qui s’appelle par exemple « tutu » et qui utilise des modules de classe spécifiques au classeur. Comment je peux l’appeler depuis Access 97 ?
J’ai essayé pas mal de solutions comme la méthode Run citée dans ton billet (xlApp.Run xlSheet.BneUploadDocument) mais sans succès 🙁 Une idée ?