Obtenir une liste d'élements à partir de plusieurs feuilles

Bonjour à tous,

Je viens de m'inscrire car je ne trouvais pas de sujet ressemblant à mon problème.

Je vous explique mon problème Pour cela, j'ai uploader un fichier test mais mon fichier réel contient plus de 100 000 lignes.

J'ai un fichier Excel avec trois feuilles. Dans ces trois feuilles, il y'a deux colonnes portant le même nom. Sont recensés les équipements de chaque commune dans trois feuilles différentes.

J'aimerais créer dans une 4ème feuille une liste déroulante avec le nom de commune et avec tous les équipements qu'il y'a sur cette commune. Par exemple, en cliquant sur Paris, j'aurais la liste suivante: Master, Musée, Foot les uns en dessous des autres.

Cet exemple est simple mais dans ma recherche j'ai une dizaine de feuilles avec ^plus de 100000 lignes.

Je vous remercie d'avance.

A bientôt !

Poussin

19test-commune.xlsx (9.40 Ko)

Boujour PM, bonjour le forum,

En pièce jointe ton fichier modifié. J'ai utilisé une UserForm lancée par un bouton avec le code ci-dessous :

Bouton :

Private Sub CommandButton1_Click()
ActiveCell.Select 'enlève le focus au bouton
UserForm1.Show 'affiche l'UserForm1
End Sub

Userform

Private O As Worksheet 'déclare la variable O (Ongets)
Private TV As Variant 'déclare la variable TV (Tableau des Valeurs)

Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Dim I As Integer 'déclare la variable I (Incrément)
Dim D As Object 'déclare la variable D (Dictionnaire)

Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For Each O In Sheets 'boucle 1 : sur tous les onglets O du classeur
    If Not O.Name = "Feuil1" Then 'condition : si le nom de l'onglet O est différent de "Feuil1"
        TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
        For I = 2 To UBound(TV, 1) 'boucles 2 : sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
            D(TV(I, 1)) = "" 'alimente le dictionnaire D
        Next I 'prochaine ligne de la boucle 2
    End If 'fin de la condition
Next O 'prochain onglet de la boucle 1
Me.ComboBox1.List = D.keys 'alimente la Listbox1 avec la liste des éléments du dictionnaire D sans doublon
End Sub

Private Sub ComboBox1_Change() 'au changement dans la ComboBox1
Dim I As Integer 'déclare la variable I (Incrément)

Me.ListBox1.Clear 'vide la ListBox1
For Each O In Sheets 'boucle 1 : sur tous les onglets O du classeur
    If Not O.Name = "Feuil1" Then 'condition : si le nom de l'onglet O est différent de "Feuil1"
        TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
        For I = 2 To UBound(TV, 1) 'boucles 2 : sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
            'si la donnée ligne I, colonne 1 de TV est égale à la valeur de la ComboBox1 et si la données ligne I colonne 2 de TV n'est pas vide
            If TV(I, 1) = Me.ComboBox1.Value And TV(I, 2) <> "" Then Me.ListBox1.AddItem TV(I, 2) 'ajoute la donnée ligne I colonne 2 de TV à la ListBox1
        Next I 'prochaine ligne de la boucle 2
    End If 'fin de la condition
Next O 'prochain onglet de la boucle 1
End Sub

Private Sub CommandButton1_Click() 'bouton "Sortir"
Unload Me 'vide et ferme l'UserForm1
End Sub
38meslin-v01.xlsm (24.25 Ko)

Un grand merci, je vais regarder cela !

Comment faites-vous pour être aussi rapides sur ce forum? Vous êtes géniaux, on apprend beaucoup !

Re,

Moi je prends des drogues dures (Excelïne, VBïne), les autres j'sais pas...

J'ai un problème car dans mon fichier initial, j'ai 36000 communes et du coup lorsque je copie colle mes communes dans ton fichier, j'ai ce message d'erreur:

Erreur d'exécution '6':

Dépassement de capacité

Le déboguage:

Private Sub CommandButton1_Click()

ActiveCell.Select 'enlève le focus au bouton

UserForm1.Show 'affiche l'UserForm1

End Sub

Si tu peux m'aider Je te remercie d'avance.

Poussin

Re,

Remplace, partout dans le code de l'UserForm, la ligne :

Dim I as Integer

par :

Dim I as Long
18meslin-v02.xlsm (22.71 Ko)

Un grand merci.

