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 :

Faire des recherches multiples


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2012
    Messages : 8
    Points : 3
    Points
    3
    Par défaut Faire des recherches multiples
    Bonsoir, je voudrais avoir un userform avec des champs de recherches (panneaux déroulant en mode liste) qui donne un résultat dans un très grand champs listbox1.
    Il n'y a pas d'ordre à les remplir. On peut en laisser plusieurs vides (cela veut dire on prend toutes les valeurs), voir en mettre plusieurs.
    Je trouve que ce sera plus propre avec le second formulaire et les personnes qui n'ont pas au minimum la version 2016 ne peuvent pas s'en servir.


    Pouvez-vous m'aider pour rendre la listbox1 fonctionnel avec les champs de recherche multiple.

    1ère difficulté:
    je voulais savoir si on peut séparer un texte d'une cellule en plusieurs champs de recherche.
    Dans la feuille "table", j'ai nommé un tableau "TableauCategorie". Il y a un {"";"R4/R5";"R6/D7";"D8/D9";"P"} (photo présente).
    J'ai dans certains menus déroulants affichés les groupes de catégorie.
    Peut-on faire : si la catégorie est vide, on prend toutes les catégories, si il y a R4/R5, on prend dans les résultats les valeurs de R4 et les valeurs dans R5 et si pas de "/", on prend la valeur affichés.


    2ème difficulté:
    J'ai réussi à avoir toutes les cases comme je voulais sauf pour Club. Comment faire pour ajouter une case vide en premier lieu. Peut être qu'il vaut mieux utilisé une autre méthode que additem (en gros, j'ai environ 140 lignes qui vérifie).

    Je ne suis vraiment pas doué mais je trouve beaucoup de chose sur internet pour m'aider. Je copie beaucoup de chose donc je sais que je suis loin d'avoir un truc optimisé.

    J'ai essayé d'utiliser la fonction Frame comme vu sur le site de JB mais j'ai du mal. J'ai des propriétés de mal paramétrées.

    3ème difficulté:
    Est ce possible de faire la frame avec 2 lignes de texte? En gros avoir la ligne 3 et 4 affiché dans la Frame qui scrool en même temps.
    Mes en-têtes sont sur 2 lignes.

    Merci de venir m'aider. Je demande pas non plus les fichiers totalement fait mais de bonne piste déjà.

    Cordialement Nicolas.
    Images attachées Images attachées    
    Fichiers attachés Fichiers attachés

  2. #2
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2012
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Bonsoir, je viens de résoudre le point 2 et 3.

    Pour le point 2 j'ai changé de méthode qui est plus rapide normalement puis ajouter un additem "", 0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ''''''''''''''''''
    Set f = Sheets("joueurs")
      Set mondico = CreateObject("Scripting.Dictionary")
      a = f.Range("C5:C" & f.[A65000].End(xlUp).Row)   ' tableau a(n,1) pour rapidité
      For i = LBound(a) To UBound(a)
        If a(i, 1) <> "" Then mondico(a(i, 1)) = ""
      Next i
      '--avec tri
      temp = mondico.keys
     
      Call Tri(temp, LBound(temp), UBound(temp))
      Me.ComboClub.List = temp
        ComboClub.AddItem "", 0
    '''''''''''''''''''''''''
    Pour le point 3, je suis passé par un tableau fixe avec des limitations de largeur sur chaque colonne du tableau.

    Comment faire pour associé le tableau avec tous les champs? Je sais que le tableau devra varié avec la fonction change mais après je ne sais pas trop.

    Et je voudrais ajouter si on fait un double clic sur un texte, on ouvre la modification du joueur sélectionné.

    Nicolas.
    Fichiers attachés Fichiers attachés

  3. #3
    Membre émérite
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Points : 2 813
    Points
    2 813
    Par défaut
    Bonjour,
    1ère difficulté:
    je voulais savoir si on peut séparer un texte d'une cellule en plusieurs champs de recherche.
    Dans la feuille "table", j'ai nommé un tableau "TableauCategorie". Il y a un {"";"R4/R5";"R6/D7";"D8/D9";"P"} (photo présente).
    J'ai dans certains menus déroulants affichés les groupes de catégorie.
    Peut-on faire : si la catégorie est vide, on prend toutes les catégories, si il y a R4/R5, on prend dans les résultats les valeurs de R4 et les valeurs dans R5 et si pas de "/", on prend la valeur affichée.
    Que veut dire "on prend" ?
    Est-ce que c'est parce que tu veux mettre un filtre quelque part? Si oui, utilises l'enregistreur de macro pour connaître le code qui permet de filtrer un tableau (et d'enlever tous les filtres, càd prendre en compte toutes les catégories).

    En ce qui concerne le R4/R5, tu peux utiliser la fonction Split. Cela te renverra une liste avec chacune des catégories à prendre en compte. Par exemple :
    te renvoie R4, et
    te renvoie R5.

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2012
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Merci pour la réponse.

    Je prend note de la fonction split.

    Ce que je veux dire, c'est un champ vide signifie que toutes les valeurs du champs peuvent être affiché.

    Exemple, si je choisis en gros aucun champs, je vois toutes les valeurs dans le listbox.
    Si je met le club AMCB, je vois plus que 8 personnes.

    Si je choisi un nouveau champs de recherche Sexe par Homme, je passe à 5 personnes. Les femmes disparaissent du listbox.

    Si je retire un champ comme Homme (champs vide), je repasse à 8 personnes.

    Chaque champs de recherche ajouter doit faire diminuer le tableau.

    C'est comme sur la page joueurs, quand je clic sur AMCB, Homme, on affiche que ces champs là combiné ensemble dans le listing.

    Je viens de penser à une solution comme:
    Private Sub UserForm_Initialize() pour afficher toutes les valeurs (par défaut à chaque ouverture, aucun critère n'est choisi
    et tous les champs représentés par un removeitem (ou autre solution plus rapide).

    Je dis pas que c'est une bonne solution. Sans doute plus simple à faire dans l'autre sens.

    J'avais oublié aussi de récupérer les couleurs de remplissage des cellules.
    Le champs Forfait me sert à dire que c'est la couleur rouge dans le nom du joueurs qui prouve qu'il est forfait. Code exploité comme ça dans la feuille joueurs.

    J'ai changé aussi l'userform frmsaisie en passant presque tous les additem en fonction dico. J'ai retrouvé une super rapidité. Que c'est ouf la différence.
    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
     
    ''''''''''''''''''
    'ancien code
    'Rempli le panneau déroulant des clubs déjà présent dans le tableau des joueurs
    With Sheets("joueurs")
     
    'Boucle sur les cellules de les noms des clubs pour alimenter le ComboBox
    For Each Cell In .Range("Tjoueurs[Club]")
        If Cell <> "" Then
               cboClub = Cell
            'remplissage sans doublon
            If cboClub.ListIndex = -1 Then _
                cboClub.AddItem Cell
                cboClub = "" 'effacer le club affiché
                Trier cboClub, True  ' si alphabétique
            End If
    Next Cell
    End With
     
    ''''''''''''''''''
    'nouveau code
    Set f = Sheets("joueurs")
      Set mondico = CreateObject("Scripting.Dictionary")
      a = f.Range("Tjoueurs[Club]")   ' tableau a(n,1) pour rapidité
      For i = LBound(a) To UBound(a)
        If a(i, 1) <> "" Then mondico(a(i, 1)) = ""
      Next i
      '--avec tri
      temp = mondico.keys
     
      Call Tri.Tri(temp, LBound(temp), UBound(temp))
      Me.cboClub.List = temp
    '''''''''''''''''''''''''
    J'avais déjà utilisé ce code hier mais l'userform recherche donc j'ai décidé d'optimisé aussi l'autre userform qui en avait besoin.

  5. #5
    Membre émérite
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Points : 2 813
    Points
    2 813
    Par défaut
    Bonjour,
    Exemple, si je choisis en gros aucun champs, je vois toutes les valeurs dans le listbox.
    Si je met le club AMCB, je vois plus que 8 personnes.
    Si je choisi un nouveau champs de recherche Sexe par Homme, je passe à 5 personnes. Les femmes disparaissent du listbox.
    Si je retire un champ comme Homme (champs vide), je repasse à 8 personnes.
    Chaque champs de recherche ajouter doit faire diminuer le tableau.
    C'est comme sur la page joueurs, quand je clic sur AMCB, Homme, on affiche que ces champs là combiné ensemble dans le listing.
    Je vois que ta BDD est un tableau, tu peux donc utiliser les filtres. A chaque fois que tu sélectionnes un champ dans une listbox, tu ajoutes le filtre équivalent au tableau. Dans le listing final, tu ne fais apparaître que les lignes visibles. Pour cela utilises la propriété :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A1:A100").SpecialCells(xlCellTypeVisible)
    N'oublie pas d'enlever tous les filtres quand tu sors de ton userform.

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2012
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup pour la réponse.
    Je viens de rajouté les filtres à tous les champs.

    Mais je ne vois pas trop le code pour affiché les lignes visible dans la listbox.

    C'est possible de prendre le tableau filtrés avec le rowsources? C'est pour utiliser le nom des colonnes directement (columnHeads a True).
    Et en gardant les couleurs des cellules.

    Sinon si je met en label et que je dois scroller la listbox pour tout voir, ca va tout décaler.

    Edit: j'ai trouvé pour afficher le formulaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.ListBox1.RowSource = Range("Tjoueurs").SpecialCells(xlCellTypeVisible).Address
    Je pense que j'ai pu tout résoudre. Je vais voir pour ajouter plusieurs possibilité pour le classement.
    Sur le segment, on peut prendre plusieurs classement, je vais voir si je peux faire la même chose.
    J'avais vu comment faire sur boisgontierjacques qui est membre du forum.

    Je le remercie aussi pour tous les ressources qu'il nous transmet.
    Fichiers attachés Fichiers attachés

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2012
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Je l'ai vu fonctionné mais en fait plus aujourd'hui.
    En plus, le fichier, je suis persuadé que j'avais fait la modif avant de le mettre mais non.

    Quand j'initialise le tableau, je n'ai pas non plus la ligne rouge pour le forfait.

    Ou je dois alors mettre mon code avec le rowsource pour que chaque changement soit prit en compte?
    Quand je met le code dans initialisation, j'ai bien le tableau. Dès que je fais un changement, j'ai le tableau vide.

    Nicolas.

  8. #8
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonjour,


    J'ai essayé d'utiliser la fonction Frame comme vu sur le site de JB mais j'ai du mal. J'ai des propriétés de mal paramétrées.

    Un exemple de ListBox de colonnes discontinues avec en-têtes et Scroll en PJ

    Boisgontier
    Fichiers attachés Fichiers attachés

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2012
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup pour ces conseils.


    J'ai réussi à faire ma listbox.

    J'ai un peu galéré mais j'y suis arrivé.

    Là, j'ai un problème avec une fonction: Fusion triée de 3 colonnes pour ComboBox de boisgontierjacques.

    Cela fonctionne quand on a minimum 2 lignes dans les colonnes.

    J'ai implémenté cette fonction sur un tableau qui commence à 0 ligne.
    Comment faire pour garder cette fonction quand on a 0 ligne ou 1 ligne. L'erreur affiché est incompatibilité de type.

    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
      Set f = Sheets("joueurs")
      a = Application.Transpose(f.Range("Tjoueurs[Nom]"))
      b = Application.Transpose(f.Range("Tjoueurs[Partenaire de Double]"))
      c = Application.Transpose(f.Range("Tjoueurs[Partenaire de Mixte]"))
      temp = Split(Join(a, ",") & "," & Join(b, ",") & "," & Join(c, ","), ",")
      Tri.Tri temp, LBound(temp), UBound(temp)
      Set d = CreateObject("scripting.dictionary")
     
      For Each c In temp
      If c <> "" And c <> "X" Then
         d(c) = ""
         End If
      Next c
      Me.cboNom.List = d.keys
      cboDouble2.List = cboNom.List
      cboMixte2.List = cboNom.List
    'Set f = Sheets("joueurs")
      Set mondico = CreateObject("Scripting.Dictionary")
      a = f.Range("Tjoueurs[Club]")   ' tableau a(n,1) pour rapidité
      For i = LBound(a) To UBound(a)
        If a(i, 1) <> "" Then mondico(a(i, 1)) = ""
      Next i
      '--avec tri
      temp = mondico.keys
     
      Call Tri.Tri(temp, LBound(temp), UBound(temp))
      Me.cboClub.List = temp
        'cboClub.AddItem "", 0
    '''''''''''''''''''''''''
    La solution temporaire est d'utiliser cette fonction quand on a que 2 lignes (avec mon fichier).
    Quand j'ai 0 ligne, ça me dérange pas de ne pas avoir la fonction activé mais quand j'ai 1 ligne, je peux avoir au total 3 résultats
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If Range("Tjoueurs[Nom]").Cells.Count > 1 Then
    ...
    End If
    J'ai aussi à un autre endroit le même soucis si j'ai moins de 2 lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      'ajout d'un espace et la liste des clubs représentatif lors du tournoi
    Set f = Sheets("joueurs")
      Set mondico = CreateObject("Scripting.Dictionary")
      a = f.Range("Tjoueurs[Club]")   ' tableau a(n,1) pour rapidité
      For i = LBound(a) To UBound(a)
        If a(i, 1) <> "" Then mondico(a(i, 1)) = ""
      Next i
      '--avec tri
      temp = mondico.keys
     
      Call Tri.Tri(temp, LBound(temp), UBound(temp))
      Recherche.ComboClub.List = temp

    Je pense que cela provient donc de la fonction Tri que si on a pas 2 lignes, forcément ça plante.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Faire des recherches dans plusieur Feuilles
    Par edpth dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/11/2009, 00h21
  2. faire des recherches sur un pdf en utilisant javacript
    Par dobbmay dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 24/03/2009, 10h02
  3. Réponses: 1
    Dernier message: 17/10/2007, 10h55
  4. [XPATH] génération d'un xpath pour faire des recherches dans un xml
    Par Spaceman Spiff dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 11/06/2007, 18h18
  5. Que faut il utiliser pour faire des recherches dans LDAP?
    Par kabouns dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 04/08/2006, 15h24

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