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 :

Méthode FIND et ListBox


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 47
    Par défaut Méthode FIND et ListBox
    Bonjour à tous,

    Je recherche à remplir une listbox, en fonction des valeurs sous une cellule déterminé par la méthode FIND

    Je n'arrive pas à déterminer la cellule num.. ERREUR : Incompatibilité de type.

    La méthode find ne renvoie pas une addresse ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub ComboBox1_Click()
    Dim num As Range
    ListBox1.Clear
     Dim j As Long
    With Worksheets("Liste")
        Set num = .Range("A1:AY1").Find(ComboBox1.Value, xlValues, xlWhole, , , True)
    MsgBox .Cells(num.Row, num.Column)
      For j = 20 To Worksheets("Liste").Cells(num.Row, num.Column).End(xlUp).Row
          Me.ListBox1.AddItem Worksheets("Liste").Cells(j, num.Column)
       Next j
     
        End With
    End Sub
    Je vous remercie d'avance,

    Gaétan

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2021
    Messages
    334
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2021
    Messages : 334
    Par défaut
    Salut, à quelle ligne se situe l'erreur ? essaye ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub ComboBox1_Click()
    Dim num As Range
    ListBox1.Clear
     Dim j As Long
    With Worksheets("Liste")
        Set num = .Range("A1:AY1").Find(ComboBox1.Value, xlValues, xlWhole, , , True)
    MsgBox .Cells(num.Row, num.Column)
      For j = 20 To Worksheets("Liste").Cells(num.Row, num.Column).End(xlUp).Row
          Me.ListBox1.AddItem Worksheets("Liste").Cells(j, num.Column).value
       Next j
     
        End With
    End Sub

  3. #3
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour à vous, Bonjour au Forum,

    Salut Christian (ravi de te retrouver)

    Tu réponds de manière juste à notre ami, et c'est normal.

    Pour ma part, on ne dira jamais assez la réelle efficacité des tableaux structurés.

    Ici, plus de méthode Find. Il suffit d'appeler la colonne choisie.

    Module Standard

    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
    Option Explicit
     
    Public Sub test_alimctrl()
     
    Dim c As Range
     
    With Usf_monboformulaire
          .Lbx_malistbox.Clear
          With .Cbx_macombo
                .Clear
                For Each c In Sht_données.ListObjects("T_montablo").HeaderRowRange
                      .AddItem pvargitem:=c.Value
                Next c
                'Debug.Print .ListCount
                .SetFocus
          End With
          .Show
    End With
     
    End Sub
    Module formulaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Option Explicit
     
    Private Sub Cbx_macombo_Change()
    Me.Lbx_malistbox.List = Range("T_montablo[" & Me.Cbx_macombo.Text & "]").Value
    End Sub
    Je m'interroge cependant sur un point.
    Pour l'alimentation de la Combobox, j'étais parti sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .List = Sht_données.ListObjects("T_montablo").HeaderRowRange.Value
    Mais seule la 1ère cellule de la zone de titres de colonnes était retenue comme item.

  4. #4
    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 Marcel


    Citation Envoyé par MarcelG Voir le message
    [...]
    Pour l'alimentation de la Combobox, j'étais parti sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .List = Sht_données.ListObjects("T_montablo").HeaderRowRange.Value
    Mais seul la 1ère cellule de la zone de titres de colonnes était retenue comme item.
    Tu dois utiliser la propriété .Column puisque ton Header ne contient qu'une ligne...


    Ici, sans voir la configuration de la feuille, je ne suis pas certain qu'il puisse s'agir d'un tableau structuré, puisque l'on part de la 20ième ligne pour remplir la listbox alors que "l'entête" est sur la ligne 1. A voir donc si on a une copie d'écran. Mais bien entendu, je ne peux qu'encourager l'utilisation des tableaux structurés, car le code est alors encore beaucoup plus concis et lisible.
    "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...
    ---------------

  5. #5
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour Pierre,

    Merci
    Je viens de le voir par ailleurs et allais reporter le code

    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
    Option Explicit
     
    Public Sub test_alimctrl()
     
    With Usf_monboformulaire
          .Lbx_malistbox.Clear
          With .Cbx_macombo
                .Clear
                .Column = Sht_données.ListObjects("T_montablo").HeaderRowRange.Value
                .SetFocus
          End With
          .Show
    End With
     
    End Sub
    Quand même plus simple, car la colonne choisie est celle dont l'entête est sélectionné par la Combobox.

    Je ne dis pas qu'il s'agit là d'un tableau structuré.
    Mon but était de mettre en évidence la facilité (parmi tant d'autres) que permet l'emploi de cet objet.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 47
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Salut Marcel




    Tu dois utiliser la propriété .Column puisque ton Header ne contient qu'une ligne...


    Ici, sans voir la configuration de la feuille, je ne suis pas certain qu'il puisse s'agir d'un tableau structuré, puisque l'on part de la 20ième ligne pour remplir la listbox alors que "l'entête" est sur la ligne 1. A voir donc si on a une copie d'écran. Mais bien entendu, je ne peux qu'encourager l'utilisation des tableaux structurés, car le code est alors encore beaucoup plus concis et lisible.
    Merci je dois m'améliorer sur les tableaux, je reviens ce soir vers toi si je n'y arrive pas. Encore merci

  7. #7
    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.

    Sans voir une copie de ta feuille, il es malaisé de comprendre ce que tu souhaites réellement obtenir. Perso, je m'y prendrais différemment.

    Par exemple, même si je comprends bien que cette ligne est là à des fins de vérification, je n'écrirais pas MsgBox .Cells(num.Row, num.Column), mais MsgBox num.value, .Cells(num.Row, num.Column) pointe forcément vers num.

    Je me méfie de Find et préfère m'en passer lorsque c'est possible. Or ici, je crois comprendre que la combobox1 est remplie avec les valeurs des cellules A1:AY1, de sorte que lorsque tu cliques sur une entrée de la combo, tu peux connaître la colonne qui a en fait été choisie. En sachant que les lignes de la combo commencent à 0, la colonne choisie est l'index de la combo +1... Dès lors, pas besoin de FIND pour trouver la colonne. Pour remplir la combobox, j'utilise sa propriété Column qui permet de transposer en lignes les valeurs de la plage A1:AY1.

    Tu peux remplir la listbox grâce à sa propriété List qui permet d'éviter la boucle en lui passant le tableau des valeurs de la plage souhaitée lorsque cette dernière a été déterminée.

    Dès lors, le code de remplissage de la combobox pourrait être celui-ci, à mettre dans le initialize du userform ou dans la procédure d'amorçage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ComboBox1.Column = Worksheets("Liste").Range("a1:ay1").Value

    Au clic sur le combo, on remplit alors la listbox avec le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub ComboBox1_Click()
      Dim rng As Range
      Dim LastRow As Long
     
      ListBox1.Clear
      Set rng = Worksheets("Liste").Cells(20, ComboBox1.ListIndex + 1)
      LastRow = Worksheets("Liste").Cells(1048576, ComboBox1.ListIndex + 1).End(xlUp).Row
      Set rng = rng.Resize(LastRow - rng.Row + 1)
      ListBox1.List = rng.Value
    End Sub

    N'hésite pas à avancer en pas à pas pour comprendre chaque ligne. Sans savoir ce que tu cherches exactement, je n'ai pu que supputer une solution qui est plus une illustration de la démarche à mettre en place plutôt qu'une solution fonctionnelle.

    N'hésite pas à renommer tes contrôles dès le début de la création du userform
    "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...
    ---------------

  8. #8
    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
    Citation Envoyé par MarcelG Voir le message
    [...]

    Quand même plus simple, car la colonne choisie est celle dont l'entête est sélectionné par la Combobox.[...]
    Oui, c'est ce que j'illustrais avec le code que j'ai donné: Set rng = Worksheets("Liste").Cells(20, ComboBox1.ListIndex + 1) qui évite le Find.


    Avec un tableau structuré, le code est d'une concision inégalée (quand je dis que l'utilisation des tableaux structurés facilite l'écriture du code...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub ComboBox1_Click()
      ListBox1.List = Range("tableau1").ListObject.ListColumns(ComboBox1.ListIndex + 1).DataBodyRange.Value
    End Sub
     
    Private Sub UserForm_Initialize()
      ComboBox1.Column = Range("tableau1[#headers]").Value
    End Sub
    Au passage, il faut noter que préfixer la plage d'un tableau structuré de la feuille qui le contient est contreproductif. Les noms des tableaux structurés étant uniques, il est plus concis et surtout plus stable d'utiliser Range("MonTableau").ListObject que MaFeuille.ListObject("MonTableau") puisqu'en cas de déplacement sur une autre feuille, le premier code continuera à fonctionner alors que le second plantera.
    "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...
    ---------------

  9. #9
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    D'accord.

    Pour ce qui concerne la ligne de départ, on peut par ailleurs cacher les enregistrements et utliiser les cellules visibles pour alimenter la listbox.

    Ce qui donnerait

    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
    Option Explicit
     
    Public Sub test_alimctrl()
     
    Range("T_montablo[leparent]").EntireRow.Hidden = False
     
    Dim i As Byte
     
    For i = 1 To 2
          Range("T_montablo[leparent]")(i).EntireRow.Hidden = True
    Next i
     
    With Usf_monboformulaire
          .Lbx_malistbox.Clear
          With .Cbx_macombo
                .Clear
                .Column = Range("T_montablo[#Headers]").Value
                .SetFocus
          End With
          .Show
    End With
     
    End Sub
    (Peut-être, pourrait-on se passer de boucle)

    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Cbx_macombo_Change()
    Me.Lbx_malistbox.List = Range("T_montablo[" & Me.Cbx_macombo.Text & "]").SpecialCells(xlCellTypeVisible).Value
    End Sub
    Ou bien donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Cbx_macombo_Change()
    Me.Lbx_malistbox.List = Range("T_montablo").ListObject.ListColumns(Me.Cbx_macombo.ListIndex + 1).DataBodyRange.SpecialCells(xlCellTypeVisible).Value
    End Sub

  10. #10
    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
    Oui (sans toutefois trop voir le lien avec la question de départ), mais alors si les lignes à masquer se suivent, autant se passer de la boucle (On pourra bien sûr variabiliser les index)

    Masquer x lignes à partir de la première
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    range("tableau1").Resize(2).EntireRow.Hidden=true

    Masquer x lignes à partir d'une ligne précise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    range("tableau1").Resize(1).Offset(4).Resize(10).EntireRow.Hidden=true


    Perso, je préfère attendre que Gaëtan nous dise pourquoi il commençait à 20 et qu'il nous montre une copie d'écran, pour éviter de trop digresser.
    "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...
    ---------------

  11. #11
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    OK, on attend

    J'avais juste (en utilisant un Range de Range)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("T_montablo[leparent]").Range("A1:A2").EntireRow.Hidden = True

  12. #12
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("T_montablo[leparent]").Range("A1:A2")
    C'est intéressant car ça illustre que l'on peut définir la cellule A1 d'une plage (ce qui est assez méconnu), ce qui évite dans certains cas de devoir calculer des décalages...
    "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...
    ---------------

Discussions similaires

  1. Problème méthode find
    Par tazmania dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 01/06/2007, 15h37
  2. méthode FIND EXCEL
    Par melodyyy dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 04/01/2007, 18h06
  3. VBA-E Problème méthode .find
    Par popo68 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 03/01/2007, 10h14
  4. Méthode find sensible aux cellules fusionnées?
    Par spileo dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/09/2006, 01h22
  5. Utilisation de la méthode FIND
    Par Jeannot45 dans le forum Access
    Réponses: 3
    Dernier message: 09/01/2006, 15h41

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