Excel adaptation de code

Résolu
Bonjour à tous,
Dans un userform j'ai:
1 combobox nommé : CB_cherche_remise
1 listbox nommé : ListBox_remise
et j'utilise la feuille : Cheques

Le combobox est rempli avec les valeurs de la colonne "E" de la feuille "Cheques"
Lors de la sélection d'une valeur du combobox, le code fais une recherche de la valeur dans la colonne "E" et affiche les lignes concernées dans la listbox.

Pour ce faire j'ai adapté un code de Pijaku issu du forum
https://forums.commentcamarche.net/forum/affich-23779940-listbox-recherche

Voici l'adaptation:
Remplissage de la combobox
Private Sub UserForm_Initialize()
With Sheets("Cheques")
For j = 3 To .Range("B" & Rows.Count).End(xlUp).Row
CB_cherche_remise = .Range("E" & j)
'...et filtre les doublons
If CB_cherche_remise.ListIndex = -1 Then CB_cherche_remise.AddItem .Range("E" & j)
Next j
End With
End Sub


Affichage dans la listbox sur combobox_change
Private Sub CB_cherche_remise_Change()
Dim Col As Byte
Dim Lign As Long, DrLig As Long
If CB_cherche_remise = "" Then Exit Sub
ListBox_remise.Clear
With Sheets("Cheques")
DrLig = .Range("A" & Rows.Count).End(xlUp).Row
For Lign = 1 To DrLig
If .Cells(Lign, 5) = CB_cherche_remise Then
ListBox_remise.AddItem .Cells(Lign, 1)
For Col = 1 To 4
ListBox_remise.List(ListBox_remise.ListCount - 1, Col) = .Cells(Lign, Col + 1)
Next Col
End If
Next Lign
End With
ListBox_remise.ColumnCount = 5
ListBox_remise.ColumnWidths = "100;100;100;100;100"
'format euro sur colonne montant
For i = 0 To ListBox_remise.ListCount - 1
ListBox_remise.List(i, 2) = Format(ListBox_remise.List(i, 2), "0.00 €")
Next i
End Sub


Quand je fais ce code en affichant 5 colonnes tout va bien, mais quand je veux afficher 15 colonnes, il ne marche pas (For Col = 1 To 14)
Erreur d'exécution '380':
Impossible de définir la propriété List. Valeur de propriété non valide


Merci pour votre aide :)

