TUTO EXCELLONS : Manipuler les formes par VBA
L’un des aspects le plus remarquable d’EXCEL réside dans sa capacité à dessiner une multitude de formes graphiques plus ou moins complexes, de pouvoir gérer leurs tailles, leurs couleurs, leurs positionnements, leurs comportements…
Ce tutoriel présente de façon concise ce qu’il est nécessaire de connaître pour manipuler les formes par programmation VBA. Seules les méthodes et propriétés de l’objet Shapes les plus utiles sont décrites.
Pour une référence exhaustive de l’objet Shapes, voir : https://learn.microsoft.com/fr-fr/office/vba/api/excel.shapes
(Les copies-écrans de ce tuto ont été réalisées à partir d’un classeur créé avec la version 365 d’EXCEL. Ce classeur est téléchargeable ici )
SOMMAIRE
QU’EST-CE QU’UNE FORME (SHAPE) POUR EXCEL ?
LISTONS TOUTES LES FORMES CONTENUES DANS UNE FEUILLE
UTILISONS L’ENREGISTREUR DE MACROS
INSERONS UN GRAPHE DANS UNE FEUILLE
INSERONS UNE LEGENDE DANS UNE FEUILLE
INSERONS UNE COURBE DE BEZIER DANS UNE FEUILLE
INSERONS UN CONTROLE DE FORMULAIRE DANS UNE FEUILLE
INSERONS UN LIEN VERS UN OBJET EXTERNE DANS UNE FEUILLE
INSERONS UNE IMAGE DANS UNE FEUILLE
INSERONS UNE FORME ‘AUTOMATIQUE’ DANS UNE FEUILLE
INSERONS UN GRAPHIQUE SMARTART DANS UNE FEUILLE
REPOSITIONNONS UNE FORME DANS LA FEUILLE
REDIMENSIONNONS UNE FORME OU UN ENSEMBLE DE FORMES
AJOUTONS DU TEXTE A UNE FORME ET FORMATONS-LE
MODIFIONS LES COULEURS ET LE REMPLISSAGE D’UNE FORME
Une forme (shape) peut être un objet « simple » comme une forme ‘automatique’ (une ligne, un carré…), une icône, une image ou bien un objet « complexe » comme un graphique, un objet SmartArt, un modèle 3D…
LISTONS TOUTES LES FORMES CONTENUES DANS UNE FEUILLE
La collection ‘Shapes’ d’une feuille de calcul regroupe la collection de toutes les formes (shapes) présentes dans une feuille.
Le fragment de code ci-dessous énumère dans la fenêtre d’exécution les noms de toutes les formes présentes dans la feuille ‘ShapesSamples’ » donnée en exemple :
Sub ListerShapes()
Dim oSheet As Worksheet, oSheetEnumeration As Worksheet
Dim oShape As Shape
Dim oLO As ListObject
Dim oRange As Range, oCell As Range
Dim sShapetype As String
Dim v As Variant
Set oSheet = ThisWorkbook.Worksheets("ShapesSamples")
Set oSheetEnumeration = ThisWorkbook.Worksheets("ShapesTypesList")
'On affecte l'objet Tableau structuré contenant les libellés des types de formes
Set oLO = oSheetEnumeration.ListObjects("tblShapesTypes")
Set oRange = oLO.ListColumns("Index").DataBodyRange
'On parcourt toutes les formes de la feuille
For Each oShape In oSheet.Shapes
'On recherche le libellé du type de forme dans la table à partir de son index
v = Application.Match(oShape.Type, oRange, 0)
If Not IsError(v) Then
sShapetype = oLO.ListColumns("Description").DataBodyRange.Cells(v, 1).Value
Else
sShapetype = "???"
End If
'On envoie les informations de la forme dans la fenêtre d'exécution
Debug.Print "Index:" & oShape.ID & "-" & sShapetype & "-" & oShape.Name
Next
'On fait le ménage
Set oSheet = Nothing
Set oLO = Nothing
Set oSheetEnumeration = Nothing
End Sub
Rappel : pour afficher la fenêtre d’exécution dans le VBE, actionner Ctrl+G – Voir l’article BONNES PRATIQUES EXCELLONS : ‘Utilisons les outils de débogage‘
UTILISONS L’ENREGISTREUR DE MACROS
Du fait de la richesse et de la diversité des méthodes et propriétés exposées par les formes (shapes), nous gagnons beaucoup de temps en utilisant, dans un premier temps, l’enregistreur de macros.
Dans un second temps, nous corrigerons le code généré pour l’adapter et/ou le simplifier.
Pour une bonne utilisation de l’enregistreur de macros, reportons-nous à l’article BONNES PRATIQUES EXCELLONS : Comment bien utiliser l’enregistreur de macros.
REFERENÇONS LES FORMES DANS LE CODE VBA
Référençons par index
Nous pouvons référencer une forme par son index dans la collection des « Shapes » de la feuille. Par exemple, pour nous référer à la forme d’index 3 dans la feuille :
Set oShape = oSheet.Shapes(3) |
Cette méthode de référencement n’est ni très pratique ni très explicite, aussi privilégions le référencement pas nom.
Référençons par nom
Lorsque nous créons une forme dans une feuille (manuellement ou par code), EXCEL lui affecte un nom par défaut. Ce nom reprend le type de forme et y ajoute une numérotation chronologique. Par exemple :
« Image 7 » |
Nous référençons cette forme par nom de la façon suivante :
Set oShape = oSheet.Shapes(“Image 7”) |
Aux noms affectés par défaut par EXCEL, il est préférable que nos formes portent des noms explicites.
Affectons un nom explicite
Nous affectons un nom explicite par VBA à nos formes en modifiant la propriété « Name » de la forme.
Par exemple :
Set oShape = oSheet.Shapes(“Image 7”) oShape.Name = “Excellons_Logo”
|
ATTENTION : Excel ne vérifie pas l’unicité des noms affectés. Si nous donnons le même nom à 2 formes différentes, lorsque, dans le VBA, nous affecterons un object Shape avec un nom dupliqué, l’affectation ne se réalisera que sur l’une des 2 formes.
nous utilisons la méthode AddChart2 de l’objet Shapes : expression.AddChart2 (Style, XlChartType, Left, Top, Width, Height, NewLayout)
La liste des types de graphe (XlChartType) est disponible à la page : https://learn.microsoft.com/fr-fr/office/vba/api/excel.xlcharttype
(La méthode AddChart2 a été introduite avec la version 2013 d’EXCEL. Dans les versions précédentes c’est la méthode AddChart qui doit être utilisée).
Cet article est focalisé sur l’objet Formes (Shape), il ne traite pas en détail des méthodes et propriétés de l’objet ‘Chart’.
Le fragment de code suivant créée un graphe de type secteur à partir de données présentes dans la plage P3:P12 de la feuille ‘Resultats’ du classeur exemple :
Sub AddGraph()
Dim oSheet As Worksheet
Dim oShape As Shape
Dim oChart As Chart
Set oSheet = ThisWorkbook.Worksheets("Resultats")
'On insère le graphe dans la feuille avec la méthode AddChart2
Set oShape = oSheet.Shapes.AddChart2(333, xl3DPie, , , , True)
With oShape
'On référence l'objet Chart
Set oChart = oShape.Chart
With oChart
'On affecte la source de données du graphe
.SetSourceData oSheet.Range("P3:P12")
'On donne un titre au graphe
.ChartTitle.Text = "MON GRAPHE"
End With
End With
End Sub
Résultat obtenu :
nous utilisons la méthode AddCallout de l’objet Shapes : expression. AddCallout (Type, Left, Top, Width, Height)
La liste des types de légende (msoCalloutType) est disponible à la page : https://learn.microsoft.com/fr-fr/office/vba/api/office.msocallouttype
Le fragment de code suivant créée une légende de type lien unique à droite dans la feuille ‘Resultats’ du classeur exemple :
Sub AddLegend()
Dim oSheet As Worksheet
Dim oShape As Shape
Set oSheet = ThisWorkbook.Worksheets("Resultats")
Set oShape = oSheet.Shapes.AddCallout(msoCalloutOne, 50, 50, 80, 100)
End Sub
Résultat obtenu :
nous utilisons la méthode AddCurve de l’objet Shapes : expression. AddCurve (SafeArrayOfPoints).
La liste des points de la courbe est fournie à la méthode ‘AddCurve’ dans un tableau de valeurs.
Le fragment de code suivant créée une courbe de Bézier en Z avec des coordonnées de début (210,130) et de fin (315,225) :
Sub AddCourbeBezier()
Dim oSheet As Worksheet
Dim oShape As Shape
Dim aPoints(1 To 7, 1 To 2) As Single
'On rempli le tableau de coordonnées des points de la courbe de Bézier
aPoints(1, 1) = 210
aPoints(1, 2) = 130
aPoints(2, 1) = 270
aPoints(2, 2) = 150
aPoints(3, 1) = 280
aPoints(3, 2) = 160
aPoints(4, 1) = 280
aPoints(4, 2) = 175
aPoints(5, 1) = 200
aPoints(5, 2) = 190
aPoints(6, 1) = 210
aPoints(6, 2) = 205
aPoints(7, 1) = 315
aPoints(7, 2) = 225
Set oSheet = ThisWorkbook.Worksheets("Resultats")
Set oShape = oSheet.Shapes.AddCurve(aPoints())
End Sub
Résultat obtenu :
nous utilisons la méthode AddFormControl de l’objet Shapes : expression. AddFormControl (Type, Left, Top, Width, Height)
La liste des types de contrôles de formulaires (XlFormControl) est disponible à la page : https://learn.microsoft.com/fr-fr/office/vba/api/excel.xlformcontrol
Le fragment de code suivant insère un contrôle de liste déroulante dans la feuille ‘Resultats’ du classeur exemple :
Sub AddCombobox()
Dim oSheet As Worksheet
Dim oShape As Shape
Set oSheet = ThisWorkbook.Worksheets("Resultats")
Set oShape = oSheet.Shapes.AddFormControl(xlDropDown, 5, 5, 55, 15)
End Sub
Résultat obtenu :
nous utilisons la méthode AddOLEObject de l’objet Shapes : expression. AddOLEObject (ClassType, FileName, Link, DisplayAsIcon, IconFileName, IconIndex, IconLabel, Left, Top, Width, Height).
Les objets que l’on peut incorporer par cette méthode peuvent être des fichiers externes ou des classes particulières d’objets. Pour plus de détail, nous nous reporterons utilement à la page : https://learn.microsoft.com/fr-fr/office/vba/api/excel.shapes.addoleobject.
Le fragment de code suivant créée un lien vers un document PDF particulier dans la feuille “Resultats”:
Sub AddPDF()
Dim oSheet As Worksheet
Dim oShape As Shape
Dim oRange As Range
Set oSheet = ThisWorkbook.Worksheets("Resultats")
Set oShape = oSheet.Shapes.AddOLEObject(, ThisWorkbook.Path & "\MonPDF.pdf", False, True, "C:\WINDOWS\Installer\{AC76BA86-1036-1033-7760-BC15014EA700}\_PDFFile.ico", 0, "Mon PDF", 5, 5, 50, 50)
End Sub
Résultat obtenu :
nous utilisons la méthode AddPicture2 de l’objet Shapes : expression. AddPicture2 (FileName, LinkToFile, SaveWithDocument, Left, Top, Width, Height, compress).
Le fragment de code suivant insère une image dans la feuille ‘Resultats’ du classeur exemple :
Sub AddImage()
Dim oSheet As Worksheet
Dim oShape As Shape
Dim oRange As Range
Set oSheet = ThisWorkbook.Worksheets("Resultats")
Set oShape = oSheet.Shapes.AddPicture2(ThisWorkbook.Path & "\Logo_Excellons.png", msoFalse, msoTrue, 5, 5 _
, Application.CentimetersToPoints(9), Application.CentimetersToPoints(4), True)
End Sub
Résultat obtenu :
nous utilisons la méthode AddShape de l’objet Shapes : expression. AddShape (Type, Left, Top, Width, Height).
La liste des types de formes ‘automatiques’ (msoAutoShapeType) est disponible à la page : https://learn.microsoft.com/fr-fr/office/vba/api/office.msoautoshapetype
Le fragment de code suivant insère une forme de type « Bouton en relief » dans la feuille “Resultats”:
Sub AddFormAuto()
Dim oSheet As Worksheet
Dim oShape As Shape
Dim oRange As Range
Set oSheet = ThisWorkbook.Worksheets("Resultats")
Set oShape = oSheet.Shapes.AddShape(msoShapeBevel, 5, 5, 50, 50)
End Sub
Résultat obtenu :
nous utilisons la méthode AddSmartArt de l’objet Shapes : expression. AddSmartArt (Layout, Left, Top, Width, Height).
L’application EXCELLONS SMARTART_Reference.xlsm fournit une référence complète aux graphiques SmartArt.
Le fragment de code suivant insère un graphique SmartArt de type ‘entonnoir’ dans la feuille ‘Resultats’ du classeur exemple :
Sub AddCone()
Dim oSheet As Worksheet
Dim oShape As Shape
Dim oSaLayout As SmartArtLayout
Set oSheet = ThisWorkbook.Worksheets("Resultats")
'On pointe sur l'illustration 'Entonnoir'
Set oSaLayout = Application.SmartArtLayouts(68)
'On créé une nouvelle forme contenant l'illustration voulue
Set oShape = oSheet.Shapes.AddSmartArt(oSaLayout, 5, 5)
'On affecte une couleur à la forme
oShape.SmartArt.Color = Excel.Application.SmartArtColors(4)
End Sub
Résultat obtenu :
REPOSITIONNONS UNE FORME DANS LA FEUILLE
Positionnons la forme lors de sa création
A la création d’une forme au moyen de l’une des méthodes de l’objet Shapes, nous indiquons la position de son coin supérieur gauche exprimée en points.
(Si besoin, pour convertir les centimètres en points, nous disposons de la fonction Application.CentimetersToPoints ).
Ainsi, par exemple, pour positionner la forme à 1 centimètre à gauche et 1 centimètre en haut de la feuille au moment de sa création, nous écrirons :
Set oShape = oSheet.AddShape(msoShapeBevel, Application.CentimetersToPoints(1), Application.CentimetersToPoints(1), …)
Repositionnons une forme
Pour repositionner une forme, nous modifions ses propriétés « Left » et « Top » en indiquant leurs nouvelles valeurs en points (ou en centimètres en utilisant la fonction ‘Application.CentimetersToPoints’).
Ainsi, par exemple, pour repositionner une forme à 50 points à gauche et 50 points en haut de la feuille nous écrirons :
oShape.Left = 50
oShape.Top = 50
Repositionnons une forme par rapport à une cellule
Pour repositionner une forme par rapport à une cellule, nous référencerons les propriétés « Left » et « Top » de la cellule.
Ainsi, par exemple, pour repositionner une forme sur le coin haut-Gauche de la cellule « D4 » nous écrirons :
Set oRange = oSheet.Range(“D4”)
oShape.Left = oRange.Left
oShape.Top = oRange.Top
Gérons la propriété « Placement »
La propriété « Placement » de l’objet « Shape » nous permet de gérer le comportement des formes lors du redimensionnement des cellules.
Elle peut prendre l’une des valeurs suivantes :
xlFreeFloating = la forme conserve son positionnement lorsque les cellules sous-jacentes sont redimensionnées.
xlMove = la forme se déplace avec les cellules sous-jacentes (sans être redimensionnée).
xlMoveAndSize = la forme se déplace et se redimensionne avec les cellules sous-jacentes.
L’application EXCELLONS SmartTrombinoscope.xlsm fournit un exemple de mise en oeuvre de positionnements complexes de formes dans une feuille.
REDIMENSIONNONS UNE FORME OU UN ENSEMBLE DE FORME
Dimensionnons la forme lors de sa création
A la création d’une forme au moyen de l’une des méthodes de l’objet Shapes, nous indiquons la largeur et la hauteur de la forme exprimées en points.
(Si besoin, pour convertir les centimètres en points, nous disposons de la fonction Application.CentimetersToPoints ).
Ainsi, par exemple, pour dimensionner un rectangle biseauté à 100 points de large et 100 points de haut, nous écrirons lors de sa création, :
Set oShape = oSheet.AddShape(msoShapeBevel, …, …,100,100)
Redimensionnons une forme
Pour redimensionner une forme, nous modifions ses propriétés « Width » et « Height » en indiquant leurs nouvelles valeurs en points (ou en centimètres en utilisant la fonction ‘Application.CentimetersToPoints’).
Ainsi, par exemple, pour redimensionner une forme à 200 de large et 200 points de haut, nous écrirons :
oShape.Width = 200
oShape.Height = 200
Redimensionnons une forme par rapport à une cellule ou une plage de cellules
Pour redimensionner une forme par rapport à la taille d’une cellule ou d’une plage de cellules, nous référencerons les propriétés « Width » et « Height » de la cellule ou de la plage de cellules.
Ainsi, par exemple, pour redimensionner une forme à la taille de la plage de cellules « D4:F6 » nous écrirons :
Set oRange = oSheet.Range(“D4:F6”)
oShape.Width = oRange.Width
oShape.Height = oRange.Height
Gérons la propriété ‘LockAspectRatio‘
La propriété « LockAspectRatio » de l’objet Shape permet de gérer le comportement des formes lors du redimensionnement.
Elle prend les valeurs suivantes :
- msoTrue = la forme se redimensionne en conservant ses proportions. Si, par exemple, la largeur de la forme est modifiée, sa hauteur se redimensionne proportionnellement.
- msoFalse = la forme ne conserve pas ses proportions. Si, par exemple, la largeur de la forme est modifiée, sa hauteur reste inchangée.
Redimensionnons un ensemble de formes avec les méthodes ‘ScaleWidth-ScaleHeight’
Avec les méthodes « ScaleWidth » et « ScaleHeight » nous diminuons ou augmentons proportionnellement la taille des formes en largeur (ScaleWidth) ou en hauteur (ScaleHeight).
Ce fragment de code, diminue la taille des formes d’une feuille de la moitié de leurs tailles initiales :
Sub ShrinkAllShapes()
Dim oSheet As Worksheet
Dim oShape As Shape
Set oSheet = ThisWorkbook.Worksheets("ShapesSamples")
'On parcourt toutes les formes présentes dans la feuille
For Each oShape In oSheet.Shapes
'On conserve les proportions de la forme
oShape.LockAspectRatio = msoTrue
'Dans le cas où la forme ne supporte pas la méthode ScaleWidth, on ignore l'erreur
On Error Resume Next
'On diminue la taille de la forme de moitié = 50%
oShape.ScaleWidth 0.5, msoTrue
'On rétablit la gestion des erreurs
On Error GoTo 0
Next
End Sub
ATTENTION : Certaines formes ne supportent pas la méthode ‘ScaleWidth’ , c’est la raison pour laquelle l’instruction ‘On Error Resume Next’ est utilisée dans ce fragment de code.
Pour la gestion des erreurs d’exécution, reportons-nous au document BONNES PARTIQUES EXCELLONS : VBA_GestionErreurs.pdf
L’application EXCELLONS SmartTrombinoscope.xlsm fournit un exemple de mise en oeuvre du dimensionnement complexes de formes dans une feuille.
Sub AddTextToLegend()
Dim oSheet As Worksheet
Dim oShape As Shape
Set oSheet = ThisWorkbook.Worksheets("Resultats")
Set oShape = oSheet.Shapes("MaLegende")
oShape.TextFrame.Characters.Text = "EXCELLONS.org : c'est le top !"
End Sub
Résultat obtenu :
L’objet Textframe expose la méthode Characters permettant de formater le texte d’une forme (police, taille, couleur…). Deplus, il possède un ensemble de propriétés que l’on peut valoriser par code VBA.
Par exemple, le fragment de code suivant formate le texte ajouté à la forme MaLegende présente dans la feuille ‘Resultats” du classeur exemple :
Sub FormatTextToLegend()
Dim oSheet As Worksheet
Dim oShape As Shape
Set oSheet = ThisWorkbook.Worksheets("Resultats")
Set oShape = oSheet.Shapes("MaLegende")
'Formatons les 13 premiers caractères du texte : corps 12, en gras et en vert
With oShape.TextFrame.Characters(1, 13).Font
.Color = RGB(0, 255, 0)
.Size = 12
.Bold = True
End With
'Formatons les 14 caractères à la partir de la position 17 du texte: corps 16, en gras, en rouge et soulignés
With oShape.TextFrame.Characters(17, 14).Font
.Color = RGB(255, 0, 0)
.Size = 16
.Bold = True
.Underline = xlUnderlineStyleSingle
End With
'Centrons le texte horizontalement et verticalement
oShape.TextFrame.HorizontalAlignment = xlHAlignCenter
oShape.TextFrame.VerticalAlignment = xlVAlignCenter
End Sub
Résultat obtenu :
MODIFIONS LES COULEURS ET LE REMPLISSAGE D’UNE FORME
Les formes (shapes) exposent un ensemble de propriétés permettant d’agir sur la couleur et le type des contours ainsi que sur la couleur et le remplissage de l’intérieur de la forme.
A titre d’exemple, le fragment de code suivant trace une pentagone, définit ses contours en tant que tirets, les colorise en rouge et remplit son intérieur de briquettes de couleur verte :
Sub TracePentagone()
Dim oSheet As Worksheet
Dim oShape As Shape
Dim oRange As Range
Dim aPoints(1 To 6, 1 To 2) As Single
'On affecte les coordonnées des sommets du pentagone
aPoints(1, 1) = 520
aPoints(1, 2) = 93
aPoints(2, 1) = 433
aPoints(2, 2) = 211
aPoints(3, 1) = 180
aPoints(3, 2) = 194
aPoints(4, 1) = 70
aPoints(4, 2) = 76
aPoints(5, 1) = 232
aPoints(5, 2) = 51
aPoints(6, 1) = 520 'le dernier sommet possède des coordonnées identiques au premier sommet
aPoints(6, 2) = 93 '-> pour fermer le polygone
Set oSheet = ThisWorkbook.Worksheets("Resultats")
'On insère le pentagone dans la feuille
Set oShape = oSheet.Shapes.AddPolyline(aPoints)
With oShape
'On colorise les bordures du pentagone en tirets rouges
With .Line
.DashStyle = msoLineDashDotDot
.ForeColor.RGB = RGB(255, 0, 0)
End With
'On remplit le pentagone de briques vertes
With .Fill
.Patterned msoPatternHorizontalBrick
.BackColor.RGB = RGB(0, 255, 0)
End With
End With
End Sub
Résultat obtenu :
(Bon d’accord, ce résultat n’est pas esthétiquement très réussi…)
Sub displayInfo()
MsgBox "Lien vers EXCELLONS.org: " & vbCrLf _
& "https://excellons.org/" _
, vbExclamation, "MESSAGE DE LA PLUS HAUTE IMPORTANCE !"
End Sub
Assignons l’exécution de cette macro lors d’un clic sur la forme ‘MaLegende’ de la façon suivante :
Sub assignMacro()
Dim oSheet As Worksheet
Dim oShape As Shape
Set oSheet = ThisWorkbook.Worksheets("Resultats")
Set oShape = oSheet.Shapes("MaLegende")
oShape.OnAction = "displayInfo"
End Sub
Résultat obtenu lors du clic sur la forme :
Pour obtenir ce résultat, procédons de la façon suivante :
- Créeons, colorisons et positionnons sur la feuille autant de formes ‘automatiques’ que nécessaire. Dans notre exemple, 4 formes de plusieurs sortes au moyen du code VBA suivant :
Sub Add4Shapes()
Dim oSheet As Worksheet
Dim oShape As Shape
'On référençe la feuille cible
Set oSheet = ThisWorkbook.Worksheets("Resultats")
'Insérons la forme 'Database'
InsertNewShape oSheet, msoShapeFlowchartMagneticDisk, "BaseSQL", "B2:B6", msoThemeColorAccent4, "Base SQL"
'On insère la forme 'Traitement'
InsertNewShape oSheet, msoShapeFlowchartProcess, "Traitement", "C9:D12", msoThemeColorAccent6, "Traitement"
'On insère la forme 'Etats'
InsertNewShape oSheet, msoShapeFlowchartMultidocument, "Etats", "B16:B19", msoThemeColorAccent5, "Etats 1,2,3..."
'On insère la forme 'Ecran'
InsertNewShape oSheet, msoShapeFlowchartDisplay, "Display", "E16:E19", msoThemeColorAccent5, "Ecran"
End Sub
Sub InsertNewShape(zSheet As Worksheet, zShapeType As MsoAutoShapeType, zShapeName As String, zShapeRange As String, zColor As Variant, zTexte As String)
Dim oShape As Shape
Dim oRange As Range
'On référence la plage de cellules transmise pour le positionnement
Set oRange = zSheet.Range(zShapeRange)
'On ajoute la forme voulue à partir des paramètres transmis et des propriétés de la plage de cellules transmise
Set oShape = zSheet.Shapes.AddShape(zShapeType, oRange.Left, oRange.Top, oRange.Width, oRange.Height)
With oShape
'On affecte à la forme le nom transmis
.Name = zShapeName
'On affecte à la forme la couleur transmise
.Fill.ForeColor.ObjectThemeColor = zColor
'On affecte et formate le texte contenu dans la forme
With .TextFrame
With .Characters
.Text = zTexte
.Font.Bold = True
.Font.Color = vbBlack
End With
'On positionne le texte dans la forme
.HorizontalAlignment = xlHAlignCenter
.VerticalAlignment = xlVAlignCenter
End With
End With
End Sub
- Maintenant, relions les formes avec des connecteurs. Les méthodes Beginconnect et Endconnect, propres aux objects Connectors permettent de relier 2 formes entre-elles. Dans notre exemple, les 4 formes sont reliées au moyen du code VBA suivant :
Sub AddConnectors()
Dim oSheet As Worksheet
Dim oShape1 As Shape, oShape2 As Shape
Dim oRange As Range
'On référençe la feuille cible
Set oSheet = ThisWorkbook.Worksheets("Resultats")
'On connecte la forme 'Database' à la forme "Traitement"
Set oShape1 = oSheet.Shapes("BaseSQL")
Set oShape2 = oSheet.Shapes("Traitement")
InsertConnector oSheet, oShape1, oShape2, 5, 1
'On connecte la forme 'Traitement' à la forme "Etats"
Set oShape1 = oSheet.Shapes("Traitement")
Set oShape2 = oSheet.Shapes("Etats")
InsertConnector oSheet, oShape1, oShape2, 3, 1
'On connecte la forme 'Traitement' à la forme "Display"
Set oShape1 = oSheet.Shapes("Traitement")
Set oShape2 = oSheet.Shapes("Display")
InsertConnector oSheet, oShape1, oShape2, 3, 1
End Sub
Sub InsertConnector(zSheet As Worksheet, zShape1 As Shape, zShape2 As Shape, zPoint1 As Long, zPoint2 As Long)
Dim oConnector As Shape
Dim oRange As Range
'On insère le connecteur en utilisant les paramètres transmis
Set oConnector = zSheet.Shapes.AddConnector(msoConnectorElbow, 120, 50, 200, 100)
With oConnector
'On formate le connecteur
.Line.Weight = 1.75
.Line.ForeColor.ObjectThemeColor = msoThemeColorDark2
.Line.EndArrowheadStyle = msoArrowheadTriangle
'On relie les 2 formes passées en paramètres avec le connecteur suivant les 2 points passés en paramètres
.ConnectorFormat.BeginConnect zShape1, zPoint1
.ConnectorFormat.EndConnect zShape2, zPoint2
End With
End Sub
Les méthodes BeginConnect et EndConnect réclament comme second paramètre obligatoire SiteConnection indiquant le point d’ancrage du connecteur sur la forme à relier.
Ce point d’ancrage est à choisir parmi les points d’ancrage existants pour la forme à relier. ‘SiteConnection’ est un entier dont la valeur se situe entre ‘1’ et le nombre maximum de points d’ancrage de la forme. Chaque type de forme possède sa propre collection de points d’ancrage. Le nombre maximum de points d’ancrage d’une forme est retourné par la propriété ConnectionSiteCount de la forme.
Il n’est pas aisé de connaitre a priori le numéro du point d’ancrage pour pour positionner le connecteur à un point d’ancrage précis d’une forme. Si, comme dans notre exemple, nous désirons positionner les connecteurs à des points bien spécifiques des formes, le plus simple est d’utiliser l’enregistreur de macro pour déterminer les numéros de ces points.
Une autre option consiste à indiquer dans un premier temps, comme point d’ancrage ‘1’ et d’utiliser la méthode Rerouteconnections de l’objet ‘Connector’. Cette méthode a pour effet de prendre le chemin le plus court entre les deux formes reliées.