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 :

Récupération du contenu d'une zone de liste déroulante(contrôle formulaire)


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 14
    Points : 7
    Points
    7
    Par défaut Récupération du contenu d'une zone de liste déroulante(contrôle formulaire)
    Bonjour,
    comment je peux récupérer la valeur de ma zone de liste déroulante (contrôle formulaire) qui fait référence au mois (par exp : janvier-15, Février-15....)?
    Enfait j'ai un module qui a besoin de la période choisi sur ma liste déroulante pour importer une feuille nommée par période aussi (janvier-15, Février-15...)d'un autre classeur
    Merci

  2. #2
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Teste ceci après avoir adapter le nom de la feuille et de la liste "Formulaire" :
    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
     
    Sub Test()
     
        Dim S As Shape
     
        'adapter le nom de la liste et de la feuille...
        Set S = Worksheets("Feuil1").Shapes("Zone de liste 1")
     
        With S.ControlFormat
     
            MsgBox .List(.ListIndex)
     
        End With
     
    End Sub
    Hervé.

    Maintenant, si tu veux récupérer la valeur au clic sur la liste, il te faut lui indiquer quoi faire avec "OnAction". Teste le code ci-dessous en exécutant au préalable la proc "Remplir" et en ayant adapter les noms. Tu peux ensuite utiliser une variable à la place du "MsgBox" :
    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
    41
    42
    43
     
    Sub Remplir()
     
        Dim S As Shape
        Dim Tbl(1 To 12) As String
        Dim I As Integer
     
        For I = 1 To 12
     
            Tbl(I) = MonthName(I) & "-" & Right(Year(Now), 2)
     
        Next I
     
        'adapter les noms...
        Set S = Worksheets("Feuil1").Shapes("Zone de liste 1")
     
        With S.ControlFormat
     
            .RemoveAllItems
     
            For I = 1 To 12
     
                .AddItem Tbl(I)
     
            Next I
     
        End With
     
        S.OnAction = "ValeursListe"
     
    End Sub
     
    Sub ValeursListe()
     
        On Error Resume Next
        'adapter les noms...
        With ActiveSheet.Shapes("Zone de liste 1").ControlFormat
     
            MsgBox .List(.ListIndex)
     
        End With
     
    End Sub
    Hervé.

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Bonjour Theze,
    Merci beaucoup pour ta réponse mais je ne sais pas exactement comment adapter cela à mon cas.
    en effet, je suis novice en VBA, et je suis en mission de création d'un nouveau outil de reporting dans mon stage.
    Dans un classeur, j'ai une feuille "Data" et une feuille "Dashbord". Dans un autre classeur nommé "Historique" j'ai des feuilles nommées par mois (exp : Janvier-15, Février-15...) contenant les données. Sur la feuille "Dashbord", je veux créer une zone de liste déroulante (contrôle formulaire). Ce que j'aimerai avoir c'est à chaque fois qu'on choisit le mois (exp: Février-15), la macro aille copier la feuille "Février-15" du classeur "Historique" et vient la coller dans la feuille "Data" qui alimente mon tableau de bord.

    Un membre du forum m'avait aidé auparavant sur le même problème, mais au lieu de la zone de liste déroulante j'avais une cellule "P4" où j'insèrais le mois que je veux et c'était nommé comme ceci("01-15, 02-15...). son code marche à merveille mais afin d'éviter les erreurs de saisie je préfère avoir une zone de liste déroulante.
    Voilà le code:

    Dans le code de la feuille Dashbord :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Worksheet_Change(ByVal Target As Range)
        If (Target.Row = 4) And (Target.Column = 16) Then
           If Len(Target.Value) = 5 Then consultehisto (Target.Value)
      End If
    End Sub
    et dans un module :
    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
    Public Function consultehisto(periode As String)
     Dim wkSource As Workbook ' Classeur source
     
                ThisWorkbook.Sheets("Data").Select
                Cells.Select
                Selection.ClearContents
                Range("A1").Select
     
                Set wkSource = Application.Workbooks.Open("C:\Users\yousra\Desktop\Outil de Reporting\Historique.xlsx")
                Sheets(periode).Select
                Cells.Select
                Selection.Copy
     
                ThisWorkbook.Activate
                Sheets("Data").Select
                Cells.Select
                ActiveSheet.Paste
                Application.CutCopyMode = False
     
                wkSource.Close False 'Ferme sans modif
     
                ThisWorkbook.Activate
                Sheets("Data").Select
                Range("A1").Select
     
     
    End Function

    Voilà, j'espère que vous pourriez m'aider. Merci par avance

  4. #4
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Re,

    Tout d'abords, pour le code que tu viens de poster (pense à le mettre entre les balises , bouton # car plus lisible) il y a une petite erreur car "Function"..."End Function" est utilisé mal à propos puisque tu ne cherche pas à retourner une valeur ou un tableau de valeurs ! Il te faut pour ça, utiliser une Sub ("Sub"..."End Sub"). Ensuite, je ne suis pas très fan des Copy Paste Activate et Select car inutiles dans la majorité des cas de récupération de valeurs que ce soit de feuille à feuille ou de classeur à classeur, ça fait scintiller l'écran et je trouve tous ces mouvements plutôt stressant. L'utilisation d'un tableau est plus efficace et plus rapide. Donc, je te poste ta fonction modifiée en Sub avec l'utilisation d'un tableau :
    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
     
    Public Sub consultehisto(periode As String)
     
        Dim wkSource As Workbook ' Classeur source
        Dim Tbl
     
        ThisWorkbook.Sheets("Data").Cells.ClearContents
     
        Set wkSource = Workbooks.Open("C:\Users\yousra\Desktop\Outil de Reporting\Historique.xlsx")
     
        Tbl = wkSource.Sheets(periode).UsedRange
     
        With ThisWorkbook.Sheets("Data")
     
            .Range(.Cells(1, 1), .Cells(UBound(Tbl, 1), UBound(Tbl, 2))) = Tbl
     
        End With
     
        wkSource.Close False 'Ferme sans modif
     
    End Sub
    Ensuite, pour utiliser ta liste, il te suffit de remplacer le "MsgBox" par l'appel de ta Sub :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Sub ValeursListe()
     
        On Error Resume Next
        'adapter les noms...
        With ActiveSheet.Shapes("Zone de liste 1").ControlFormat
     
            consultehisto .List(.ListIndex)
     
        End With
     
    End Sub
    Comme je vois que tu utilise les mois en nom propre, j'ai un peu retouché la Sub "Remplir" afin de mettre la première lettre de chaque mois en majuscule donc, tu as juste à l'exécuter une nouvelle fois afin d'effectuer le remplacement dans la liste. Cette Sub n'est à exécuter qu'une fois, les valeurs étant ensuite enregistré par Excel. Tu t'en servira à partir de l'année prochaine pour 2016 ou alors si il y a un plantage et que la liste se retrouve vide.
    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
     
    Sub Remplir()
     
        Dim S As Shape
        Dim Tbl(1 To 12) As String
        Dim I As Integer
     
        For I = 1 To 12
     
            'avec la première lettre en majuscule
            Tbl(I) = UCase(Left(MonthName(I), 1)) & Right(MonthName(I), Len(MonthName(I)) - 1) & "-" & Right(Year(Now), 2)
     
        Next I
     
        'adapter les noms...
        Set S = Worksheets("Feuil1").Shapes("Zone de liste 1")
     
        With S.ControlFormat
     
            .RemoveAllItems
     
            For I = 1 To 12
     
                .AddItem Tbl(I)
     
            Next I
     
        End With
     
        S.OnAction = "ValeursListe"
     
    End Sub
    Et bien sûr, tout le code que je te poste ici est à mettre dans un module standard. Pour exécuter la Sub "Remplir", tu clique n'importe où dans la Sub pour y mettre le curseur puis touche F5.

    Hervé.

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Merci beaucoup Theze pour ton retour. Cependant j'ai un petit souci, pour l'adaptation des noms, à quoi tu fais référence par "feuil1", "zone de liste1" et "valeursliste"?

  6. #6
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    re,

    "Zone de liste 1" est le nom de ma liste dans ma feuille de calcul pour le test. Chez toi, il te faut récupérer le nom de ta liste (clic droit sur la liste puis copier le nom qui apparaît dans la zone de nom de ta feuille en haut et à gauche de la barre de formule) et remplacer "Zone de liste 1" par ce nom.

    "Feuil1" est le nom de ma feuille où j'ai posé ma liste de choix, il te faut remplacer "Feuil1" par le nom de la feuille où se trouve ta liste de choix.

    "ValeursListe" est la proc appelée par la liste de choix (OnAction) quand tu clique sur un élément.

    Sinon, donne moi le nom de ta feuille et de ta liste de choix et je t'adapte tout ça.

    Hervé.

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    RE
    J'ai pas mal essayé mais j'arrive pas à avoir un résultat (manque de compréhension peut être)
    je joins deux fichiers "Reporting" et "Historique" vides. Peux-tu stp me faire un petit test et me renvoyer les deux fichiers avec le code inséré?
    Merci Reporting.xlsmHistorique.xlsx

  8. #8
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Voilà j'ai une erreur de compilation
    Nom : Sans titre.png
Affichages : 5141
Taille : 124,2 Ko

  9. #9
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Voici le classeur en retour. Il est enregistré au format .xls car au boulot j'ai Excel 2003.

    Hervé.
    Fichiers attachés Fichiers attachés

  10. #10
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    merci beaucoup.
    une question, la "zone combinée 6" est-ce le nom de la zone de liste déroulante?
    moi, j'ai clické droit sur ma liste déroulante>formules>définir nom . Mais ça ne s’exécute pas au niveau de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set S = Worksheets("Dashbord").Shapes("zone")

  11. #11
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Re,

    Ce n'est pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set S = Worksheets("Dashbord").Shapes("zone")
    mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set S = Worksheets("Dashbord").Shapes("Zone combinée 6")
    A moins que tu es renommé ton combobox en "zone" et plus "Zone combinée 6" !
    moi, j'ai clické droit sur ma liste déroulante>formules>définir nom . Mais ça ne s’exécute pas au niveau de
    ça n'a rien à voir !
    Quand je dis cliquer droit sur le combobox pour voir son nom, ce n'est pas "formules>définir nom" c'est pour faire apparaître le nom du combobox dans "Zone nom" le champ à gauche de la barre de formule.

    Hervé.

Discussions similaires

  1. Réponses: 5
    Dernier message: 11/06/2020, 12h44
  2. Réponses: 5
    Dernier message: 29/08/2012, 13h37
  3. Réponses: 6
    Dernier message: 23/06/2009, 17h00
  4. Exporter le contenu d'une zone de liste vers excel
    Par MsieurDams dans le forum Access
    Réponses: 4
    Dernier message: 30/07/2006, 22h00
  5. Effacer le contenu d une zone de liste
    Par nico5151 dans le forum IHM
    Réponses: 23
    Dernier message: 22/06/2005, 15h50

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