C'est là que nous pouvons introduire la notion de macro. Une macro est un ensemble d'instructions écrites dans un langage relativement simple appelé VBA, acronyme de Visual Basic For Applications. Une macro sert à automatiser une tâche longue ou répétitive, comme un formatage particulier de cellules.
VBA est un langage de programmation orienté objet comparable à Visual Basic ; il est possible de réaliser des applications complètes qui interagissent avec l'utilisateur ou des applications externes.
Excel dispose d'un enregistreur de macros. Quand vous actionnez l'enregistreur , Excel "enregistre" vos faits & gestes, et produit le code correspondant aux actions que vous avez effectuées. Pour reproduire l'action que avez enregistrée, vous n'avez plus qu'à réexécuter cette macro (bouton play).
Lorsqu'il s'agit de faire certaines actions plus élaborées (incluant conditions & calculs spécifiques), vous devez modifier le code de votre macro avec l'outil d'édition du code VBA qui est Microsoft Visual Basic Editor.
Excel et VBA mettent à votre disposition toutes les ressources et moyens techniques nécessaires à la construction de véritables interfaces applicatives.
VBA est un langage de programmation dédié aux applications office qui découle du langage Microsoft Visual Basic.
Autre Plaidoyer pour Excel & VBA : Extrait de commentaires de Pierre L. (News)
Enregistrement d'une macro
Afin de faire apparaître la boîte de dialogue « Enregistrer une macro », mettez en oeuvre l'une ou l'autre des méthodes suivantes :
A présent,
Que se passe-t-il lorsque vous avez appuyez sur OK !
... si vous avez choisit d'enregistrer la macro dans :
Sub Ma_Macro()
'
' Ma_Macro Macro
' Macro enregistrée le 14/05/2001 par Stéphane Royer
'
' Touche de raccourci du clavier: Ctrl+ !
'
ICI SERA INSCRIT LE CODE CORRESPONDANT A VOS ACTIONSEnd Sub
Comment arrêter l'enregistrement ?
Comment voir le code généré ?
A noter !
Comment réexécuter une macro : plusieurs méthodes
- Donner à la variable WB le nom du classeur (ici "Classeuraappeler.xls") qui contient la macro que vous voulez exécuter,
avec éventuellement son chemin d'accès complet s'il ne se situe pas dans le même répertoire que votre classeur "quelconque".- Donner à la variable NomMacro le nom de la macro à exécuter (ici "Macro1"), et indiquer ses éventuels paramètres en les séparant par une virgule.
Sub appel_exemple_1()
Dim WB As String
Dim NomMacro As String
Dim Arg1 As String
WB = "Classeuraappeler.xls"
NomMacro = "Macro1"
Arg1 = "Val1"
Application.run WB & "!" & NomMacro, Arg1
End Sub
'voir aussi http://www.deja.com/getdoc.xp?AN=550234882&fmt=text
Appel "direct"
Cet appel direct requiert la création d'une référence au classeur contenant la procédure à appeler
Instructions
- Ouvre ou active le classeur contenant la ou les procédures à appeler ("Toto.xls").
- Renomme le nom du projet du classeur qui est VBAProject par défaut.
Pour cela, sous l'éditeur VBA, fais Outils -> Options de VBAProject,
Remplace "VBAProject" par un autre nom de projet (par exemple "Zaza").
- Enregistre ce classeur
Puis,
- Ouvre ou active le deuxième classeur ("Tata.xls") devant appeler les procédures de Toto.xls.
- Sous l'éditeur VBA, fais Outils -> Références, et coche la ligne "Zaza", puis OK.
Cette commande ajoute une référence vers Toto.xls dans Tata.xls.
Désormais, toutes les procédures et fonctions implicitement ou explicitement publiques de Toto.xls (de même que ses variables publiques) seront désormais accessibles à Tata.xls exactement comme si elles faisaient partie de ce dernier classeur.
Donc à la place d'un appel de procédure comme suit << Run "Toto.xls!MaProc", Arg1, Arg2 >>
Tu peux faire un appel direct à la procédure : << MaProc Arg1, Arg2" >>
'NB : les macros complémentaires marchent sur le même principe.
Conseils pour l'écriture d'une macro
Pour une procédure | Pour une fonction |
sub Ma_Macro() end sub |
function Ma_Fonction() end function |
vous trouverez plus bas dans la page de petites explications supplémentaires sur les fonctions et procédures ici.
A noter !
- l'enregistreur de macros créé uniquement des procédures de type sub.
application | correspond à une instance d'excel |
workbooks | correspond aux classeurs ouverts dans une instance d'excel |
activeworkbook | correspond au classeur actif dans l'instance d'excel |
sheets | correspond à une feuille indépedemment de son type |
worksheets | correspond spécifiquementà une feuille de calclul |
activesheet | correspond à la feuille active |
range | correspond à une plage cellule |
cells | correspond à toutes les cellules |
activecell | correspond à la cellule active |
etc. |
Fonctions & Procédures, comment donc ?
Une fonction exécute une tâche spécifique au sein d'un programme Visual Basic et renvoie une valeur.
Elle commence par une instruction Function et se termine par une instruction End Function.
En l'absence des mentions Public, Private ou Friend devant l'instruction Function, la fonction est publique par défaut.
Vous pouvez par exemple la rendre privée pour qu'elle soit seulement appellable par une procédure d'un même module.
Elle peut accepter des paramètres optionnels ou obligatoires.
Elle peut être appelé à partir d'une autre fonction ou procédure, et elle peut appeler d'autres fonctions ou procédures.
Elle peut être utilisé comme fonction dans une formule classique.
Elle peut être appelé d'une autre macro, voir plus haut, au 5 ième point.
Elle peut retourner ou non un résultat.
On peut définir le type de résultat retourné comme on définit une variable.
Ci-dessous, vous trouverez des manières d'utiliser une fonction.
Premier exemple, la fonction "la_fonction" (je ne suis pas allé chercher bien loin le nom ;-) ).
Cette fonction accepte un paramètre obligatoire l'adresse d'une cellule et un paramètre optionnel, le facteur de multiplication, et surtout elle retourne un résultat.
Si le paramètre optionnel a été renseigné, la valeur de la cellule sera multipliée par le facteur, sinon la valeur sera retournée telle quelle.
Le test de présence d'une variable lors d'un appel à une procédure se fait avec l'instruction IsMissing.
function la_fonction(rg As range, optional facteur) as variant if ismissing(facteur) then la_fonction = rg.value else la_fonction = rg.value * facteur end if end function |
Explications |
Les variables passables en paramètres sont renseignées les unes après les autres et séparéées par une virgule. A ce moment là, on peut les définir en spécifiant leur type : rg as range, où rg correspondra à une plage de cellules. Le résultat retourné est défini comme une variable de type variant. la méthode ismissing permet de contrôler si la variable optionnelle a été passée. |
sub demo_function() Pour appeler une fonction qui retourne un résultat, il faut utiliser une variable où stocker ce résultat : |
Troisième exemple, Appel dans une formule
Ci-dessous vous verrez comment appeler la fonction la_fonction à partir d'une formule.
=la_fonction(A1;3) Pour utiliser la fonction après vous être positionné sur une cellule, vous pouvez afficher la boîte d'insertion de fonctions (Menu Insertion) et choisir la fonction nouvellement créée dans la catégorie "Fonctions personnalisées". |
Une procédure Sub exécute une tâche déterminée au sein d'un programme, sans renvoyer aucune valeur explicite.
Elle commence par une instruction Sub et se termine par une instruction End Sub.
Elle aussi peut être publique ou privée (rattachée à une feuille de code précise), etc.
Vous pouvez par exemple la rendre privée pour qu'elle soit seulement appellable par une procédure d'un même module.
Si vous la déclarez privée, elle n'apparaît plus dans la liste des macros disponibles, c'est une manière de cacher une macro, cacher une procédure.
Elle peut accepter des paramètres optionnels ou obligatoires.
Elle peut être appelée à partir d'une autre fonction ou procédure, et elle peut appeler d'autres fonctions ou procédures.
Elle peut être appelée d'une autre macro, voir plus haut, au 5ième point.
Tester l'existence d'une macro : existence.htm
D'autres infos sur les fonctions : xl_fonction.htm
Les composantes d'un projet Visual Basic For Applications
Chaque classeur Excel, quand il est créée, comporte un certain nombre de feuilles de calcul et un "Projet VBA" qui n'est rien d'autre qu'une coquille vide prête à recevoir du code VBA.
Pour accéder au projet VBA d'un classeur, on utilise l'éditeur « Visual Basic Editor ». Son ouverture est notamment possible par le menu en suivant ce chemin : Outils/ Macros/ Visual Basic Editor (VBE).
Une fois VBE ouvert, vous devez voir une petite fenêtre nommée "Explorateur de projet" où vous verrez pour chacun des classeurs ouverts le projet VBA qui lui correspond, nommé "VBAProject(LeClasseur)". Si cette fenêtre n'est pas ouverte, passer par le menu Affichage ou utiliser le raccourci clavier Ctrl + R.
Dans cette fenêtre, vous voyez tous les objets qui composent un projet VBA, ce sont :
Vous pouvez ainsi insérer ces objets par le menu « Insérer » ou par le biais de boutons d'une barre d'outils
Les feuilles de code vont contenir les macros à l'aide desquelles vous allez manipuler les feuilles de calcul, les différentes objets d'Excel dont les formulaires.
On pourrait dire qu'il existe deux types de feuilles de code :
En double-cliquant sur l'objet thisworkbook qui représente le classeur Excel ou sur les objets Feuil1, Feuil2, Feuil3 (etc.), vous avez également accès à la feuille de code propre à ces objets. Vous devez y insérer du code dans ces derniers seulement si vous voulez associer votre code à l'avènement de certaines actions produites sur ces objets. Cela revient à créer une procédure dite événementielle. Le cas contraire, le code devra être placé dans une feuille de code standard, un module, ou un module de classe.
Les formulaires sont des objets graphiques dont vous pouvez personnaliser l'aspect, le comportement et le contenu. En effet, il est possible d'avoir un formulaire avec une couleur particulière, qui soit centré à l'écran, et à travers lequel l'utilisateur peut consulter et saisir des données : visualiser un graphique, saisie des fiches produits, etc. Un formulaire peut également contenir des objets comme des boutons radios, des cases à cocher, etc. D'autres informations figurent ci-après.
Si vous cherchez à recréer de telles boîtes sous Excel 97 et supra alors faites les opérations suivantes : cliquer à droite sur un onglet d'une feuille de calcul, choisissez "insérer", une boîte de dialogue apparaît, et vous n'avez plus qu'à choisir l'icône correspondant à ce type d'objet, celui représenté ci-dessous.
Ainsi les applications construites avec ces formulaires peuvent marcher sur les nouvelles versions, du moment où leur code est convertit si nécessaire en anglais s'il était en français.
Des infos sur l'utilisation des macros de versions inférieures : xl_all.htm
Au passage, expliquons la nature des objets que sont les boîtes de dialogue modales & non modales, message du 18 Novembre 1999 dans le groupe de discussion microsoft.public.fr.excel :
Avant de vous laisser consulter les pages de Microsoft, je vais vous faire part des quelques réflexions que j'ai pu trouvé ici & là :
Message de Didier L., le jeudi 23 septembre 1999 01:30 sur microsoft.public.fr.excel
Cela sert à créer une classe, qui est la définition formelle d'un objet (méthodes et propriétés).
A l'exécution, une instance de l'objet est créée à partir de ce modèle. Une classe objet possède en outre 2 procédures événementielles - Initialize et Terminate - qui sont déclenchées respectivement lors de la création (Set ... New) et la destruction (Set ...Nothing).
Puisque VBA, comme VB, ne gère pas encore l'héritage (créer un nouvel objet à partir d'une classe existante en ne la modifiant qu'en partie), le principal intérêt est d'encapsuler données et procédures en mémoire (accès protégé). Autre avantage, la réutilisation ou le partage des classes objets.
Un p'tit exemple simpliste pour illustrer:
imaginons un objet dont la seule méthode est d'afficher un message "bonjour". Dans un module de classe, il suffit de déclarer une procédure (on la déclare publique pour qu'elle soit accessible - si on voulait ajouter des propriétés, il faudrait utiliser Property Let et Property Get : voir message de news par Laurent L.
'soit un module de classe "class1" contenant la procédure suivante
Sub AffMsg
MsgBox "Bonjour"
End Sub
'on peut alors écrire dans un module public le code suivant
Sub toto
Dim monObj as Object
Set monObj = New Class1 'initialise une nouvelle instance de la class1, 'ce qui déclenche la procédure Initialize
monObj.AffMsg 'déclenche la procédure AffMsg de l'objet
Set monOgj = Nothing 'libère la mémoire et détruit l'instance '(procédure Terminate)
End Sub
Remarque par Laurent L. suite à ce message
J'ajouterais que les modules de classe sont également nécessaires pour définir des procédures événementielles de niveau 'Application'. Une utilisation intéressante réside aussi AMA dans la création d'objets de type "WorksheetFunction" rassem<blant ses propres fonctions personnalisées VBA.
Explication de Laurent sur le site Disciplus Simplex : A VOIR !!
Message de Chip Pearson à ce sujet, le 26 novembre 1999 sur le groupe microsoft.public.excel.programming : news
Il dit notamment que vous pouvez aussi créer des types de données de ce genre dans un module standard en utilisant l'instruction Type, mais les réaliser dans un module de classe vous donnera plus de contrôles sur celles-ci.
Articles de Microsoft
http://www.microsoft.com/officedev/articles/classmod.htm
http://www.microsoft.com/officedev/articles/movs109.htm
http://www.microsoft.com/officedev/articles/AdvClMod.htm
http://support.microsoft.com/support/Excel/Content/FileIO/FILEio.asp
!! certains articles ont peut-être changés d'adresse, il vous faudra les retrouver.
Un classeur exemple à télécharger sur Excel Downloads (côté programmation)
Mais qu'est-ce donc ?!
C'est un classeur créé par Excel et stocké dans le répertoire \program files\Microsoft Office\office\xlouvrir lors du premier enregistrement de macros. Ainsi à chaque ouverture d'Excel, ce classeur est ouvert mais attention vous ne le voyez pas car il est masqué par défaut. Vous pouvez écrire dans ce classeur des macros auxquelles vous voulez pouvoir accéder à partir de différents classeurs.
Comment appeler une procédure sub se trouvant dans le classeur "Perso.xls" (13/09/99, by L.L.)
Run "Perso.xls!NomMacro" 'appel de la procédure NomMacro mais si plusieurs modules contiennent des macros homonymes, alors il faut indiquer faire référence comme montré ci-dessous au module concerné :
Run "Perso.xls!NomduModule.NomMacro"La méthode ci-dessous permet de faire appel aux macros et fonctions du classeur "Perso.xls" comme si elles faisaient partie du classeur.
Il faut créér une référence directe au classeur "Perso.xls" au sein du classeur qui doit appeler ses macros.
Dans l'éditeur VBA,
- Sélectionne le projet du classeur Perso.xls
- Fais Outils -> Propriété de VBAProject
- Dans la zone "Nom du projet", tape "Perso", puis OK
- Enregistre-le (Ctrl-S)
- Sélectionne le projet du classeur Test.xls
- Fais Outils -> Références
- Coche la ligne "Perso", puis OK
Voir aussi http://w1.2735.telia.com/~u273500023/english/vbe.htm
Qu'est-ce qu'une « Macro complémentaire » ou « Add-In » en anglais ?
Une macro complémentaire peut être considéré comme un véritable composant pouvant être installé sur votre ordinateur pour ajouter des commandes et des fonctions à Excel. Ces macros sont propres au programme Excel. Cela peut également être ce qu'on appelle des macros COM (Component Object Model, modèle d'objet composant).
C'est en fait est un classeur Excel, il possède lui aussi des objets, des modules et des feuilles de calcul.
Le classeur xla est un classeur de même structure qu'un classeur xls et contient donc obligatoirement des feuilles, même si elles peuvent être vides.
Comment crééer une macro complémentaire ?
1. Enregistrer votre fichier excel au format xla : Fichier -> Enregistrer sous -> Type de fichier = "Macro complémentaire Microsoft Excel (*.xla)"
2. Ouvrir Visual Basic Editor.
3. Dans l'explorateur de projet, sélectionner "thisworkbook" pour le projet concerné.
4. Fixer la propriété IsAddin à VRAI. Ceci masquera toutes les feuilles de votre classeur.
5. Sauvegarder le projet, votre macro complémentaire est prête !
Si vous le stockez dans C:\Program Files\Microsoft Office\Office\Modèles, vous verrez votre fichier en allant dans outils/macros complémentaires
Les macros complémentaires XLA sont masquées par défaut et seul leur code est visible dans l'éditeur VBA.
Que se passe-t-il alors ?
En fait, quand on vient d'enregistrer un classeur standard comme macro complémentaire, on reste dans le classeur standard. Le fichier XLA est créé à part, mais il n'est pas ouvert. Pour ouvrir ensuite le fichier XLA qui vient d'être créé, il faut fermer le classeur qui a servi à le construire (inutile de l'enregistrer, d'ailleurs) et ouvrir ensuite la macro complémentaire, de préférence par Outils -> Macros complémentaires.
Sous Excel 97 et sup, les XLA sont simplement des classeurs "normaux" masqués, dont la propriété 'IsAddIn' est égale à True. Comme .xla est une extension de macro, ces classeurs sont automatiquement affichés dans la boîte de dialogue du gestionnaire de macro complémentaire, au même titre que les XLL. C'est leur seul avantage. Un classeur XLS dont on mettrait la propriété IsAddin sur True se comporterait exactement comme un classeur XLA. Ceux-ci ne sont ni plus rapides, ni plus compacts.
Avec les versions antérieures (Excel 5 et 95), les XLA étaient "cryptés" (bien que très facilement déplombables) à partir de classeurs standard. Il était donc nécessaire de conserver les classeurs XLS d'où étaient tirées les macros XLA pour pouvoir visualiser et modifier le code. Ce n'est plus du tout le cas à partir d'Excel 97.
On peut très bien enregistrer le code dans un classeur séparé des données, le classeur contenant le code peut être enregistré au format XLA puis installé en macro
complémentaire. Pour les versions antérieures à Excel 97, il faut conserver le classeur Excel original, parce qu'on ne peut plus modifier le code une fois compilé en macro complémentaire. Je conseille de désinstaller une macro complémentaire avant d'en réinstaller une version plus récente.
Supprimer une macro complémentaire manquante
Sous Excel, fais Outils -> Macros complémentaires, puis sélectionne dans la liste la macro XLA qui correspond au message d'erreur que tu as au démarrage. Normalement, tu devrais voir alors un message s'afficher, du type "Impossible de trouver la macro complémentaire... Voulez-vous la supprimer de la liste?". Clique sur "Oui", et ton problème devrait être réglé.
Code pour sauvegarder un fichier en tant que macro complémentaire
With ActiveWorkbook
.saveas "C:\Temp\Zaza.xla", xlAddIn
.IsAddin = True
.Save
End With
Fermer les classeurs référencés à la fermeture du classeur qui les utilise: news
Articles de Microsoft
XL97 : How to Create an Add-in File in Microsoft Excel 97" http://support.microsoft.com/support/kb/articles/Q156/9/42.ASP
HOWTO: Build an Add-in (XLL) for Excel Using Visual C++ http://support.microsoft.com/support/kb/articles/Q178/4/74.ASP
Informations sur les macros XLL : http://longre.free.fr