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 :

Filtrage d'une Listbox VBA


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
    Technicien support automatisme
    Inscrit en
    Septembre 2015
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien support automatisme

    Informations forums :
    Inscription : Septembre 2015
    Messages : 32
    Par défaut Filtrage d'une Listbox VBA
    Bonjour,

    J'ai créé une Listbox pour afficher des données dans un Userform.
    Je rempli ma Listbox avec la colonne A et lorsque je sélectionne un élément j'affiche les données des autres colonnes de la ligne correspondante. Si je sélectionne la donnée en A1 j'affiche dans la UserForm B1, C1, etc...
    ça fonctionne parfaitement.

    J'utilise une fonction Textbox_Change pour filtrer ma Listbox. Par exemple j'écris 2 lettres et la Listbox ne m'affiche que les données de la colonne A (en direct, sans passer par un bouton ou autres) qui contiennent ces 2 lettres.
    ça fonctionne parfaitement aussi.

    Le bug, c'est qu'après mon filtrage, lorsque je sélectionne une donnée j'ai l'erreur d'exécution 13 (type incompatible). Je n'arrive pas à comprendre. Avant le filtre, ça fonctionne, après le filtre j'ai cette erreur.

    Quelqu'un aurait une idée ?

    Merci d'avance.
    Pascal.

  2. #2
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 121
    Par défaut
    Salut

    Sans voir le code, c'est pas évident de t'aider.
    Tu es technicien de maintenance, si je te dis
    "Mon moteur marche pas, aidez moi"
    Je pense que pour pouvoir m'aider, tu vas avoir besoin d'informations supplémentaires, ben nous aussi

    Tu peux utiliser un point d'arrêt dans ton code (touche F9 pour le basculer), l'idéal étant de le placer avant la ligne qui plante. Ensuite, tu exécutes ton code, quand VBA va arriver sur le point d'arrêt , il va stopper l'exécution du code. A partir de la, tu peux regarder ce que contiennent les variables. Tu peux aussi placer des espions.
    Tu trouveras des infirmations ici.
    La touche F8 te permettra d'avancer pas à pas jusqu'à la ligne qui plante.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  3. #3
    Membre averti
    Homme Profil pro
    Technicien support automatisme
    Inscrit en
    Septembre 2015
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien support automatisme

    Informations forums :
    Inscription : Septembre 2015
    Messages : 32
    Par défaut Filtre listbox
    Salut Qwazerty,

    Apparemment mon code plante dès la lecture du premier textbox, le reste n'est pas lu :
    Lorsque ma listbox est remplie je peux sélectionner un élément. ça fonctionne tant que je ne filtre pas. (tous mes textbox s'affiche sur ma userform)
    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
    Private Sub ListBox1_Change()
    derlig = Range("A65536").End(xlUp).Row
    If ListBox1.ListIndex = -1 Then
     
        Exit Sub
    End If
    lig = ListBox1.List(ListBox1.ListIndex, 1)
    TextBox3.Value = Cells(lig, 1).Value
    TextBox11.Value = Cells(lig, 2).Value
    TextBox10.Value = Cells(lig, 3).Value
    TextBox6.Value = Cells(lig, 4).Value
    TextBox12.Value = Cells(lig, 5).Value
    TextBox4.Value = Cells(lig, 6).Value
    TextBox5.Value = Cells(lig, 7).Value
    TextBox13.Value = Cells(lig, 8).Value
    TextBox14.Value = Cells(lig, 9).Value
    TextBox15.Value = Cells(lig, 13).Value
    TextBox8.Value = Cells(lig, 11).Value
    TextBox9.Value = Cells(lig, 12).Value
    TextBox7.Value = Cells(lig, 10).Value
    End Sub
    Voici ma TextBox de filtre. Elle fonctionne bien mais dès que je sélectionne un élément dans la ListBox, ça plante direct à la textbox3 : 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
    30
    31
    Public Sub TextBox1_Change()
    derlig = Range("A65536").End(xlUp).Row
    If rma = True Then
        ListBox1.ListIndex = -1
        ListBox1.Clear
        For i = 2 To derlig
            If InStr(Cells(i, 1).Value, TextBox1.Value) > 0 Then ListBox1.AddItem Cells(i, 1).Value
        Next i
    End If
    If tc = True Then
    ListBox1.ListIndex = -1
    ListBox1.Clear
    For i = 2 To derlig
        If InStr(Cells(i, 4).Value, TextBox1.Value) > 0 Then ListBox1.AddItem Cells(i, 4).Value
    Next i
    End If
    If client = True Then
        ListBox1.ListIndex = -1
        ListBox1.Clear
        For i = 2 To derlig
            If InStr(Cells(i, 6).Value, TextBox1.Value) > 0 Then ListBox1.AddItem Cells(i, 6).Value
        Next i
    End If
    If produit = True Then
        ListBox1.ListIndex = -1
        ListBox1.Clear
        For i = 2 To derlig
            If InStr(Cells(i, 7).Value, TextBox1.Value) > 0 Then ListBox1.AddItem Cells(i, 7).Value
        Next i
    End If
    End Sub
    Je n'arrive pas à voir autre chose avec les astuces de débug. j'espère avoir donné un peu plus d'infos exploitable.

    Merci de votre aide.

  4. #4
    Membre très actif
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 351
    Par défaut
    Bonjour,

    Ta colonne 1 contient quoi ? quel type de données ?

    Est que ce n'est pas parce quelle contient un code d'erreur ou quelle est vide.

  5. #5
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 121
    Par défaut
    Salut

    Sur le code en lui même, quelques conseils
    • Renommer les composants du userform permet d'identifier rapidement de quoi il est question dans le code et donc facilite le débugueur
    • Il vaut mieux déclarer ses variables, ça a plein d'avantage (limite les risques de faute de frappe, par exemple). Pour ne pas oublier de le faire, il suffit d'ajouter tout en haut de chaque page de code "Option explicit".
    • Les appels à Cells, Range,... sans préciser la feuille et le classeur et selon moins source d'erreur et rend le code moi facile à suivre
      En ce qui me concerne j'utilise le plus souvent possible le codename de la feuille, comme ça on est sur de la feuille sur laquelle on travaille.
      Nom : 2015-01-18_134906.png
Affichages : 1722
Taille : 14,2 Ko
    • L'utilisation de tableaux structurés sur la feuille excel permet de simplifier/clarifier le code (Pierre fauconnier à fait des billets sur son Blog à se sujet). Un outil vraiment incontournable
    • VBA permet de faire des boucles, autant en profiter
      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
      Private Sub ListBox1_Change()
      Dim aCompo As MSForms.Control, aTxtBox As MSForms.TextBox
      Dim DerLig As Long, Lig As Long
       
          DerLig = Range("A65536").End(xlUp).Row
          If ListBox1.ListIndex <> -1 Then
              Lig = ListBox1.List(ListBox1.ListIndex, 1)
              'On boucle sur les controle du user form
              For Each aCompo In Me.Controls
                  'On regarde s'il s'agit d'un textbox
                  If TypeOf aCompo Is MSForms.TextBox Then
                      'On transtype
                      Set aTxtBox = aCompo
                      'On regarde le contenu de tag
                      If aTxtBox.Tag <> "" And IsNumeric(aTxtBox.Tag) Then
                          'On utilise la valeur de tag (qui contient la colonne correspondante dans le tableau
                          aTxtBox.Value = Feuil1.Cells(Lig, CInt(aTxtBox.Tag)).Value
                      End If
                  End If
              Next
          End If
          End If
      End Sub
      Ici il suffit de mettre dans la propriété tag de chaque textbox, le numéro de colonne correspondante. Il existe d'autre variante, en utilisant le nom des colonnes du tableau structuré par exemple...
      Tu peux aussi regarder du coté de propriété ControlSource du textbox (avec le textbox à Locked true si tu ne veux faire que de l'affichage)
      Également RowSource pour les listes.
    • Idem pour l'autre partie du code, autant mettre une variable pour la colonne est définir cette variable pour ensuite n'avoir qu'un seul 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
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      Public Sub TextBox1_Change()
      Dim DerLig As Long
      Dim iCol As Integer
       
          DerLig = Range("A65536").End(xlUp).Row
          'On défini la colonne pointée en fonction des variables
          If Rma Then
              iCol = 1
          ElseIf Tc Then
              iCol = 4
          ElseIf Client Then
              iCol = 6
          ElseIf Produit Then
              iCol = 7
          End If
       
          'On regarde si une colonne est indiqué dans iCol
          If iCol > 0 Then
              ListBox1.ListIndex = -1
              ListBox1.Clear
              For i = 2 To DerLig
                  If InStr(Cells(i, iCol).Value, TextBox1.Value) > 0 Then ListBox1.AddItem Cells(i, iCol).Value
              Next i
          End If
      End Sub
    • J'avais réalisé des Modules de Classe permettant d'automatiser ce genre de liaison entre tableau structuré et composant d'un UserForm, tu trouveras un lien vers la discution dans ma signature. C'est peut-être un poile plus compliqué à mettre en oeuvre mais quasi plus de code VBA.


    Ceci dit tout ça ne résoudra pas ton problème.
    Si tu mets ton point d'arrêt sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TextBox3.Value = Cells(lig, 1).Value
    Et que tu places ta souris (ou un espion) sur Cells(lig, 1).Value, qu'est ce que ça te donne? Visiblement il n'arrive pas à transtyper tout seul le contenu de la cellule en chaine de caractère (string) pour le placer dans le TextBox.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  6. #6
    Membre averti
    Homme Profil pro
    Technicien support automatisme
    Inscrit en
    Septembre 2015
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien support automatisme

    Informations forums :
    Inscription : Septembre 2015
    Messages : 32
    Par défaut Suite
    Bonjour,

    Désolé pour le retard je ne me suis remis sur la macro qu'aujourd'hui.

    Pascal Lob, je n'ai que du texte dans mes cellules et aucunes n'est vide. Le filtre fonctionne, c'est vraiment au moment de la sélection, ça marche avant le filtre (en sélectionnant une ligne toutes mes données s'affichent dans la UserForm) et ça ne marche plus après.

    Qwazerty, je reconnais que mon code est bord*lique, je vais faire le ménage.
    Au niveau de l'espion, je comprends vaguement qu'il n'arrive pas à lire la méthode CurtargetY et CurY. Il me mets que le contrôle doit avoir un focus. Il me sort la fonction SetFocus à utiliser.

    Je me demande si je ne me suis pas lancé dans un truc trop compliqué pour un simple amateur.

    En tous les cas merci pou votre aide

    Pascal.

Discussions similaires

  1. [XL-2010] Transfert d'un dictionary dans une listbox ( VBA)
    Par omrsmiloud dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 26/03/2018, 18h58
  2. [XL-2007] modifier une valeur d'une listbox (VBA Excel)
    Par leyjah dans le forum Excel
    Réponses: 1
    Dernier message: 25/04/2013, 05h03
  3. [XL-2007] Modifier une valeur d'une listbox (VBA Excel)
    Par leyjah dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 22/04/2013, 17h32
  4. [Autocad] Insertion d'une ligne dans une listbox (VBA)
    Par stick25 dans le forum Général VBA
    Réponses: 8
    Dernier message: 18/03/2010, 10h56
  5. filtrage dans une listbox - VB6
    Par captainamerica75 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 29/05/2007, 14h45

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