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 :

Comment renvoyer dans un même USF les lignes d'un Tableau structuré selon critères de 2 ComboBox [XL-2016]


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
    Retraité
    Inscrit en
    Mars 2022
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2022
    Messages : 60
    Par défaut Comment renvoyer dans un même USF les lignes d'un Tableau structuré selon critères de 2 ComboBox
    Bonjour,

    Je tourne en rond depuis 2 jours sans pouvoir résoudre le problème.
    Il s'agit à partir d'une base de données (BDD= adhérents classés A-Z par année) sous forme de Tableau structuré d'offrir à l'utilisateur de rechercher voire modifier les données propres à un adhérent.

    J'ai créé un USF en 2 partie:
    La partie 1 se présente avec 2 Combobox : n°1 =noms X, y, z .... et n°2= année(s) d'adhésion du nom choisi en n°1
    La partir 2 regroupe les champs avec les différentes informations sur l'adhérent X

    L'utilisateur doit pouvoir à partir de cet USF définir le nom de l'adhérent (choisi dans la liste déroulante n°1) et, pour l'année choisie dans la CBox n°2, obtenir les données correspondantes (détaillées par conséquent dans la partie 2 de l'USF)

    Ceci dit je dois avouer que mon code m'a réservé des nombreuses surprises.
    A l'ouverture du USF j'obtiens bien en CBox n°1 la liste complète des noms d'adhérents sur toutes les années de la BDD
    Seulement la CBox année(s) reste vide ! sauf ...... pour l'adhérent qui n'existe que sur une année mais dans ce cas les données renvoyées ne correspondent pas à ce nom !
    En outre si l'on change le choix du nom dans la CBox n°1 ....... alors plantage sur la formule avec SpecialCells !

    Pour illustrer tout cela j'ai joint un fichier allégé avec 7 noms bidons et bien sûr mon codage.

    Je suis preneur de toutes pistes pour sortir de cette galère et vous en remercie par avance.
    Cordialement
    Fichiers attachés Fichiers attachés

  2. #2
    Membre confirmé
    Homme Profil pro
    Technicien d'usinage
    Inscrit en
    Juillet 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien d'usinage

    Informations forums :
    Inscription : Juillet 2017
    Messages : 132
    Par défaut
    Essayer de placer dans dans CBoxMembres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim vrech As Range
    'Je recherche dans la colonne la valeur de la combo
    Set vrech = Worksheets("BDD AAM").Columns("C:C").Find(Me.CBoxMembres.Value, LookIn:=xlValues)
    'si je trouve une valeur alors j'affiche la valeur correspondante de la
    'colonne C dans le textbox
    If Not vrech Is Nothing Then
        TxtBoxNom.Value = vrech.Offset(0, 1).Value
        TxtBoxPrenom.Value = vrech.Offset(0, 2).Value
        'txtboxJF.Value = .................................
    End If

  3. #3
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 414
    Par défaut
    Bonjour,

    Un début de solution, en considérant aussi que la liste des membres doit être sans doublons.
    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
    44
    45
    46
    47
    48
    49
    50
    51
    Private Sub UserForm_Initialize()
        Dim tbStruc As ListObject, colNP As Long, rNP As Range, c As Range, c1 As String
        Set tbStruc = SheetASSOC.ListObjects("tblMembres")
        tbStruc.Range.AutoFilter    'ôter les filtres éventuels
        colNP = tbStruc.ListColumns("Nom & Prénom").Index
        CBoxMembres.Clear
        'CBoxMembres.List = tbStruc.ListColumns(colNP).DataBodyRange.Value       '--- liste inutilisable à cause des doublons !
        Set rNP = tbStruc.ListColumns(colNP).DataBodyRange      '--- plage Nom & Prénom
        c1 = rNP(1, 1).Address                                  '--- adresse première cellule de la plage
        For Each c In rNP
            Debug.Print Evaluate("=COUNTIF(" & c1 & ":" & c.Address & ", " & c.Address & ")")
            If Evaluate("=COUNTIF(" & c1 & ":" & c.Address & ", " & c.Address & ")") = 1 Then
                CBoxMembres.AddItem c.Value
            End If
        Next c
        Set tbStruc = Nothing
    End Sub
     
    Private Sub CBoxMembres_Change()
        Dim tbStruc As ListObject, colAn As Long, AnneesTrouvees As Range, rAnnee As Range
        'charge les années avec ce nom
        Set tbStruc = SheetASSOC.ListObjects("tblMembres")
        colAn = tbStruc.ListColumns("Année").Index
        tbStruc.Range.AutoFilter    'ôter les filtres éventuels
        tbStruc.Range.AutoFilter tbStruc.ListColumns("Nom & Prénom").Index, CBoxMembres 'tri sur les nom & prénom renvoyé depuis CBoxMembres
        Set AnneesTrouvees = tbStruc.ListColumns(colAn).DataBodyRange.SpecialCells(xlCellTypeVisible)
        CBoxYear.Clear
        For Each rAnnee In AnneesTrouvees
            CBoxYear.AddItem rAnnee.Value
        Next rAnnee
        Set rAnnee = Nothing
        Set tbStruc = Nothing
        Set AnneesTrouvees = Nothing
    End Sub
     
    Private Sub CBoxYear_Change()
        Dim tbStruc As ListObject, colAn As Long, ligneAn As Long, AnneesTrouvees As Range, rAnnee As Range
        FrmInfos.Enabled = True 'rend accessible la deuxieme partie de l'USF (modifiable par l'utilisateur)
        'charge le nom indiqué (cboxMembres)  pour l'année sélectionnée
        Set tbStruc = SheetASSOC.ListObjects("tblMembres")
        colAn = tbStruc.ListColumns("Année").Index
        tbStruc.Range.AutoFilter    'ôter les filtres éventuels
        tbStruc.Range.AutoFilter tbStruc.ListColumns("Nom & Prénom").Index, CBoxMembres 'tri sur les nom & prénom renvoyé depuis CBoxMembres
        'Debug.Print CBoxYear.ListIndex, CBoxYear
        On Error Resume Next    '--- erreur si aucune année sélectionnée
        ligneAn = tbStruc.ListColumns(colAn).DataBodyRange.SpecialCells(xlCellTypeVisible).Find(CBoxYear).Row
        ligneAn = ligneAn - tbStruc.Range.Rows(1).Row
        TxtBoxNom = tbStruc.ListColumns("Nom").DataBodyRange(ligneAn).Value
        TxtBoxPrenom = tbStruc.ListColumns("Prénom").DataBodyRange(ligneAn).Value
        Set tbStruc = Nothing
    End Sub
    Cordialement.
    Fichiers attachés Fichiers attachés

  4. #4
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 228
    Par défaut
    Hello,
    Pour le problème n°1 , cela vient du fait que les lignes filtrées ne sont pas contigües et cela ne plaît pas à la propriété RowSource de la comboBox CboxYear. Il faut trier le tableau structuré par la colonne Nom&Prenom.
    En ce qui concerne le remplissage des champs dans le formulaire il serait judicieux d'utiliser le module de classe DataUsfManager de Pierre Fauconnier. Celui-ci permet de faire "un mapping" entre les données du tableau structurée et les champs du formulaire en utilisant un tableau structuré ( utilisation de getmap1). Pour simplifier la saisie du mapping, j'ai rajouté deux procédures qui permettent :
    1 - De lister les champs du formulaire pour les avoir en choix de liste dans le tableau structuré de mapping (par la validation conditionnelle).
    2 - De lister les colonnes du tableau structuré source pour les avoir en choix de liste dans le tableau structuré de mapping (par la validation conditionnelle).
    Exemple :
    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
    Sub ListControles()
    Dim cCont As Control
    Dim I As Integer
        I = 1
        Range("E1").Value = "FrmInfoAdherent"
        For Each cCont In FrmInfoAdherent.Controls
            Range("E1").Cells.Offset(I, 0) = cCont.Name
            Debug.Print cCont.Name
            I = I + 1
        Next cCont
    End Sub
     
    Sub ListeColTableau()
    Dim col
    Dim I As Integer
    Dim tbStruc As ListObject
        I = 1
        Set tbStruc = SheetASSOC.Range("tblMembres").ListObject
        Range("F1").Value = "tblMembres"
        For Each col In tbStruc.ListColumns
            Range("F1").Cells.Offset(I, 0) = col.Name
            I = I + 1
            Debug.Print col.Name
        Next
    End Sub
    Nom : Mappage.PNG
Affichages : 154
Taille : 50,7 Ko

    Ami calmant, J.P

  5. #5
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2022
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2022
    Messages : 60
    Par défaut
    Bonjour,

    Je vous remercie pour ces retours. La réponse de Jurassic P est tout à fait en ligne avec le super mémo de Pierre Fauconnier que j'avais effectivement découvert sur les tableaux structurés ....
    Malheureusement mon niveau actuel ne me permet pas de digérer rapidement toutes ses explications et recommandations. Je vois toutefois que JP m'a ici établi un document de travail déjà bien élaboré qui va donc me servir à une meilleure assimilation de la "Bible".
    Je vous en remercie vivement et me mets donc au boulot.

    Bonne fin de journée à tous

  6. #6
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 228
    Par défaut
    Hello,
    A titre indicatif, ne pas oublier que dans Excel , il y a une commande qui permet de faire apparaître un formulaire automatique avec tous les champs d'un tableau et dans lequel on peut faire des recherches, des saisies, des nouvelles lignes, des suppressions. Il s'agit de la commande Formulaire... (DataFormExcel).
    Exemple :
    Nom : DataFormExcel.gif
Affichages : 251
Taille : 284,6 Ko

    Bien sûr il n'y a pas de liste déroulante et la disposition que certainement l'on voudrait. Les formules sont traduites par la valeur de celles-ci et l'on ne peut pas les modifier.

    Ami calmant, J.P

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 19/05/2009, 16h57
  2. Comment comparer 2 tables et trouver les lignes différentes
    Par PierreYvesQc dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 07/08/2007, 21h04
  3. Réponses: 5
    Dernier message: 20/07/2007, 15h15
  4. Réponses: 1
    Dernier message: 15/04/2007, 20h09
  5. Réponses: 8
    Dernier message: 02/03/2007, 16h37

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