| ||||||||
Petite astucienne | Bonsoir, Quand je clique sur un bouton, je voudrai qu'une image s'affiche. Comment pouvoir faire ce lien ? Merci par avance, Cécilia | |||||||
Publicité | ||||||||
| ||||||||
Astucien | Bonsoir Cecilia, En programmant le bouton. Plus précisément par une procédure (VBA) qui affiche l'image attachée à l'évènement click du bouton. Comme tu ne spécifie pas de conditions particulières, cela peut se faire aussi autrement, notamment en utilisant l'image elle-même. Un petit exemple (résultant d'un exercice antérieur que j'ai encore en stock) pour voir ce qu'on peut faire et préciser tes desiderata. | |||||||
Petite astucienne | Bonjour Ferrand, Non, c'est pas ce que je veux. D'ailleurs, quand je clique sur l'image, j'ai le message suivant : Impossible d'exécuter la macro etc.... j'ai dèjà cherché et ne sais pas quoi activer. Bonne journée, Cécilia | |||||||
Astucien | Si tu n'actives pas les macros aucune procédure VBA ne pourra s'exécuter | |||||||
Petite astucienne | Bonsoir, Merci pour ces réponses. Effectivement je n'avais pas activé les macros.
| |||||||
Astucien | Bonsoir, La façon dont tu formulais ta question initiale : cliquer sur un bouton pour afficher une image peut recouvrir des finalités extrêmement diverses dans des environnements tout aussi divers. Ces éléments vont bien évidemment conditionner tes choix définitifs... Du point de vue des méthodes utilisables, qu'il s'agisse d'un bouton ou d'un autre type de contrôle la procédure à exécuter aura une série d'actions assez semblables à accomplir : identifier l'image et savoir où la trouver, la prélever ou la copier ou la déplacer, la mettre à l'emplacement prévu pour la montrer en la mettant s'il y a lieu dans la forme requise et prédéfinie. S'agissant d'un classeur Excel, il convient de distinguer deux cas principaux selon que l'image est déjà dans le classeur ou non. Si l'image à prélever doit l'être sur un stock de 10000 images, il est bien évident qu'il n'est pas souhaitable de les précharger toutes dans le classeur, s'il n'y en a qu'une ou un petit nombre il sera généralement plus avantageux de les avoir à disposition dans le classeur. Mais quantité d'autres critères peuvent faire pencher vers l'une ou l'autre de ces situations. Si l'image est extérieure, il faudra prévoir que le code VBA puisse identifier son emplacement pour pouvoir l'insérer dans le classeur. On en fera l'économie si l'image est dans le classeur. En général un clic sur le bouton (ou autre contrôle) affichera l'image et un clic sur l'image conduira à la désafficher. On aura donc deux procédures, une pour afficher, l'autre pour supprimer l'image. Dans le cas que je t'ai présenté, où le bouton est remplacé par l'image elle-même réduite à une dimension de miniature, on fait l'économie du stockage des images à un autre endroit du classeur, on fait également l'économie de son identification (elle est identifiée par le clic), et comme c'est toujours sur l'image qu'on clique on peut utiliser la même procédure pour afficher ou réduire à nouveau l'image. Il n'y a donc qu'un seule macro qui fait les deux. Du point de vue codage VBA, l'utilisation d'un bouton ou d'un autre contrôle ActiveX te fera programmer l'évènement click du contrôle, l'utilisation d'une autre forme (dont l'image) conduit à associer une macro à la forme. Au cas particulier présenté, cette association n'est pas effectuée préalablement mais réalisée à l'ouverture du classeur (évènement Open du classeur, qui assujettit la procédure d'affichage/réduction à un clic sur n'importe laquelle des formes [images] présentes). Ce qui permet d'ajouter ou substituer des images qui seront automatiquement concernée par la même procédure après ouverture du classeur. Ces considérations pour te donner une idée plus précise de l'éventail des possiblités et méthodes de réalisation. Maintenant, la question du comment faire dépend de ton choix final. Tu peux examiner les deux macros présentes (Module1 et module classeur ThisWorkbook). La procédure principale définit un emplacement unique d'affichage, mémorise la position initiale pour la repositionner au même endroit lors de la réduction, applique un coefficient multiplicateur pour l'afficher (tous paramètres étant modifiables sans changer de méthode). Regarde de plus près, définit précisément le résultat que tu veux obtenir à partir de quelle situation de départ, demande les explications dont tu as besoin...
| |||||||
Petite astucienne | Bonjour,
Dans le cas que je t'ai présenté, où le bouton est remplacé par l'image elle-même réduite à une dimension de miniature, on fait l'économie du stockage des images à un autre endroit du classeur, on fait également l'économie de son identification (elle est identifiée par le clic), et comme c'est toujours sur l'image qu'on clique on peut utiliser la même procédure pour afficher ou réduire à nouveau l'image. Il n'y a donc qu'un seule macro qui fait les deux.
| |||||||
Astucien | 17 n'est qu'un coefficient multiplicateur, tu peut prendre n'importe quel nombre, c'est fonction de la taille que tu veux obtenir pour l'image affichée. La position de la miniature est définie par les coordonnées horizontale (Left) et verticale (Top) de l'angle supérieur gauche. Les valeurs sont mémorisées avant de l'agrandir. On agrandit l'image en hauteur (Height) et en largeur (Width) en multipliant ces dimensions par un coefficient (ici 17). On positionne l'image à partir de l'angle supérieur gauche de la fenêtre (Left=0 et Width=0, mais on peut la positionner où on veut). Lorsqu'on reclique sur l'image, la procédure identifie qu'elle mémorisé le nom de l'image, elle redivise les dimensions par le coefficient et la repositionne selon les coordonnées mémorisées.La mémorisation est faite simplement au moyen de variables statiques (qui conservent leur valeur entre deux appels de la procédure, déclarées avec le mot-clé Static), ce qui rend aisé l'utilisation de la même procédure pour les deux opérations. | |||||||
Petite astucienne | Merci pour la rapidité, je commence à mieux comprendre. Mais je vais ou dans excel, je sais juste faire les simples en commençant par l'icône enregistrer une macro. | |||||||
Astucien | Inutile de chercher à enregistrer une macro, tu n'en obtiendras pas d'utilisable pour faire ce genre de chose. Tu vas dans l'éditeur Visual Basic, dans 2007 c'est sous l'onglet Développeur (il faut l'avoir activé dans les Options). Tu peux aussi faire Alt+F11 pour l'ouvrir. Les macros sont des instructions (du code) tapées sous forme de texte dans des feuilles appelées Modules. Si tu fais un clic droit dans le volet gauche de l'éditeur (Projet, où est décrite la composition de ton classeur) et choisis Insertion dans le menu contextuel, tu auras le choix entre Userform, Module et Module de classe. Les Userform sont des fenêtres affichables sous Windows, formulaires que tu peux utiliser dans ton application pour des choses très diverses. Laissons de côté pour le moment (ainsi que les modules de classe) et tu cliques sur Module. Tu verras un Module, simple feuille blanche pour y écrire du code dont tu pourras déclencher l'exécution (il sera alors lu par un interpréteur de commandes pour être exécuté). Ces Modules, appelés aussi modules standard pour les distinguer des modules attachés à un objet (feuille de calcul, classeur, userform) sont ceux que tu utiliseras pour la plupart des macros courantes. Ce que tu peux taper sur un Module se présente sous 3 formes : des instructions de déclarations (variables, constantes, définitions d'options), code non exécutable mais utilisé par le code exécutable, des procédures, soit le code exécutable, et des commentaires (pour t'y retrouver par la suite !). Tout ce que tu tapes sur une ligne à la suite d'une apostrophe (') (ou du mot-clé rem) n'est pas exécutable. Tout le code exécutable ne peut être que dans les procédures. Les deux types principaux de procédures à utiliser sont les procédures Function (fonctions qui renvoient une valeur ou un résultat) et les procédures Sub (qui exécutent une action). Une telle procédure commence toujours par le mot-clé Sub suivi du nom que tu lui attribues et se termine par End Sub. L'exécution d'une procédure peut être lancée manuellement (commande Macro du menu) ou attachée à une combinaison de touches, une commande de menu, un contrôle (bouton, etc.). Elle aussi être déclenchée automatiquement par un évènement prédéfini survenant dans Excel (modifier la sélection, activer la feuille, fermer le classeur, etc., il y a un grand nombre d'évènements utilisables). Ces procédures automatiques, qu'on appelle évènementielles, ne sont pas tapées dans les modules standars mais dans le module attaché à l'élément d'Excel qui subit l'évènement que l'on veut programmer, et elles ont des noms prédéfinis pour chaque évènement. Par exemple, tu fais clic droit sur ThisWorkbook dans le même volet déjà vu et choisis Code, cela ouvrira le Module attaché au Classeur. C'est aussi une feuille blanche ! Tu déplies alors la liste déroulante de gauche ou apparaît (général) et tu sélectionnes Workbook. Tu vas voir apparaître sur le Module l'instruction: Private Sub Workbook_Open(), suivi de End Sub 2 lignes plus bas et il ne te reste plus qu'à taper entre ces 2 instructions le code que tu veux exécuter à l'ouverture du classeur (évènement par défaut du classeur). Si tu déroules la liste de droite tu pourras choisir d'autres évènements. Une procédure peut en appeler une autre. Supposons que tu utilises un classeur tous les jours et que tu y aies des choses différentes à faire selon que le jour est pair ou impair; tu as tapé une macro pour préparer le classeur pour les jours pairs et te l'afficher à la feuille utile (dans un module standard), tu en as tapé une seconde pour les jours impairs. Tu vas alors programmer l'ouverture du classeur pour qu'il évalue la date et selon qu'il s'agit d'un jour pair ou impair lance l'une ou l'autre des macros. Tu peux aussi n'avoir tapé qu'une seule macro qui peut faire ce que font les 2 précédentes selon le jour: il faudra donc la lancer en lui disant si c'est pair ou impair; tu vas donc prévoir qu'elle soit appelée avec un argument (on les indique entre le parenthèses qui suivent le nom de la procédure) qui dans ce cas peut être de type booléen (vrai pour pair/faux pour impair). Ta procédure d'ouverture va alors toujours évaluer le jour mais pour définir la valeur de l'argument nécessaire pour lancer la macro unique. Ouf si je continue je vais finir par me lancer dans un cours de VBA... On n'en est pas encore là, juste quelques rudiments pour que tu commences à te familiariser avec les éléments les plus utilisés et concevoir ce que tu veux faire de façon à pouvoir le programmer. | |||||||
Astucien | Tant que j'y suis voici une explication détaillée de la première macro (évènementielle): Private Sub Workbook_Open() | |||||||
Petite astucienne | Bonsoir,
| |||||||
Astucien | Bonsoir, Je me rends compte que je ne t'avais pas mis la macro principale avec explications: Sub AffichImage() | |||||||
|
Les bons plans du moment PC Astuces | Tous les Bons Plans | ||||||||||||||||||
|