Est-ce que je peux te demander de l'aide sur une dernière chose Totem

Est-il possible en VBA de créer un formulaire comme tu as fait mais avec des boutons radios permettant de choisir "Culturel", "Sport" et "Enseignement"? Et d'obtenir des résultats de recherche en fonction de cela ?

Je te remercie d'avance

Geoffrey "Poussin"

Re,

C'est quoi un bouton radio ? Tu veux dire une ComboBox où selon le choix elle afficherait la liste des villes contenant ce choix ? Le contraire de l'UserForm1 en fait ?

Re,

Regarde si la v03 te convient...

27meslin-v03.xlsm (28.01 Ko)

Je te remercie grandement. Je suis en train de regarder ton code et j'apprends grâce à toi Totem


Je suis sur Mac chez moi. Je n'arrive plus à voir ton code. Je te dirai cela lundi au travail. Encore merci.

Je ne sais pas si tu as fait ça, mais j'aimerais cocher décocher selon les choix suivants pour récupérer les infos:

  • enseignement
  • sport
  • culture

Et garder la liste des communes comme tu avais fait dans la liste. Si tu vois ce que je veux dire.

Si tu n'as pas le temps, ce n'est pas grave, tu m'as déjà beaucoup aidé ! J'apprends beaucoup via ce forum c'est une merveille !

Re,

C'est exactement ce que j'ai fait...

Un grand merci, c'est super !

Je peux te poser une dernière question pour comprendre ton code ? Si je souhaite créer une nouvelle feuille "Loisir", est-ce facile de l'intégrer au code et de créer un nouveau bouton radio?

Encore merci !

Rebonjour,

Voici mon fichier. J'ai essayé de comprendre ton code et créer une nouvelle feuille mais j'ai l'erreur 9, l'indice n'appartient pas à la selection.

Après ça, j'ai terminé, je cliquerai sur "Résolu". Merci VBiste !

13test-meslin04.xlsm (33.26 Ko)

Bonjour PMeslin, bonjour le forum,

En pièce jointe la version 04. Tu avais parfaitement adapté le code sauf que la propriété [Caption] de la CheckBox4 doit être égale au nom de de l'onglet de référence, J'ai donc mis CheckBox4.Caption = "Test" et ça marche impeccable.

Pense a modifier la propriété [Caption] de la checkbox associée si tu modifies le nom de l'onglet...

J'ai aussi rajouter cette partie :

Private Sub ComboBox1_Change() 'au changement dans laz ComboBox1
Dim CTRL As Control 'déclare la variable CTRL (ConTRôLe)

Me.ListBox1.Clear 'vide la ListBox1
For Each CTRL In Me.Controls 'boucle sur tous les contrôles de l'UserForm
    If TypeOf CTRL Is MSForms.CheckBox Then CTRL.Value = False 'si le contrôle est une CheckBox, décoche la CheckBox
Next CTRL 'prochain contrôle de la boucle
End Sub

pour qu'un changement de commune réinitialise les données...

17meslin-v04.xlsm (30.00 Ko)

Un grand merci. Problème résolu avec en prime beaucoup d'apprentissage

Thautheme,

Dernières petites questions pour avoir un fichier propre.

Comment puis-je afficher la combobox1 par odre alphabétique ? Car à l'heure actuelle nous avons:

  • affichage de culture par odre alphabétique
  • affichage de sport par ordre alphabétique
etc (cf. pièce jointe)

et je souhaiterais que la combobox finale ait tout trier par ordre alphabétique. Si tu vois ce que je veux dire.

2ème question nulle... Comment changer le nom du bouton sur la feuill1? :s J'ai tout essayé...

Je te remercie d'avance.

thautheme

Re,

En pièce jointe la v05 avec tri par ordre alphabétique...

• Pour le bouton :

  • il te faut le ruban "Développeur" (cherche dans l'aide Excel comment le rajouter si tu ne le sais pas)
  • clique sur Mode Création
  • double-clique sur le bouton Fonctions
  • tu te retrouves dans l'éditeur Visual Basic (VBE),
  • dans la fenêtre des [Propriétés] (en bas à gauche)
  • modifie la propriété [Caption]
  • Ferme la fenêtre de VBE ([Alt]+[F11])
  • cliquer à nouveau sur Mode Création pour sortir de ce mode...
c'est fait !...

25meslin-v05.xlsm (33.05 Ko)
Rechercher des sujets similaires à "obtenir liste elements partir feuilles"