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 :

Formulaire de choix et d'alimentation de données


Sujet :

Macros et VBA Excel

  1. #21
    Nouveau membre du Club
    Je n'arrive déjà pas à obtenir les valeur unique du lieu dans le Combobox1

  2. #22
    Rédacteur

    Bonjour,
    Je n'arrive déjà pas à obtenir les valeur unique du lieu dans le Combobox1
    Pourriez vous publier le code que vous avez utilisé ?

    Si vous avez une version récente (365) d'excel, vous serez certainement inspiré par le billet de Pierre Fauconnier titré Excel 365: Filter les lignes d'une listbox selon la saisie d'un textbox (saisie intuitive) (Attention toutefois de ne pas devoir partager l'application avec des utilisateurs qui auraient des versions antérieures.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  3. #23
    Nouveau membre du Club
    Je parviens à afficher un tri avec un combobox par rapport au champs de la table.
    Mais ce n'est pas ce que je souhaiterais par rapport à mon projet.

  4. #24
    Responsable
    Office & Excel

    Et que souhaites-tu? Dans un message, tu parles de devoir obtenir la liste des villes sans doublons, et dans le message suivant, on comprend que tu veux trier sur base d'une colonne...

    Avec la version 2010 que tu as taguée, tu vas devoir "chipoter" pour récupérer les valeurs uniques. On pourrait t'aiguiller vers l'utilisation d'un dictionary, mais perso, fidèle à ma maxime (VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...), je n'aime pas et je me tournerais plus volontiers vers un tableau temporaire dans une feuille masquée dans lequel je supprimerais les doublons. Je procéderais de la même manière avec les noms pour une ville choisie: copier les contacts dans un tableau temporaire, trier par ville, déterminer la plage qui correspond aux contacts de la ville choisie et passer cette plage à la listbox.

    Avec les trois tableaux suivants t_contacts, t_VillesUniques et t_NomsVilleChoisie



    Voici comment j'afficherais le userform en préparant les contrôles. Je pense que le code se lit et se comprend facilement, surtout en pas à pas.
    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
    Sub Test()
      Dim Target As Range
     
      ClearTable "t_VillesUniques"
      ClearTable "t_NomsVilleChoisie"
     
      Set Target = Range("t_VillesUniques").ListObject.ListRows.Add().Range(1)
      Target.Resize(Range("t_Contacts").Rows.Count).Value = Range("t_Contacts[Ville]").Value
      Range("t_VillesUniques").ListObject.DataBodyRange.RemoveDuplicates 1
     
      With UserForm1
        .cboVilles.List = Range("t_VillesUniques").Value
        .lboNoms.List = Range("t_Contacts[Nom]").Value
        .Show
      End With
    End Sub
     
    Sub ClearTable(Name As String)
      If Not Range(Name).ListObject.DataBodyRange Is Nothing Then Range(Name).ListObject.DataBodyRange.Delete
    End Sub



    Au changement de ville dans le userform, on utilise le code suivant:
    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
    Private Sub cboVilles_Change()
      AdaptLboNoms
    End Sub
     
    Sub AdaptLboNoms()
      Dim Target As Range
      Dim Pos As Long, CountOf As Long
      ClearTable "t_NomsVilleChoisie"
      Set Target = Range("t_NomsVilleChoisie").ListObject.ListRows.Add().Range(1)
      Target.Resize(Range("t_Contacts").Rows.Count, Range("t_Contacts").Columns.Count).Value = Range("t_Contacts").Value
      With Range("t_NomsVilleChoisie").ListObject.Sort
        .SortFields.Clear
        .SortFields.Add Key:=Range("t_NomsVilleChoisie[Ville]"), Order:=xlAscending
        .SortFields.Add Key:=Range("t_NomsVilleChoisie[Nom]"), Order:=xlAscending
        .Apply
      End With
      Pos = Application.Match(cboVilles.Value, Range("t_NomsVilleChoisie[Ville]"), 0)
      CountOf = Application.CountIfs(Range("t_NomsVilleChoisie[Ville]"), cboVilles.Value)
      lboNoms.List = Range("t_NomsVilleChoisie[Nom]")(Pos).Resize(CountOf).Value
    End Sub






    Le fichier:
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    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...
    Vous avez apprécié la réponse? =>
    ---------------

  5. #25
    Nouveau membre du Club
    Bonjour,
    Tout d'abord je vous remercie pour l'aide apportée.

    J'ai essayé votre code, mais je n'arrive pas à tout comprendre. Je dois avoir un problème avec les index de mes colonnes.
    J'ai le tableau Tb_Site, le tableau Tb_Sitechoisi, et le tableau Tb_Garde. Lorsque je lance la macro du module test j'ai un décalage, la macro va chercher la date...
    Je n'arrive pas à déterminer ou cela dysfonctionne
    Tb_Site et Tb_SiteChoisi :


    Tb_Garde :


    Le code de la macro SUB test du 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
    Sub Test()
      Dim Target As Range
     
      ClearTable "Tb_Site"
      ClearTable "Tb_SiteChoisi"
     
      Set Target = Range("Tb_Site").ListObject.ListRows.Add().Range(1)
      Target.Resize(Range("Tb_Garde").Rows.Count).Value = Range("Tb_Garde[NOMPRE]").Value
      Range("Tb_Site").ListObject.DataBodyRange.RemoveDuplicates 1
     
      With UserForm1
        .ComboBox1.List = Range("Tb_Site").Value
        .ListBox1.List = Range("Tb_Garde[NOMPRE]").Value
        .Show
      End With
    End Sub
     
    Sub ClearTable(Name As String)
      If Not Range(Name).ListObject.DataBodyRange Is Nothing Then Range(Name).ListObject.DataBodyRange.Delete
    End Sub

  6. #26
    Responsable
    Office & Excel

    Les lignes 7, 8 et 9 du code que tu donnes crée la liste des sites dans doublons. A la ligne 8, tu dois donc prendre la colonne du site et pas la colonne NOMPRE
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    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...
    Vous avez apprécié la réponse? =>
    ---------------

  7. #27
    Nouveau membre du Club
    A l'initialisation c'est ok, sauf que le tableau Tb_SiteChoisi est désorganiser
    Au changement dans la combo j'ai un problème sur le SOrt key.


  8. #28
    Responsable
    Office & Excel

    Tu as mélangé mes tableaux intermédiaires, donc ça ne sait forcément pas fonctionner. De plus, je vois des tableaux sur d'autres feuilles.

    Le plus simple serait probablement que tu nous dises ce que tu souhaites obtenir au départ des tableaux de garde et d'activités, en français, sans jargon excel ou vba et sans dire le "comment". Nous pourrons probablement mieux t'aiguiller.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    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...
    Vous avez apprécié la réponse? =>
    ---------------

  9. #29
    Nouveau membre du Club
    Bonjour,

    J'ai trois feuilles dans mon classeurs : PARAM; ACTIVITES; GARDE_JOUR

    ==> La feuille garde jour est alimentée avec un tableau Tb_Garde dans le quel on trouve un champ date, un champ matricule, un champ nompre;un champ site; un champ motif un champ poste
    ==> Je souhaiterais alimenter le tableau Tb_Activité la feuille activités à l'aide de la feuille garde jour par l'intermédiaire d'un formulaire. J'aimerais que ce formulaire comporte le choix du site et le choix d'un thème ( thème qui se trouve dans la feuille PARAM sous la tableau Tb_THEME). L'idée serait que l'utilisateur puisse sélectionner plusieurs nom dans la listbox issue du choix du combo du choix du site.
    Aussi et avant le choix du thème, je souhaiterais que l'utilisateur puisse également avoir un état du dernier thème vu par les noms ( Date et thème) et voir le ou les thèmes les moins vu parmi les nom de la listBox.
    Enfin une fois les noms choisis et le thème choisi, je souhaiterais pouvoir affecter un nom en qualité de formateur.

    Le tableau Tb_Garde de la feuille GARDE_JOUR :


    Le tableau Tb_Activites de la feuille ACTIVITES


    Les tableaux Tb_Sites et Tb_Themes de la feuille PARAM


    Une idée de formulaire avec le bouton état d'aide au choix :

###raw>template_hook.ano_emploi###