XL 2016 Erreur incompatibilité de type après clic sur item d'une ListBox

Axel19

XLDnaute Nouveau
Bonjour,

Je continue mes tests avec mon fichier qui permet de rechercher des items dans une liste de livres d'une plage donnée.

J'ai ajouté dans l'affichage des résultats la cellule voisine (colonne C), qui contient le nom de l'auteur.

Les résultats (avec le nom d'auteur en plus) s'affichent bien correctement dans la ListBox, mais lorsque je clique sur un item, j'ai une erreur 13 ("incompatibilité de type").

Voyez-vous ce qui cloche ? (J'ai essayé de changer le type de variable, sans succès).

Je joins mon fichier.

Merci d'avance !
 

Pièces jointes

  • Livres_Test_A-Z_ListBox_2.xlsm
    35.3 KB · Affichages: 12

JM27

XLDnaute Barbatruc
Bonjour
A tester
Tu fais une recherche de deux valeurs concaténées dans une seule colonnes
donc ta recherche n'abouti à rien.
Il faut déconcaténner cette valeur de list index et faire la recherche.
de plus il il y a un espace en plus dans la concaténation ( que j'ai supprimé)
 

Pièces jointes

  • Livres_Test_A-Z_ListBox_2.xlsm
    31.9 KB · Affichages: 7
Dernière édition:

JM27

XLDnaute Barbatruc
Bonjour
encore plus simple
pas besoin de recherche
comme tu avais rangé dans l'init de ta listbox le numéro de la ligne de la feuille dans la deuxième colonne de ta lisbox ;
VB:
Private Sub ListBox1_Click()
    Dim laligne As Long
    laligne = ListBox1.List(ListBox1.ListIndex, 1)
    Rows(laligne).Select
End Sub
 

jmfmarques

XLDnaute Accro
Bonjour
Je n'ouvre jamais un classeur tiers, mais mon petit doigt me dit que JM27 l'a fait, lui. Et si ce qu'il rapporte est vrai (deux champs concaténés et dont Match cherche la valeur concaténée dans une plage qui, elle, ne l'est pas, ma foi .... Match pourra chercher logntemps et retournera donc la valeur NA !)...
Un salut amical à JM27
 

Axel19

XLDnaute Nouveau
Bonjour JM27,
Merci pour votre réponse.
Dans votre premier retour, cela fonctionnait, sauf sur quelques items (je croyais que c'était à cause de la présence d'un chiffre, mais ce serait plutôt à cause du caractère "-").

Avec votre 2ème réponse, cela fonctionne dans tous les cas ! Et c'est effectivement plus simple !

Je vais regarder ça de plus près.
Merci beaucoup !
 

JM27

XLDnaute Barbatruc
Pour la première solution : effectivement cela ne marchait pas tout le temps
Les items qui avais déja un - dans le titre( exemple Pays de la nuit - 1 (Le)) posait pb , car on déconcaténait sur le premier - d'ou l'erreur


En utilisant deux colonne dans ta lisbox ( la troisième masquée)
 

Pièces jointes

  • Livres_Test_A-Z_ListBox_2.xlsm
    31.5 KB · Affichages: 5
Dernière édition:

Axel19

XLDnaute Nouveau
J'essaie de trouver une solution, mais ce morceau de code (tri alphabétique) me passe vraiment au-dessus...

Et pourriez-vous m'éclairer sur le sens des dernières lignes de cette procédure (à partir de : ListBox1.AddItem Cells(ligne, 2)) ?

Que signifie "cpt" ?

Code:
[CODE=vb]Private Sub TextBox1_Change()


    Application.ScreenUpdating = False

      

    Range("B2:B" & Cells(Rows.Count, 1).End(xlUp).Row).Interior.ColorIndex = xlColorIndexNone     'définit la couleur de fond des cellules à 'Aucun remplissage'

    ListBox1.Clear

        If TextBox1 <> "" Then

        For ligne = 2 To Cells(Rows.Count, 1).End(xlUp).Row

            If Cells(ligne, 2) Like "*" & TextBox1 & "*" Then

                Cells(ligne, 2).Interior.ColorIndex = 42

                ListBox1.AddItem Cells(ligne, 2)

                ListBox1.List(cpt, 1) = Cells(ligne, 3)

                ListBox1.List(cpt, 2) = ligne

                cpt = cpt + 1

            End If

        Next

        End If

 


End Sub
[/CODE]
 

patricktoulon

XLDnaute Barbatruc
re
bien vu JM27 j'avais pas fait attention a la concaténation

perso match je m'en sert avec evaluate ca me permet de gérer le non match en amont (chose impossible avec (worksheetfunction.Match) sauf avec on error ....... qui peut devenir compliqué dans un code

donc
VB:
Private Sub ListBox1_Click()
    Dim existe,recherche$
    recherche = Trim(Mid(ListBox1.List(ListBox1.ListIndex), 1, InStrRev(ListBox1.List(ListBox1.ListIndex), "-") - 1))
    existe = IsError(Evaluate("=MATCH(""" & recherche & """,B1:b99999,0)"))
    If Not IsError(existe) Then Rows(Evaluate("=MATCH(""" & recherche & """,B1:b99999,0)")).Select
End Sub

comme le concat est fait avec " - " j'utilise InstrRev dans le Mid pour ne prendre en compte que le dernier ça permet d'avoir des chaines contenant un "-"
 

JM27

XLDnaute Barbatruc
CPT est un compteur ( qui n'a pas été déclaré)
il aurait fallu en début e procédure ecrire
Dim Cpt as integer par exemple
ce qui est mieux
pour le tri , tu trie ta feuille avant et ca doit le faire
@ patricktoulon
: match je m'en sers mais toujours avec une gestion d'erreurs
en plus il a rangé dans la listbox le numéro de la ligne , donc inutile

VB:
Private Sub TextBox1_Change()
    Dim cpt As Integer
    Application.ScreenUpdating = False
    Range("B2:B" & Cells(Rows.Count, 1).End(xlUp).Row).Interior.ColorIndex = xlColorIndexNone     'définit la couleur de fond des cellules à 'Aucun remplissage'
    ListBox1.Clear
        If TextBox1 <> "" Then
        For ligne = 2 To Cells(Rows.Count, 1).End(xlUp).Row
            If Cells(ligne, 2) Like "*" & TextBox1 & "*" Then
                Cells(ligne, 2).Interior.ColorIndex = 42
                ListBox1.AddItem
                ListBox1.List(cpt, 0) = Cells(ligne, 2)
                ListBox1.List(cpt, 1) = Cells(ligne, 3)
                ListBox1.List(cpt, 2) = ligne
                cpt = cpt + 1
            End If
        Next
        End If
End Sub
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
D'accord. C'est vu. Merci pour ça.
Je débute, et je ne connais pas encore toute la syntaxe VBA (preuve en est avec la réponse de patricktoulon que j'essaie d'assimiler) :)
tu cherche la valeur de ton item selectionné
sauf que tu concat avec c ,il te faut donc couper après le "-"
sauf que si je split(coupe) et que tu ai un autre "-" dans l'expression on aura un tableau et non une valeur string
d'autant plus que: va demander a vba toi de savoir quelle ou les quelles portion prendre:rolleyes:


donc !
avec mid(valeur,1,instrrev(valeur,"-")-1) j' obtient tout ce qui est avant le dernier"-"
un trim pour l'espace que tu a mis l'ors du concat

en suite
worksheetfunction.Match n'a pas de garde pour ces erreur quand c'est lancé et que il y a non match c'est bouing beep erreur!! et un gentil message :mad:

tandis qu'avec evaluate je peux tester l'erreur avec "iserror"en amont sans déclencher d'erreur

si l'evaluate n'est pas une erreur il te renvoie l'index de ligne c'est tout

voila
 

Axel19

XLDnaute Nouveau
Merci beaucoup pour ces précisions ! Je me cale ça dans un coin pour tester.

@JM27
A quel moment dois-je faire intervenir le tri ? Pour l'instant il est sur un bouton de commande.
Avant quoi faut-il le placer dans le code ? J'ai essayé plusieurs choses sans succès.
 

Discussions similaires

Statistiques des forums

Discussions
314 663
Messages
2 111 662
Membres
111 250
dernier inscrit
alinber