IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Zone de liste liée à une carte et une zone de texte [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 113
    Par défaut Zone de liste liée à une carte et une zone de texte
    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.

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    J'avais essayé de remplir automatiquement la zone de liste mais ça n'a pas fonctionné
    Je n'ai pas compris ce que tu voulais dire ?

    J'ai positionné la listbox sur la feuille CA, il faudra modifier le code. Pour synchroniser la listbox avec le clic, ajoute :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With Sheets("CA")
        num = Application.Match(villeNom, .[B2:B529], 0)
        .Select_Commune.ListIndex = num - 1
    End With
    après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'Affiche les nom et code de la ville
    Si sélection par listbox, j'ai juste récupéré le nom et le code de la commune. Tu n'as plus qu'à recopier une partie de ton code (à mettre dans le module de la feuille qui contient le listbox) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Select_Commune_Click()
        Dim villeNom As String, villeNum
        With Me.Select_Commune
            villeNom = .Value
            villNum = Application.Index([CA!A2:A529], .ListIndex + 1, 1)
        End With
    End Sub

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 113
    Par défaut
    Bonjour,

    Tout d'abord, merci Daniel pour ton aide.

    Citation Envoyé par Daniel.C Voir le message
    Citation Envoyé par SkyCorp Voir le message
    J'avais essayé de remplir automatiquement la zone de liste mais ça n'a pas fonctionné
    Je n'ai pas compris ce que tu voulais dire ?
    Pour l'instant, je récupère manuellement les données dans ma liste en spécifiant la plage voulue (B2:B529) par le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThisWorkbook.Sheets("CA").Select_Commune.ListFillRange = "B2:B529"
    Mais à terme, je voudrai que la dernière ligne de ma plage soit déterminée automatiquement.
    J'avais essayé ça :
    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
    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
    Next
    End Sub
    mais ça n'a pas fonctionné. J'ai par ailleurs l'impression que la variable oSheet ne fonctionne pas si elle est placée dans une macro du classeur (l'objet nommé par défaut "ThisWorkbook") alors que ça ne semble pas poser de problème avec un module.




    Mis à part ce problème, j'ai placé ton premier code qui synchronise la listbox avec le clic sur ma carte et tout marche bien.

    Par contre, le second code n'a pas fonctionné. Tout ce que je peux faire est sélectionner une ville dans ma liste, mais cela n'agit ni sur ma carte, ni dans ma zone de texte.
    Je l'ai placé dans la feuille CA, sans succès. J'ai également essayé un module distinct, mais je n'ai pas réussi à l'associer à ma zone de liste déroulante (je n'ai pas l'option "Affecter une macro..."). Je précise que la zone de liste est un contrôle ActiveX. J'ai également essayé via un contrôle de formulaire à la place mais il faudrait sans doute modifier le code ailleurs dans ce cas.
    Au passage, cliquer sur "Visualiser le code" dans le menu contextuel de ma zone de liste ajoute automatiquement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Select_Commune_Change()
     
    End Sub
    et non "Private Sub Select_Commune_Click()", mais même ça ne change rien.

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    1. remplissage de la listbox :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Workbook_Open()
        Dim c As Range
        Dim i As Long ' Numéro de ligne
        With ThisWorkbook.Sheets("CA")
            .Select_Commune.Clear
            For i = 2 To .Cells(.Rows.Count, 2).End(xlUp).Row
                .Select_Commune.AddItem .Cells(i, 2).Value
            Next
        End With
    End Sub
    Note qu'alors, il ne faut pas renseigner la propriété ListFillRange.

    Par contre, le second code n'a pas fonctionné. Tout ce que je peux faire est sélectionner une ville dans ma liste, mais cela n'agit ni sur ma carte, ni dans ma zone de texte.
    Non, la macro remplit les variables villenom et villenum que tu utilises dans ta macro. Quand tu cliques sur une forme, tu renseignes ces deux variables et tu colories la forme. Est-ce que tu peux faire le contraire, colorier la commune à partir des deux variables précitées ? Si tu n'y arrives pas, dis-le.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 113
    Par défaut
    Je vois ce que tu veux dire.

    Mais je veux bien un coup de main. N'étant pas encore très à l'aise avec VBA, j'essaie de reprendre des parties de code de ma macro "Carte_Click" mais je suis en train de me mélanger les pinceaux.

    Pour le remplissage de la listbox, ça ne fonctionne pas encore.
    Excel m'affiche "Erreur d'exécution '2147467259 (80004005)': Erreur non répertoriée.". Le débogueur pointe alors sur la ligne .Select_Commune.Clear.
    En lisant le site de microsoft (lien) m'indique :
    Pour contourner ce problème, ôter la protection de la feuille de calcul pour activer la macro à exécuter. Vous pouvez annuler manuellement la protection de la feuille de calcul ou à l'aide de la méthode Ôter la protection de la macro.
    Le problème est que j'ai tenté la manip en autorisant toutes les macros, mais rien n'y fait. Mes premières recherches sur Google n'ont rien donné de concluant.
    Par ailleurs, je ne vois pas trop l'utilité du Dim c As Range

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Est-ce que la feuille "CA" est protégée, et si oui, l'est-elle avec un mot de passe ?

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 113
    Par défaut
    Non, rien n'est protégé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 25/03/2011, 10h52
  2. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  3. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  4. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo