Bonjour cher forum !!!
J'aimerais illustrer sous excel des statistiques par commune sur une carte regroupant plusieurs communes (en les colorisant par exemple). J'ai trouvé un site expliquant comment dessiner une carte sous Excel : OFFICE : Dessiner une carte de france avec les fonctions de dessins
J'ai réutilisé le code illustré sur cette page et j'ai trouvé le fichier .svg correspondant aux coordonnées des communes qui m'intéressent. J'ai introduit le tout dans Excel. Cependant lorsque je lance la fonction ça ne va pas.
J'ai alors essayé avec moins de communes et en simplifiant leurs coordonnées. Cela fonctionne.
Il semblerait donc que les coordonnées utilisées pour déterminer les contours de mes communes soient trop nombreuses. Les coordonnées d'une seule commune sont jusqu'à vingt fois plus nombreuses que celles utilisées pour les départements (exemple du lien).
Existe-t-il :
- des erreurs dans le code que j'utilise ?
- un autre moyen de faire ça sous Excel?
- ou éventuellement, un moyen efficace pour simplifier le code (cela voudra dire perte de détails sur la future carte, mais c'est mieux que... pas de carte)
Un grand merci d'avance,
Damien
Le code :
Option Explicit
Function CreateShapes3()
Dim oSheet As Excel.Worksheet ' Feuille de travail
Dim lLine As Long ' Compteur de lignes
Dim lCoord As String ' Coordonnées de la commune
Dim lCoordArray As Variant ' Coordonnées de la commune en tableau
Dim lCptCoord As Long ' Compteur pour parcourir les coordonnées
Dim lNbShape As Long ' Nombre de formes créées
Dim lShapeRange() ' Tableaux des noms de formes créées pour fonction Group
Dim loFreeformBuilder As Excel.FreeformBuilder 'Constructeur de forme libre
' Feuille de données
Set oSheet = Sheets("Communes")
' Parcours la feuille des données
For lLine = 2 To 71
' Coordonnées
lCoord = oSheet.Cells(lLine, 1)
' Mise en forme des coordonnées
lCoord = Replace(lCoord, ",", " ")
' Crée un tableau à partir de la chaîne de caractères
lCoordArray = Split(lCoord, " ")
' Initialise le compteur
lCptCoord = LBound(lCoordArray)
Do
Select Case lCoordArray(lCptCoord)
Case "M" ' Point de départ
' Crée un constructeur de "forme libre" pour le département courant sur la feuille oSheet
Set loFreeformBuilder = oSheet.Shapes.BuildFreeform(msoEditingCorner, Val(lCoordArray(lCptCoord + 1)) * 10, Val(lCoordArray(lCptCoord + 2)) * 10)
lCptCoord = lCptCoord + 3
Case "L" ' Segment
loFreeformBuilder.AddNodes msoSegmentLine, msoEditingAuto, Val(lCoordArray(lCptCoord + 1)) * 10, Val(lCoordArray(lCptCoord + 2)) * 10
lCptCoord = lCptCoord + 3
Case "C" ' Courbe
loFreeformBuilder.AddNodes msoSegmentCurve, msoEditingCorner, Val(lCoordArray(lCptCoord + 1)) * 10, Val(lCoordArray(lCptCoord + 2)) * 10, Val(lCoordArray(lCptCoord + 3)) * 10, Val(lCoordArray(lCptCoord + 4)) * 10, Val(lCoordArray(lCptCoord + 5)) * 10, Val(lCoordArray(lCptCoord + 6)) * 10
lCptCoord = lCptCoord + 7
Case "z" ' Fin de la forme
' Converti le Constructeur en Forme
With loFreeformBuilder.ConvertToShape
' Identifiant de la commune
.Name = oSheet.Cells(lLine, 2)
' Incrémente le nombre de formes créées
lNbShape = lNbShape + 1
' Redimensionne le tableau de formes créées
ReDim Preserve lShapeRange(1 To lNbShape)
' Ajoute le nom de la forme au tableau pour groupement
lShapeRange(lNbShape) = .Name
End With
' Libère l'objet constructeur
Set loFreeformBuilder = Nothing
' Sort de la boucle de traitement des coordonnées
Exit Do
End Select
Loop
Next
' Groupe les communes dans une forme
With oSheet.Shapes.Range(lShapeRange).Group
.Name = "CarteCommunes"
.ScaleHeight 0.05, msoFalse
.ScaleWidth 0.05, msoFalse
.LockAspectRatio = msoTrue
End With
End Function
J'aimerais illustrer sous excel des statistiques par commune sur une carte regroupant plusieurs communes (en les colorisant par exemple). J'ai trouvé un site expliquant comment dessiner une carte sous Excel : OFFICE : Dessiner une carte de france avec les fonctions de dessins
J'ai réutilisé le code illustré sur cette page et j'ai trouvé le fichier .svg correspondant aux coordonnées des communes qui m'intéressent. J'ai introduit le tout dans Excel. Cependant lorsque je lance la fonction ça ne va pas.
J'ai alors essayé avec moins de communes et en simplifiant leurs coordonnées. Cela fonctionne.
Il semblerait donc que les coordonnées utilisées pour déterminer les contours de mes communes soient trop nombreuses. Les coordonnées d'une seule commune sont jusqu'à vingt fois plus nombreuses que celles utilisées pour les départements (exemple du lien).
Existe-t-il :
- des erreurs dans le code que j'utilise ?
- un autre moyen de faire ça sous Excel?
- ou éventuellement, un moyen efficace pour simplifier le code (cela voudra dire perte de détails sur la future carte, mais c'est mieux que... pas de carte)
Un grand merci d'avance,
Damien
Le code :
Option Explicit
Function CreateShapes3()
Dim oSheet As Excel.Worksheet ' Feuille de travail
Dim lLine As Long ' Compteur de lignes
Dim lCoord As String ' Coordonnées de la commune
Dim lCoordArray As Variant ' Coordonnées de la commune en tableau
Dim lCptCoord As Long ' Compteur pour parcourir les coordonnées
Dim lNbShape As Long ' Nombre de formes créées
Dim lShapeRange() ' Tableaux des noms de formes créées pour fonction Group
Dim loFreeformBuilder As Excel.FreeformBuilder 'Constructeur de forme libre
' Feuille de données
Set oSheet = Sheets("Communes")
' Parcours la feuille des données
For lLine = 2 To 71
' Coordonnées
lCoord = oSheet.Cells(lLine, 1)
' Mise en forme des coordonnées
lCoord = Replace(lCoord, ",", " ")
' Crée un tableau à partir de la chaîne de caractères
lCoordArray = Split(lCoord, " ")
' Initialise le compteur
lCptCoord = LBound(lCoordArray)
Do
Select Case lCoordArray(lCptCoord)
Case "M" ' Point de départ
' Crée un constructeur de "forme libre" pour le département courant sur la feuille oSheet
Set loFreeformBuilder = oSheet.Shapes.BuildFreeform(msoEditingCorner, Val(lCoordArray(lCptCoord + 1)) * 10, Val(lCoordArray(lCptCoord + 2)) * 10)
lCptCoord = lCptCoord + 3
Case "L" ' Segment
loFreeformBuilder.AddNodes msoSegmentLine, msoEditingAuto, Val(lCoordArray(lCptCoord + 1)) * 10, Val(lCoordArray(lCptCoord + 2)) * 10
lCptCoord = lCptCoord + 3
Case "C" ' Courbe
loFreeformBuilder.AddNodes msoSegmentCurve, msoEditingCorner, Val(lCoordArray(lCptCoord + 1)) * 10, Val(lCoordArray(lCptCoord + 2)) * 10, Val(lCoordArray(lCptCoord + 3)) * 10, Val(lCoordArray(lCptCoord + 4)) * 10, Val(lCoordArray(lCptCoord + 5)) * 10, Val(lCoordArray(lCptCoord + 6)) * 10
lCptCoord = lCptCoord + 7
Case "z" ' Fin de la forme
' Converti le Constructeur en Forme
With loFreeformBuilder.ConvertToShape
' Identifiant de la commune
.Name = oSheet.Cells(lLine, 2)
' Incrémente le nombre de formes créées
lNbShape = lNbShape + 1
' Redimensionne le tableau de formes créées
ReDim Preserve lShapeRange(1 To lNbShape)
' Ajoute le nom de la forme au tableau pour groupement
lShapeRange(lNbShape) = .Name
End With
' Libère l'objet constructeur
Set loFreeformBuilder = Nothing
' Sort de la boucle de traitement des coordonnées
Exit Do
End Select
Loop
Next
' Groupe les communes dans une forme
With oSheet.Shapes.Range(lShapeRange).Group
.Name = "CarteCommunes"
.ScaleHeight 0.05, msoFalse
.ScaleWidth 0.05, msoFalse
.LockAspectRatio = msoTrue
End With
End Function