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 :

Combobox en cascade


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2020
    Messages : 10
    Par défaut Combobox en cascade
    Bonjour et tout d'abord merci

    je travaille sous Excel 2013

    on me demande de faire un formulaire de saisie pour un contrôleur sur le terrain qui vérifie le matériel de techniciens....et j'ai même pas postulé pour ca ...

    j'ai donc un classeur avec une dizaine d'onglets "liste du personnel, liste des véhicules, liste du matériel, Poids de véhicules,..."

    je ne peux pas tout mettre sur une seule feuille, car tous les fichiers peuvent évoluer indépendamment : ex : un salarié peut sortir de l'entreprise (-1 ligne sur l'onglet liste du personnel) mais son véhicule sera attribué à une autre personne déjà présente dans l'entreprise... donc pas de sortie de véhicule mais juste un changement d'attribution dans l'onglet liste des véhicules.

    j'ai créée un premier onglet "Agences" dont les données sont figées - c'est la liste des départements.
    je voudrais créer un combobox qui en sélectionnant un département dans cet onglet , m'affiche dans un second combobox, tous les noms des salariés issus du second onglet rattachés à ce département que j'aurais sélectionné .

    je pourrais me passer du premier combobox, mais quand j'alimente le combobox directement depuis la liste du personnel, le combobox m'affiche les quelques 700 lignes de la feuille ...

    j'ai en pièce jointe mis le fichier ' un peu modifié à cause des données personnelles - vive le RGPD - j'ai aussi supprimé pas mal d'onglets - il y en a une dizaine - j'ai modifié les numéros de carte, les noms, les immat., les VIN ....faut aussi que je cherche par moi même pour la suite , sinon c'est pas marrant

    merci
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Perso, je travaillerais avec des tableaux structurés. Ton code sera, selon mes critères, plus simple à écrire, à lire et à maintenir.

    Je nommerais mes contrôles de userform dès le début du projet, pour m'y retrouver plus facilement pas la suite, surtout que ton userform est fourni. Il sera plus simple pour toi de manipuler tboNom, tboPrenom etc que Textbox1, Textbox2,...

    Je travaillerais avec un tableau temporaire qui récupèrerait la liste du personnel sur les colonnes utiles (Trigramme, Nom, Prénom, Agence), puis je trierais ce tableau temporaire par agence puis trigramme. Je pourrais alors récupérer la plage qui concerne une agence précise.

    Sur base des tableaux t_Agences, t_Personnel et tmp_Personnel, voilà comment je récupérerais un array VBA avec le personnel d'une agence:
    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
    Function PersonnelAgence(Agence As Long)
      Dim Pos As Long, CountOf As Long
     
      If Not Range("tmp_Personnel").ListObject.DataBodyRange Is Nothing Then _
        Range("tmp_Personnel").ListObject.DataBodyRange.Delete
     
      Range("tmp_Personnel[Trigramme]").Resize(Range("t_Personnel").Rows.Count).Value = _
        Range("t_Personnel[Trigramme]").Value
      Range("tmp_Personnel[Nom]").Resize(Range("t_Personnel").Rows.Count).Value = _
        Range("t_Personnel[Nom]").Value
      Range("tmp_Personnel[Prénom]").Resize(Range("t_Personnel").Rows.Count).Value = _
        Range("t_Personnel[Prénom]").Value
      Range("tmp_Personnel[Agence]").Resize(Range("t_Personnel").Rows.Count).Value = _
        Range("t_Personnel[Agence]").Value
     
      With Range("tmp_Personnel").ListObject.Sort
        .SortFields.Clear
        .SortFields.Add Range("tmp_Personnel[Agence]")
        .SortFields.Add Range("tmp_Personnel[Trigramme]")
        .Apply
      End With
     
      CountOf = Application.CountIfs(Range("tmp_Personnel[Agence]"), Agence)
      If CountOf > 0 Then
        Pos = Application.Match(Agence, Range("tmp_Personnel[Agence]"), 0)
        PersonnelAgence = Range("tmp_Personnel[Trigramme]")(Pos).Resize(CountOf, 3).Value
      Else
        PersonnelAgence = -1
      End If
    End Function
    Au choix de l'agence, on appelle la procédure qui remplit la liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub cboAgence_Change()
      Preparepersonnel
    End Sub
     
    Sub Preparepersonnel()
      Dim p
     
      p = PersonnelAgence(cboAgence)
      cboTrigrammes.Clear
      If IsArray(p) Then cboTrigrammes.List = p
    End Sub

    Le formulaire s'amorce via une procédure d'un module standard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub ShowFormAudit()
      With usfAudit
        .cboAgence.List = Range("t_Agences[Agence]").Value
        .Show
      End With
    End Sub

    Pour la suite de ton travail, tu pourrais t'inspirer de ma contribution qui modélise les échanges entre userform et tableau structuré
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2020
    Messages : 10
    Par défaut
    Bonsoir

    Avec beaucoup de retard, un grand MERCI

Discussions similaires

  1. Probleme ComboBox en cascade
    Par YOP33 dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 17/01/2010, 15h08
  2. fonction pour filtrage avec des combobox en cascade
    Par Montor dans le forum Contribuez
    Réponses: 3
    Dernier message: 09/11/2009, 12h05
  3. [E-00] ComboBox en cascade + TextBox
    Par couistelle dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 20/11/2008, 10h32
  4. Combobox en cascade et sans doublons
    Par humbp dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/11/2007, 13h54
  5. [VBA-E] ComboBox en cascade avec correspondance dans matrice
    Par ViperSpy dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/06/2006, 17h01

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