Bonjour,

Ce sujet fait suite aux divers messages que j'ai postés dans le but de créer et rendre interactive sous Excel une carte d'une région de France initiallement au format SVG (cf. 1, 2 et 3). Je me suis servi pour cela du tuto Dessiner une carte de France avec les fonctions de dessins de formes libres.

La carte créée, baptisée "CarteBasRhin", est composée de nombreuses formes libres (les villes) regroupées ensembles. Chaque forme se rapporte à une ligne d'un tableau composé de 500 lignes (une ligne par ville) environ et de 3 colonnes : l'identifiant (le code postal à peu de choses près), le nom de la ville, et une valeur associée.

Ma carte est correctement créée et je peux colorier presque chacune des formes libres en fonction de cette valeur associée grâce à une macro.

Je dispose également d'une macro nommée "Carte_Click" me permettant, lorsque l'utilisateur clique sur une ville particulière, de colorer la forme libre d'une autre couleur pour mieux la repérer par la suite et d'afficher les infos relatives à cette ville dans une zone de texte "info", du style :
Vous avez cliqué sur la ville : Ville N (ID XXXX)
Le CA de cette ville est : 568753 k€

Comme il n'est pas toujours aisé de connaître la position précise d'une ville sur ma carte, je souhaiterai ajouter une zone de liste baptisée "Select_Commune" listant le nom des villes et me permettant également de repérer la ville en la colorant sur la carte et d'afficher les infos relatives à cette ville dans "info".
Pour faire bien, il faudrait que en cliquant sur la carte, la zone de liste "Select_Commune" affiche aussi le nom de la ville correspondante.

J'ai tenté plusieurs techniques que j'ai trouvées au cours de mes recherches sur le web, mais rien n'a fonctionné jusqu'à présent.

Une idée pour faire cette zone de liste ?

Pour information :
* Ma carte et mes données sont sur la seule feuille de mon fichier : "CA"
* Voici la macro Carte_Click du module "Carte_Click" utilisée lorsque je clique sur la carte :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Sub Carte_Click()
'
Dim oSheet As Excel.Worksheet ' Feuille
Dim shpInfo As Shape
Dim loShape As Shape ' Forme
Dim strInfo, villeNum, villeNom As String
Dim i, villeTableur As Integer
Set oSheet = ThisWorkbook.Sheets("CA")
Set shpInfo = oSheet.Shapes("info")
 
'Récupère le code de la ville
villeNum = Application.Caller
 
'Recherche la position du code de la ville dans le tableur et en récupère le nom
i = 1
Do
    i = i + 1
    If Range("A" & i).Value = Application.Caller Then
        villeTableur = i
        villeNom = Range("B" & i).Value
        i = 535
    End If
Loop Until i > 534
 
'Affiche les nom et code de la ville
shpInfo.Select
strInfo = "Vous avez cliqué sur la ville : " & Chr(12) & villeNom & " (" & villeNum & ")" & vbNewLine & "xxx"
Selection.Characters.Text = strInfo
 
' Parcourt les villes de la carte pour mettre en transparence la ville sélectionnée
For Each loShape In oSheet.Shapes("CarteBasRhin").GroupItems
    If loShape.Name = Application.Caller Then
        loShape.Fill.Transparency = 0.6
    Else
 
        loShape.Fill.Transparency = 0#
    End If
Next
'Range("A" & depTableur & ":D" & depTableur).Select
End Sub
* Pour remplir la zone de liste, voici la macro du classeur (l'objet nommé par défaut "ThisWorkbook") :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Option Explicit
 
' Nettoyage puis création de la liste de communes dans la liste déroulante "Select_Commune" (ref. : http://www.lesite.net/forum/affich-1266881-liste-deroulante-excel-vba#breadScrumb)
 
'--------------------------------------------------------------------------------
' Déclenchement de la procédure à l'ouverture du classeur
'--------------------------------------------------------------------------------
Private Sub Workbook_Open()
 
'Dim oSheet As Excel.Worksheet ' Feuille
'Dim lLine As Long ' Numéro de ligne
 
' Feuille contenant la carte
'Set oSheet = ThisWorkbook.Sheets("CA")
 
'oSheet.Select_Commune.Clear
'For lLine = oSheet.UsedRange.Row + 1 To oSheet.UsedRange.Row + oSheet.UsedRange.Rows.Count
'    oSheet.Select_Commune.AddItem Row.Cells(1, 2).Value & " - " & Row.Cells(1, 1).Value
'Next
ThisWorkbook.Sheets("CA").Select_Commune.ListFillRange = "B2:B529"
 
End Sub
J'avais essayé de remplir automatiquement la zone de liste mais ça n'a pas fonctionné, donc je la remplie en rentrant directement la plage maintenant. Je l'ai également mis à tout hasard quelqu'un trouve aussi une solution à ça.