5 réponses

  1. Modérateur
    Bonjour,

    Puisqu'il est question de moi...
    1- pas de monsieur stp...
    2- Tu as mal adapté!

    Le nombre de colonnes de ta listbox doit être défini à l'initialisation de ton Userform. Donc dans la procédure UserForm_Initialize.

    Tu dis vouloir 15 colonnes, mais tu n'en met que 5 (ça va marcher beaucoup moins bien ...) :
    ListBox_remise.ColumnCount = 5
    ListBox_remise.ColumnWidths = "100;100;100;100;100"


    Alors :
    Remplissage de la combobox

    Private Sub UserForm_Initialize()
    With Sheets("Cheques")
        For j = 3 To .Range("B" & Rows.Count).End(xlUp).Row
            CB_cherche_remise = .Range("E" & j)
            '...et filtre les doublons
            If CB_cherche_remise.ListIndex = -1 Then CB_cherche_remise.AddItem .Range("E" & j)
        Next j
    End With
    'HUM HUM !!! ICI
    With ListBox_remise
        .ColumnCount = 15 '15 COLONNES!!!!
        .ColumnWidths = "40;40;40;40;40;40;40;40;40;40;40;40;40;40;40"
    End With
    End Sub


    Affichage dans la listbox sur combobox_change

    Private Sub CB_cherche_remise_Change()
    Dim Col As Byte
    Dim Lign As Long, DrLig As Long
    If CB_cherche_remise = "" Then Exit Sub
    ListBox_remise.Clear
    With Sheets("Cheques")
        DrLig = .Range("A" & Rows.Count).End(xlUp).Row
        For Lign = 1 To DrLig
            If .Cells(Lign, 5) = CB_cherche_remise Then
                ListBox_remise.AddItem .Cells(Lign, 1)
                For Col = 1 To 14
                ListBox_remise.List(ListBox_remise.ListCount - 1, Col) = .Cells(Lign, Col + 1)
                Next Col
            End If
        Next Lign
    End With
    'format euro sur colonne montant
    For i = 0 To ListBox_remise.ListCount - 1
        ListBox_remise.List(i, 2) = Format(ListBox_remise.List(i, 2), "0.00 €")
    Next i
    End Sub
    0
    1. Oui en effet je me suis "légèrement" trompé ^^ (me tape sur la caboche)
      Rectifications faites

      Néanmoins l'erreur persiste et elle me colore la ligne lors du débogage
      ListBox_remise.List(ListBox_remise.ListCount - 1, Col) = .Cells(Lign, Col + 1)

      toujours avec le même message d'erreur
      0
      1. Modérateur
        Peux tu refaire passer ton fichier?
        0
    2. Le voici

      Le code est dans l'userform Usf_cherche_remise
      par activation du userform via la feuille data, il faut passer par le bouton rechercher un numéro de remise dans l'onglet "remise de chèques".

      https://www.cjoint.com/?0Jpndavy630

      Merci encore une fois de m'aider
      0
      1. Modérateur
        Bon il y avait deux problèmes :
        - la listbox se modifiait à chaque changement de ligne de la combobox lors du chargement
        => résolu par l'ajout d'une variable booléenne

        - on ne peut pas modifier plus de 10 colonnes par la propriété List d'une ListBox...
        Du moins pas comme je te l'ai montré...

        Il a fallut ruser, mais ceci semble fonctionner.

        Code complet de ton UserForm :

        Dim LaComboChange As Boolean
        
        Private Sub CB_cherche_remise_Change()
        'Dim Col As Byte
        Dim mesDonnees(), k As Long, Liste '()
        Dim Lign As Long, DrLig As Long, maLigne As Long
        If CB_cherche_remise = "" Or LaComboChange = True Then Exit Sub
        ListBox_remise.Clear
        With Sheets("Cheques")
            DrLig = .Range("A" & Rows.Count).End(xlUp).Row
            For Lign = 1 To DrLig
                If .Cells(Lign, 5) = CB_cherche_remise Then
                    k = k + 1
                    maLigne = Lign
                    ReDim Preserve mesDonnees(1 To 15, 1 To k)
                    'ListBox_remise.AddItem .Cells(Lign, 1)
                    For Col = 1 To 15
                    'ListBox_remise.List(ListBox_remise.ListCount - 1, Col) = .Cells(Lign, Col + 1)
                        mesDonnees(Col, k) = .Cells(Lign, Col)
                    Next Col
                End If
            Next Lign
            If UBound(mesDonnees, 2) = 1 Then
                Liste = .Range("A" & maLigne & ":O" & maLigne)
                ListBox_remise.List = Liste
                ListBox_remise.List(0, 2) = Format(ListBox_remise.List(0, 2), "0.00 €")
            Else
                Liste = Application.Transpose(mesDonnees)
                ListBox_remise.List = Liste
                'format euro sur colonne montant
                For i = 0 To ListBox_remise.ListCount - 1
                    ListBox_remise.List(i, 2) = Format(ListBox_remise.List(i, 2), "0.00 €")
                Next i
            End If
        End With
        End Sub
        
        Private Sub UserForm_Initialize()
        LaComboChange = True
        With Sheets("Cheques")
            For j = 3 To .Range("B" & Rows.Count).End(xlUp).Row
                CB_cherche_remise = .Range("E" & j)
                '...et filtre les doublons
                If CB_cherche_remise.ListIndex = -1 Then CB_cherche_remise.AddItem .Range("E" & j)
            Next j
        End With
        LaComboChange = False
        With ListBox_remise
            .ColumnCount = 15
            .ColumnWidths = "40;40;40;40;40;40;40;40;40;40;40;40;40;40;40"
        End With
        End Sub
        0
    3. Bonjour a vous deux,

      listbox: 10 colonnes maxi de 0 a 9

      bye
      0
      1. Modérateur
        Salut,

        Excuse moi je n'avais pas vu ta réponse...
        En effet, 10 colonnes maxi de 0 a 9 !
        J'ai du me gratter la tête et google pour trouver ça et une solution...
        0
    4. Encore un grand merci pijaku et f894009
      Merci d'avoir prie le temps de m'aider pijaku, je n'aurai pas trouvé comment adapté de cette façon.
      Tout marche a merveille :)
      0