vendredi 13 juillet 2012

Protégez vos zones de graphiques

Si vous développez des modèles ou fichiers Excel générant des graphiques automatiques, pensez à protéger l'accès aux graphiques des mauvaises manipulations de vos utilisateurs.

Pour cela, à partir de l'onglet Développeur, activez le mode Création et insérez par-dessus la zone de graphique un contrôle ActiveX de couleur transparente qui empêchera toute action par clic sur le graphique.


Choisissez un contrôle de type Label et veillez à :
  1. Figer les dimensions du Label : Autosize = False
  2. Appliquer une couleur de fond blanche (ou de la même couleur que le fond de votre fenêtre Excel) : Backcolor = &H00FFFFFF&
  3. Sélectionner une apparence transparente :
    Backstyle = 0 - fmBackStyleTransparent
  4. Vider le contenu texte du Label : Caption = ""
  5. Définir le type de curseur apparaissant au suevol du Label (symbole d'interdiction) : MousePointer = 12 - fmMousePointerNoDrop




Quittez le mode Création et testez votre protection de graphique :  survolez votre zone de graphique, cliquez dessus et constatez le comportement du contrôle ActiveX.

Pour ôter la protection de la zone graphique, vous devez simplement revenir en mode Création et supprimer le contrôle ActiveX.
 



jeudi 12 juillet 2012

Personnalisez votre ruban d'accès rapide (leçon n°1)

Les rubans : qu'est-ce donc ?

Dans Microsoft Office 2007 et 2010, le ruban vient remplacer les barres d'outils et les menus des versions antérieures. C'est ce qui s'appelle désormais l'interface Microsoft Office Fluent puisqu'il est censé permettre de trouver les commandes usuelles de manière plus fluide, plus rapide.
(Cliquez pour agrandir)
Si vous souhaitez développer à base de macros VBA un outil Excel disposant de plusieurs onglets entre lesquels vous devez naviguer ou si votre outil réalise un ensemble de tâches déclanchées sur des appuis boutons, des sélections de liste déroulantes ou des cases à cocher... privilégiez l'usage d'un ruban personnalisé pour exécuter ces actions.
Pour cela, commencez par installer CustomUI Editor, un utilitaire permettant l'édition de fichiers XML de description de rubans MS Office.
 Etudions de près les différents composants d'un ruban MS Office :
  • Les onglets permettent de passer d'un ruban à l'autre
  • Le ruban est constitué d'un ensemble de groupes
  • Chaque groupe est constitué d'un ensemble de boutons ou autres types de contrôles (checkbox, combobox, ...) de taille "normale" ou "large"
(Cliquez pour agrandir)
Le code XML que vous allez éditer avec CustomUI Editor devra donc spécifier chacun de ces composants.

Réalisation du ruban pas à pas

Tout d'abord, sachez que CustomUI Editor tient compte de la version de vos suite MS Office : certains synthaxes de descrption XML diffèrent entre MS 2007 et MS2010. Il faudra donc veiller à créer, pour chacun de vos fichier Excel, deux version de code XML tenant compte de ces différences mineures.

1. Créez un nouveau fichier Excel à partir de l'application MS Excel et sauvegardez au format *.xlsm le dans le répertoire de votre choix, puis fermez-le.
Attention : le fichier Excel ne devra être ouvert que par une applicaiton à la fois, soit MS Excel soit CustomUI Editor afin de ne pas prendre le risque de perdre vos modifications.
2. Lancez l'utilitaire CustomUI Editor et ouvrez-y le fichier Excel que vous venez de fermer. Vous observerez le nom de votre fichier Excel dans la colonne de gauche de l'utilitaire, mais rien d'autre jusque là.

(Cliquez pour agrandir)
 





3. Par un clic droit sur l’intitulé de votre fichier Excel dans la colonne de gauche, sélectionnez les deux version d’Office 2010 et 2007. Cela vous créera deux fichiers XML vides qui viendront s’ajouter dans la colonne de gauche : customUI14.xml pour Office 2010 et customUI.xml pour office 2007. Pensez à sauvegarder votre action !

4. Double-cliquez sur customUI.xml le fichier XML destiné à la version 2007 et collez dans la partie de droite de la fenêtre les lignes de code suivantes, puis cliquez sur le bouton « Validate » afin de vérifier la synthaxe, puis sauvegardez.

Lisez attentivement les commentaires inscrits entres les symboles < !-- et -->
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" >
<!--Pour MS Office 2007, le lien  http à spécifier point vers le répertoire …/2006/01/…-->
<ribbon startFromScratch="false">
<!--Positionnez cette valeur à TRUE pour masquer tous les autres onglets standards de MS Excel, ou à FALSE pour les maintenir en place.-->
<tabs>
<!--Les Tabs sont les onglets du ruban. Vous pouvez en créer autant que nécessaire.Ils vont se positionner automatiquement à la fin du ruban -->
  <tab id="SmartXL" label="Smart-XL" visible="true">
      <!--Premier groupe de contrôles : on insère ici deux boutons de taille large-->
      <group id="GroupFichier" label="Fichier">
      <button id="btnOuvrir" label="Ouvrir" onAction="OuvrirFichier" size="large" imageMso="FileOpen" />
      <button id="btnEnregistrer" label="Enregistrer" onAction="EnregistrerFichier" size="large" imageMso="FileSave" />
      </group>
      <!--Deuxième groupe de contrôles : on insère ici deux boutons de taille normal-->
      <group id="GroupFeuille" label="Feuille">
      <button id="btnAjouterFeuille" label="Ajouter" onAction="AjouterFeuille" size="normal" imageMso="SheetInsert" />   
      <button id="btnSupprimerFeuille" label="Supprimer" onAction="SupprimerFeuille" size="normal" imageMso="SheetDelete" />
      </group>
  </tab>
</tabs>
</ribbon>
</customUI>
(Cliquez pour agrandir)
Pour chaque critère imageMso  la valeur saisie entre guillemets correspond au nom standard de l’image utilisée par MS Office. Attention, là encore les noms peuvent varier entre les différentes versions de MS Office. Vous trouverez la liste exhaustive des imageMso sur les liens suivants :
5. Copier le contenu XML du fichier cutoumUI.xml (MS Office 2007), puis double-cliquez sur le fichier customUI14.xml (MS Office 2010) et collez le code dans la partie droite de la fenêtre. Cliquez sur le bouton Validate et constatez que l’utilitaire vous indique à corriger : remplacez au début du fichier le chemin http par le lien suivant :
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="InitialiserRuban">
Remarquez qu’en cas d’erreur de synthaxe XML, CustomUI Editor vous indiquera la ligne et la colonne où se situe l’erreur. Vous n’aurez plus qu’à naviguer dans le code en surveillant le compteurs situé en bas à droite de la fenetre jusqu’à atteindre l’erreur recherchée.
(Cliquez pour agrandir)
6. Validez et sauvegardez votre fichier, puis cliquez sur le bouton Generate Callbacks. L’utilitaire vous affichera alors  la liste des procédures VBA que vous devrez intégrer à vos macros Excel. Copier l’ensemble des lignes et collez-les dans un fichier texte / bloc note pour le moment.
'Callback for btnOuvrir onAction
Sub OuvrirFichier(control As IRibbonControl)
End Sub
'Callback for btnEnregistrer onAction
Sub EnregistrerFichier(control As IRibbonControl)
End Sub
'Callback for btnAjouterFeuille onAction
Sub AjouterFeuille(control As IRibbonControl)
End Sub
'Callback for btnSupprimerFeuille onAction
Sub SupprimerFeuille(control As IRibbonControl)
End Sub

7. Fermez CustomUI Editor et ouvrez votre fichier sous MS Excel. Si vous appuyez sur les boutons de votre ruban « Smart-XL », l’application vous affichera des messages d’erreur dus au fait qu’elle ne trouve pas les procédures de Callbacks spécifiées dans le code XML. Vous devez alors lancer l’éditeur de code VBA et créer un module dédié dans lequel vous collerez vos lignes de Callbacks. Vous pourrez alors coder le contenu de vos procédures selon vos besoins.
Pour commencer vous pouvez copier les exemples ci-dessous dans un module VBA :

'Callback for btnOuvrir onAction
Sub OuvrirFichier(control As IRibbonControl)
    Dim Fichier
    Fichier = Application.GetOpenFilename("Fichiers Excel (*.xlsx), *.xlsx")
    If Fichier Then Workbooks.Open Fichier
End Sub
'Callback for btnEnregistrer onAction
Sub EnregistrerFichier(control As IRibbonControl)
    ThisWorkbook.Save
End Sub
'Callback for btnAjouterFeuille onAction
Sub AjouterFeuille(control As IRibbonControl)
    ThisWorkbook.Sheets.Add
End Sub
'Callback for btnSupprimerFeuille onAction
Sub SupprimerFeuille(control As IRibbonControl)
    ' Supprime la feuille en cours d'affichage
    ActiveSheet.Delete
End Sub
8. Sauvegardez votre fichier Excel et vous pouvez dès à présent commencer à utiliser vos boutons.
(Cliquez pour agrandir)
N’hésitez pas ajouter autant de groupes que nécessaire et à adapter les boutons à vos besoins, en attendant le prochain tutoriel pour une personnalisation plus approfondie du ruban…

Téléchargez le fichier

 




lundi 4 juin 2012

Réalisez une barre d'avancement pour vos programmes


Si vos programmes nécessitent de longues boucles de traitement qui font ramer l'application Excel, faites patienter vos utilisateurs en affichant une barre d'avancement. Celle-ci leur fournira aussi bien le taux d'avancement du programme que l'intitulé des opérations qui s'y déroulent.


Dans un nouveau classeur, rendez-vous à l'éditeur de code VBA et créez un nouveau UserForm.


Renommez le titre du UserForm1 en renseignement le champ Caption par "Veuillez patienter...".
Dans la fenêtre de propriétés (raccource F4), modifiez l'apparence du UserForm1 en lui attribuant des dimensions convenables pour une barre d'avancement (dans cet exemple : 388 x 91 pts) et en appliquant une image de fond si vous le souhaitez (voir tutoriel Enluminez vos formulaires avec un fond dégradé).


Insérez dans UserForm1 un contrôle ActiveX de type Label : il s'appellera par défaut Label1.
Configurez Label1 en lui attribuant les propriétés suivantes :
  • BackStyle : 0 - fmBackStyleTransparent
  • BorderStyle : 0 - fmBorderStyleNone
  • Caption : (vide)
  • SpecialEffect : 2 - fmSpecialEffectSunken
  • Height : 18 pt
  • Width : 360 pt

Insérez dans UserForm1 un second contrôle ActiveX de type Label : il s'appellera par défaut Label2.
Configurez Label2 en lui attribuant les propriétés suivantes :
  • BackStyle : 0 - fmBackStyleTransparent
  • BorderStyle : 0 - fmBorderStyleNone
  • Caption : 100%
  • Picture : appliquez par exemple l'image suivante image au format BMP, que vous aurez pris soin de créer sous PowerPoint, ou tout autre image dégradée aux couleurs de votre choix.
  • PicturePosition 12 - PicturePositionCenter
  • SpecialEffect : 0 - fmSpecialEffectFlat
  • TextAlign : 2 - fmTextAlignCenter
  • Height : 16 pt (soit 2 pt de moins que Label1)
  • Width : 358 pt (soit 2 pt de moins que Label1)
Sélectionnez Label1 et Label2 et procédez à leur alignement en utilisant la fonction "Aligner" du menu "Format" de l'éditeur de code : sélectionner "Centre" puis "Milieu". Ainsi, Label 1 étant légèrement plus grand que Label2, on obtient ainsi un effet d'inclusion de Label 2 dans Label1.



Insérez dans UserForm1 un troisième contrôle ActiveX de type Label : il s'appellera par défaut Label3.
Placez-le sous les deux précédents labels : il servira à indiquer à l'utilisateur les opérations en cours.
Configurez Label3 en lui attribuant les propriétés suivantes :
  • BackStyle : 0 - fmBackStyleTransparent
  • BorderStyle : 0 - fmBorderStyleNone
  • Caption : Mettez ici vos indications sur l'état d'avancement du programme...
  • Picture : (vide)
  • SpecialEffect : 0 - fmSpecialEffectFlat
  • TextAlign : 2 - fmTextAlignCenter
Passons au codage de la barre d'avancement. Dans votre projet VBA, créez un nouveau module : il s'appellera par défaut Module1. Copiez-collez dans la zone de code de Module1 les lignes suivantes :

Sub MonProgramme()
   
    '============================================
    'Initialisation de la barre d'avancement à 0%
    '============================================
    UserForm1.Label2.Width = 0
    UserForm1.Label2 = "0%"
    UserForm1.Label3.Caption = "Lancement du programme"
   
    '============================================
    'Afficher la fenêtre d'avancement
    '============================================
    UserForm1.Show (0)
   
    '============================================
    'Déroulement graduel du programme
    '============================================
   
    '...Remplacer la ligne suivante par votre code...'
    MsgBox "Avancement : 0%"

   
    'Avancement à 25% : la largeur totale de la barre d'avancement sera plus petit que la zone de fond de 2 pts
    UserForm1.Label2.Width = 0.25 * (UserForm1.Label1.Width - 2)
    UserForm1.Label2.Caption = "25%"
    UserForm1.Label3.Caption = "Réalisation de l'opération n° 1"
   
    '...Remplacer la ligne suivante par votre code...'
    MsgBox "Avancement : 25%"

   
    'Avancement à 50% : la largeur totale de la barre d'avancement sera plus petit que la zone de fond de 2 pts
    UserForm1.Label2.Width = 0.5 * (UserForm1.Label1.Width - 2)
    UserForm1.Label2.Caption = "50%"
    UserForm1.Label3.Caption = "Réalisation de l'opération n° 2"
   
    '...Remplacer la ligne suivante par votre code...'
    MsgBox "Avancement : 50%"

   
    'Avancement à 75% : la largeur totale de la barre d'avancement sera plus petit que la zone de fond de 2 pts
    UserForm1.Label2.Width = 0.75 * (UserForm1.Label1.Width - 2)
    UserForm1.Label2 = "75%"
    UserForm1.Label3.Caption = "Réalisation de l'opération n° 3"
   
    '...Remplacer la ligne suivante par votre code...'
    MsgBox "Avancement : 75%"

   
    '============================================
    'Complétion de la barre d'avancement à 100%
    '============================================
    UserForm1.Label2.Width = UserForm1.Label1.Width - 2
    UserForm1.Label2 = "100%"
    UserForm1.Label3.Caption = "Fin du programme"
   
    '============================================
    'Fermer la fenêtre d'avancement
    '============================================
    '...Supprimer la ligne suivante...'
    MsgBox "Avancement : 100%"

    UserForm1.Hide
   
End Sub

Enfin, lançons le teste de cette barre d'avancement : placez le curseur de votre souris n'importe où sur les lignes de la procédure MonProgramme() puis appuyez sur la touche F5 pour lancer son exécution.
Vous allez pouvoir observer la progression graduelle de votre barre d'avancement, en répondant à chaque MessageBox qui s'affichera. Pour mieux observer l'avancement, n'hésitez pas à déplacer la MessageBox avant de valider en cliquant "OK".


Voilà une barre d'avancement que vous pourrez configurer et utiliser pour tous vos programmes qui nécessitent un certain temps d'attente (boucles de recherche ligne à ligne, sauvegarde ou copie de fichier, ...). Pour configurer cette barre selon vos propres besoins, n'hésitez pas à me contacter si vous rencontrez des difficultés.

Téléchargez le fichier

Enluminez vos formulaires avec un fond dégradé


Vous avez pu constater l'effet lumineux d'un remplissage dégradé de cellules dans le tutoriel Oubliez les remplissages en aplats : privilégiez les dégradés.

Voici à présent un rapide tutoriel qui vous démontrera que l'usage des dégradés dans vos UserForms peut aussi redonner vie à vos formulaires.
Pour commencer, nous allons réaliser une image de fond pour le formulaire. Créez sous PowerPoint un rectangle sans bordure et à remplissage dégradé de la couleur de votre choix. Enregistrez-le comme image au format BMP comme l'indique l'illustration ci-dessous.


Dans un nouveau classeur, rendez-vous à l'éditeur de code VBA et créez deux UserForms :
  • UserForm1 : laissez le fond gris par défaut, on ne modifiera rien.
  • UserForm2 : appliquez une image de fond que vous aurez pris de soin de réaliser sous PowerPoint. Dans la fenêtre de propriétés du UserForm (raccourci F4), veillez à bien renseigner le paramètre PictureSizeMode en lui attribuant la valeur 1 - fmPictureSizeModeStretch.

Dans la fenêtre d'exécution (raccourci Ctrl+G), lancez l'affichage des deux formulaires en tapant successivement les requêtes suivantes suivies d'un appui sur la touche "Enter" :
UserForm1.Show (0) 
puis remplacez cette ligne par
UserForm2.Show (0) 

En retournant dans le classeur et en déplaçant les fenêtres de formulaire de sorte à ce qu'elles ne se chevauchent pas,  vous allez alors pouvoir constater par vous-mêmes la nette amélioration de rendu qu'apporte le fond dégradé du UserForm2.


Cette solution est certes quelque peu couteuse en termes de taille de fichier, mais n'est pas rédhibitoire pour le fonctionnement fluide de vos formulaires.

jeudi 31 mai 2012

Dessiner des diagrammes à partir d'une barre d'outils personnalisée

Voici un tutoriel qui  vous permettra de réaliser un outil de dessin de diagrammes à partir d'une barre d'outils personnalisée.Il s'agit d'un développement simple et rapide, facilement adaptable à vos besoins. et qui est du plus bel effet !

Plaçons le décor... 

La zone de travail
Commencez par désactiver la grille Excel dans les options d'affichage.
Délimitez la zone de dessin au centre de l'écran en sélectionnant les cellules correspondantes et en traçant les bordures dans les propriétés de format de cellules.
Maintenez les cellules sélectionnées, et nommez cette zone "Zone". Le nommage se fait en modifiant l'intitulé situé à gauche de la barre de formule. Vous constaterez qu'à chaque fois que vous sélectionnerez "Zone" dans cette liste déroulante, la zone en question sera sélectionnée automatiquement.
Vous pouvez placer un titre au-dessus de la zone de travail soit en fusionnant les cellules soit en insérant un contrôle ActiveX de type Label personnalisé.

La liste des composants
Sous MS Office 2003, affichez la barre d'outils "Visual Basic". Sous MS Office 2007/2010, affichez l'onglet "Développeur". Passez Excel en mode Edition et insérez à partir de la boîte à outils :
  • un contrôle ActiveX de type ListBox à droite de la zone de travail que vous venez de délimiter. Cette première ListBox s'appelle par défaut ListBox1.
  • deux contrôlesActiveX de type CommandButton sous la ListBox. Ces deux boutons s'appelleront par défaut CommandButton1 et CommandButton2.
Pour que la ListBox aie la même bordure fine que la zone de travail, vous pouvez :
  • soit modifier sa propriété SpecialEffect en lui attribuant la valeur 3 - fmSpecialEffectEtched. La bordure sera alors grise par défaut.
  • soit modifier sa propriété SpecialEffect en lui attribuant la valeur 0 - fmSpecialEffectFlat, et modifier sa propriété BorderStyle en lui attribuant la valeur 1 - fmBorderStyleSingle en veillant à choisir la couleur qui vous convient dans l'attribut BorderColor.
Modifiez l'intitulé des boutons: 
  • CommandButton1 devient "Afficher" : ce bouton servira à afficher un composant de la liste sur le diagramme. Dans cet exemple, chaque composant ne peut être instancié / affiché qu'une seule fois.
  • CommandButton2devient "Supprimer" : ce bouton servira à supprimer un composant de la liste et du diagramme.
La barre d'outils
Délimitez la zone où vous souhaitez placer votre barre d'outils en sélectionnant les cellules correspondantes et en traçant les bordures dans les propriétés de format de cellules. Si vous le souhaitez, vous pouvez colorer cette zone en lui affectant un fond uniforme ou en dégradé comme sur l'exemple ci-dessous.

Placez dans cette zone trois contrôles ActiveX de type Label de tailles identiques : ils s'appelleront par défaut Label1, Label2 et Label3.
Modifiez le paramètre Picture de ces trois labels en y appliquant des images de votre choix au format BMP.

  

Passez à l'onglet "Feuil2" et insérer les mêmes images que vous venez d'utiliser. Réglez leur taille aux dimensions auxquelles vous souhaitez les faire apparaître sur le diagramme.
Sélectionnez chaque image séparément et modifier son nom dans la zone de nommage située à gauche de la barre de formule, comme nous l'avions fait pour la zone de dessin en "Feuil1". Désormais, vous pourrez manipuler vos images en les invoquant par les noms que vous leur aurez donné.

Le formulaire de saisie
A partir de la barre d'outils "VisualBasic" (MS 2003) ou de l'onglet "Développeur" (MS 2007/2010), lancez l'éditeur de code VBA. Insérez dans le projet en cours une nouvelle feuille de type UserForm : votre nouveau formulaire s'appellera par défaut UserForm1.

Placez les éléments de votre formulaire :
  • Affichez la fenetre de propriétés.
  • Sélectionnez le formulaire et modifiez son titre en saisissant le titre souhaité (dans cet exemple "Composant")  dans la propriété Caption.
  • Créez un Label  qui servira à indiquer à l'utilisateur l'action à réaliser (dans cet exemple on lui demande de renseigner le nom du composant de diagramme).
  • Créez une TextBox qui servira à saisir du texte (dans cet exemple il s'agit du nom du composant)
  • Créer deux CommandButton qui serviront à valider ou annuler la saisie. Par défault ils s'appelleront CommandButton1 et CommandButton2. Modifiez l'intitulé des boutons en renseignant leur propriété Caption : CommandButton1 prendra la valeur "OK" et CommandeButton2 prendra la valeur "Annuler".

Les détails
Revenons à l'onglet "Feuil1". Vous pouvez placer de la décoration et des titres au-dessus de chacun des éléments que vous avez créé, soit directement dans des cellules fusionnées, soit en insérant un contrôle ActiveX de type Label personnalisé.

 ... puis passons au codage

Pour atteindre le code d'un contrôle ActiveX, sachez qu'il vous suffit de double cliquer sur celui-ci lorsque vous êtes en mode édition. Allons-y !

La barre d'outils
Les éléments de la barre d'outils seront considérés comme des boutons cliquables, bien qu'il s'agissent de contrôles Label. Voir le tutorial Customisez vos boutons.
  • Label1 servira à créer un composant représentant un logo blanc.
  • Label2 servira à créer un composant représentant un logo vert.
  • Label3 servira à créer un connecteur dynamique (parmi les formes automatiques de MS Office) pour relier les composants entre eux.
Pour chacun des trois éléments de la barre d'outils, nous allons donc coder trois procédures :
  • Celle qui se déroule lorsqu'on appuie sur le label avec le bouton gauche de la souris : Mouse_Down().
  • Celle qui se déroule lorsqu'on relève le bouton gauche de la souris au-dessus du label : Mouse_Up().
  • Celle qui se déroule lorsqu'on a fini de cliquer sur le label : Click().
Dans l'éditeur de code VBA, copiez et collez  les procédures ci-dessous dans la zone de codage de l'onglet "Feuil1". Vous constaterez que ce code fait appel au formulaire UserForm1 que nous allons coder par la suite.

Private Sub Label1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Label1.SpecialEffect = fmSpecialEffectSunken
End Sub

Private Sub Label1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Label1.SpecialEffect = fmSpecialEffectEtched
End Sub

Private Sub Label1_Click()

    ' Placer le composant dans la zone de diagramme nommée "Zone"
    Sheets("Feuil2").Shapes("LogoBlanc").Copy
    ActiveSheet.Range("Zone").Select
    ActiveSheet.Paste
          
    ' Nommer le composant via formulaire
    UserForm1.Show

End Sub

Private Sub Label2_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Label2.SpecialEffect = fmSpecialEffectSunken
End Sub

Private Sub Label2_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Label2.SpecialEffect = fmSpecialEffectEtched
End Sub

Private Sub Label2_Click()

    ' Placer le composant dans la zone de diagramme nommée "Zone"
    Sheets("Feuil2").Shapes("LogoVert").Copy
    ActiveSheet.Range("Zone").Select
    ActiveSheet.Paste
   
    ' Nommer le composant via formulaire
    UserForm1.Show

End Sub

Private Sub Label3_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Label3.SpecialEffect = fmSpecialEffectSunken
End Sub

Private Sub Label3_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Label3.SpecialEffect = fmSpecialEffectEtched
End Sub

Private Sub Label3_Click()
    ActiveSheet.Shapes.AddConnector(msoConnectorCurve, 249#, 296.25, 63#, 84.75 _
        ).Select
    Selection.ShapeRange.Line.ForeColor.SchemeColor = 23
    Selection.ShapeRange.Line.Visible = msoTrue
    Selection.ShapeRange.Line.BeginArrowheadStyle = msoArrowheadOval
    Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadOval
    Selection.ShapeRange.Line.BeginArrowheadWidth = msoArrowheadWidthMedium
    Selection.ShapeRange.Line.BeginArrowheadLength = msoArrowheadLengthMedium
    Selection.ShapeRange.Line.EndArrowheadWidth = msoArrowheadWidthMedium
    Selection.ShapeRange.Line.EndArrowheadLength = msoArrowheadLengthMedium
    Selection.ShapeRange.Line.Visible = msoTrue
End Sub


Le formulaire de saisie
Affichez la fenêtre d'édition du formulaire, puis double cliquez sur le bouton "OK" (CommandButton1) pour accéder à son code. Copiez et collez le code suivant en lieu et place des deux lignes qui sont créées automatiquement : "Sub CommandButton1()" et "End Sub".

Private Sub CommandButton1_Click()
   
    ' Nommer le composant sélectionné sur le diagramme (il vient d'être collé, il est donc toujours sélectionné)
    Selection.Name = TextBox1
   
    ' Ajouter le composant à la liste
    ActiveSheet.ListBox1.AddItem Selection.Name
   
    ' Fermer le formulaire
    Unload Me
   
End Sub

Revenez à la fenêtre d'édition du formulaire, puis double cliquez sur le bouton "Annuler" (CommandButton2) pour accéder à son code. Copiez et collez le code suivant en lieu et place des deux lignes qui sont créées automatiquement : "Sub CommandButton2()" et "End Sub".

Private Sub CommandButton2_Click()
    ' Annuler la création de composant : supprime le logo du diagramme et ferme le formulaire
    Selection.Delete
    Unload Me
End Sub

Restez dans la fenêtre de code du formulaire et ajoutez ces quelques lignes qui permettront d'interdire la fermeture du formulaire par clic sur la croix en haut à droite. Le but de cette manoeuvre est de forcer l'utilisateur à annuler son action en cliquant sur le bouton "Annuler" ci-dessus.

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    ' Empêcher l'utilisateur de fermer le formulaire par la croix
    If CloseMode = 0 Then Cancel = True
End Sub

La liste des composants
Revenez à l'onglet "Feuil1" de votre classeur.
Nous ne coderons rien concernant la liste des composants ListBox1 car celle-ci est pilotée par le formulaire comme vous avez pu le constater dans les lignes de coques ci-dessus.
En revanche, nous allons coder les procédures des boutons "Ajouter" (CommandButton1) et "Supprimer" (CommandButton2).

 En restant en mode Edition, double cliquez-sur le bouton "Ajouter" (CommandButton1). Copiez et collez le code suivant en lieu et place des deux lignes qui sont créées automatiquement : "Sub CommandButton2()" et "End Sub".

Private Sub CommandButton1_Click()
    Dim s As Shape
   
    For Each s In Sheets("Feuil1").Shapes
        ' Vérification de la présence du composant parmi tous les éléments du diagramme
        If s.Type = msoPicture And s.Name = ActiveSheet.ListBox1.Value Then
            s.Select
            ' Le composant est déjà sur le diagramme, on le sélectionne et on quitte la procédure
            Exit Sub
        End If
    Next
   
    ' Le composant n'est pas sur le diagramme : afficher le composant
        ' Placer le composant dans la zone de diagramme nommée "Zone"
        Sheets("Feuil2").Shapes("LogoBlanc").Copy
        ActiveSheet.Range("Zone").Select
        ActiveSheet.Paste
        ' Nommer le composant
        Selection.Name = ActiveSheet.ListBox1.Value
       
End Sub

Restez dans la fenêtre de code VBA, et copiez-collez directement le code suivant après la procédure que vous venez d'insérer. Il s'agit de la procédure du bouton "Supprimer" (CommandButton2).

Private Sub CommandButton2_Click()
    Dim s As Shape
   
    For Each s In Sheets("Feuil1").Shapes
        ' Vérification de la présence du composant parmi tous les éléments du diagramme
        If s.Type = msoPicture And s.Name = ActiveSheet.ListBox1.Value Then
            s.Select
            ' Supprimer le composant du diagramme
            s.Delete
            Exit For
        End If
    Next
    ' Supprimer le nom de la liste
    ActiveSheet.ListBox1.RemoveItem (ActiveSheet.ListBox1.ListIndex)
   
End Sub

Finalisez votre travail
Terminez en désactivant l'affichage des en-têtes de lignes et de colonnes de l'onglet "Feuil1", ainsi que les onglets du classeur, afin d'épurer votre interface et d'éviter que l'on puisse modifier votre mise en page ou vos images.

A vous à présent d'adapter ce tutorial à vos besoins : modifiez l'apparence de la barre d'outils, créez de nouveaux composants, ajoutez des paramètres supplémentaires aux composants, créez une base de données associée à la liste de composants... 

Téléchargez le fichier