Microsoft 365 Erreur code : Control Listbox

Blaster

XLDnaute Nouveau
Bonjour à tous,

Je ne comprends pas pourquoi le code ci-dessous ne fonctionne pas avec mon Listbox.
Le système me retourne une erreur d'exécution 381 : Impossible de définir la propriété List. Index de table de propriétés non valide

VB:
Private Sub UserForm_Initialize()
Dim i As Integer

Me.ListBox1.ColumnCount = 5

For i = 2 To 10
Me.ListBox1.AddItem

Me.ListBox1.List(i, 0) = Sheets("Feuil1").Cells(i, 1)
Me.ListBox1.List(i, 1) = Sheets("Feuil1").Cells(i, 2)
Me.ListBox1.List(i, 2) = Sheets("Feuil1").Cells(i, 3)
Me.ListBox1.List(i, 3) = Sheets("Feuil1").Cells(i, 4)
Me.ListBox1.List(i, 4) = Sheets("Feuil1").Cells(i, 5)

Next i

End Sub


Je suis preneur de toute idée.

Merci par avance,
 
Dernière modification par un modérateur:

Phil69970

XLDnaute Barbatruc
Bonjour @Blaster

Une piste en passant sur la manière de compter 0 à 4 ==> 5 et 0 à 5 ==> 6

1649692317645.png


@Phil69970
 

Hasco

XLDnaute Barbatruc
bonsoir

Les indices de box (combo ou list) commencent à 0 pas à 2.
VB:
Dim i As Integer
    With Me.ListBox1
        .ColumnCount = 5

        For i = 2 To 10
            .AddItem
            .List(i - 2, 0) = Sheets("Feuil1").Cells(i, 1)
            .List(i - 2, 1) = Sheets("Feuil1").Cells(i, 2)
            .List(i - 2, 2) = Sheets("Feuil1").Cells(i, 3)
            .List(i - 2, 3) = Sheets("Feuil1").Cells(i, 4)
            .List(i - 2, 4) = Sheets("Feuil1").Cells(i, 5)

        Next i
    End With

cordialement
 

ChTi160

XLDnaute Barbatruc
Bonsoir Blaster
Peut être avec un truc du genre
VB:
With Me.ListBox1
  .AddItem Sheets("Feuil1").Cells(i, 1)
  .List(.LisCount-1, 1)=Sheets("Feuil1").Cells(i, 2)
  .List(.LisCount-1, 2)=Sheets("Feuil1").Cells(i, 3)
  .List(.LisCount-1, 3)=Sheets("Feuil1").Cells(i, 4)
  .List(.LisCount-1, 4)=Sheets("Feuil1").Cells(i, 5)
End With
Depuis mon téléphone (non testé)
Jean marie
 

Blaster

XLDnaute Nouveau
Bonjour à tous,
@job75 merci pour ta réponse j'ai opté pour cette solution car je souhaite filtrer les données dans ma Listbox et ne pas forcément afficher toutes les lignes.

D'ailleurs quand j'ajoute une condition je rencontre à nouveau le même problème, je pense ne pas avoir tout compris



VB:
Sub Load_Listbox1()
Form1.ListBox1.Clear
Dim i, Der_Ligne As Integer

Form1.ListBox1.ColumnCount = 5
Form1.ListBox1.ColumnWidths = "90;30;235;60;50"

    With Form1.ListBox1
        .ColumnCount = 5

 For i = 1 To Feuil1.Range("a10000").End(xlUp).Row
 
       If Form1.ComboBox1 = Feuil1.Cells(i, 1).Value Then
    
            .AddItem
            .List(i - 1, 0) = Feuil1.Cells(i + 1, 1)
            .List(i - 1, 1) = Feuil1.Cells(i + 1, 2)
            .List(i - 1, 2) = Feuil1.Cells(i + 1, 3)
            .List(i - 1, 3) = Feuil1.Cells(i + 1, 4)
            .List(i - 1, 4) = Feuil1.Cells(i + 1, 5)
      Else
      End If
     
    Next i
    End With
 
End Sub




un nouvel éclairage serait grandement apprécié, à toutes fins utile vous trouverez joint un fichier exemple.
 

Pièces jointes

  • TEST 2.xlsm
    19.6 KB · Affichages: 1
Dernière édition:

Hasco

XLDnaute Barbatruc
Bonjour,

Il semble manquer quelque chose dans votre fichier... Non ?

Si par votre test vous 'sautez' un .Additem (quand Form1.ComboBox1 = Feuil1.Cells(i, 1).Value donne FALSE) vous sautez un index également donc votre i-1 ne correspond plus au dernier indice de liste.


Solution dissocier votre compteur de boucle (i) de l'indice de liste.

VB:
Dim idx As Integer
    For i = 1 To 10
      
        If Form1.Cbx_Bénéficiaire = Bénéficiaire Then
            .AddItem
            idx = .ListCount - 1    ' dernier indice (créé par .Additem)
            .List(idx, 0) = Feuil1.Cells(i + 1, 1)
            .List(idx, 1) = Feuil1.Cells(i + 1, 2)
            .List(idx, 2) = Feuil1.Cells(i + 1, 3)
            .List(idx, 3) = Feuil1.Cells(i + 1, 4)
            .List(idx, 4) = Feuil1.Cells(i + 1, 5)
        Else

        End If

    Next i

Cordialement
 
Dernière édition:

ChTi160

XLDnaute Barbatruc
Bonsoir le Fil
une question (pour ma culture personnelle) Lol
pourquoi mettre :
VB:
If Form1.Cbx_Bénéficiaire = Bénéficiaire Then
            .AddItem
            idx = .ListCount - 1    ' dernier indice (créé par .Additem)
            .List(idx, 0) = Feuil1.Cells(i + 1, 1)
et ne rien mettre à Additem
Pour ensuite y mettre une valeur !
Code:
  .List(idx, 0) = Feuil1.Cells(i + 1, 1)
'.List(idx, 0) étant la première Colonne de la Ligne Créée
Exemple :
Code:
.AddItem  Feuil1.Cells(i + 1, 1)
Merci par avance
Bonne fin de Journée
Jean marie
 

Blaster

XLDnaute Nouveau
Bonjour à tous,

@ChTi160 me concernant j'ai toujours procédé de cette manière mais je prends note de cette possibilité

Je me permets de vous solliciter à nouveau, le code fonctionne correctement par contre quand j'ajoute une double condition comme ci-dessous plus rien ne fonctionne.

C'est comme si le contenu des combobox n'était pas pris en compte (cf.fichier joint)

VB:
Sub Load_Listbox1()
Form1.ListBox1.Clear

Form1.ListBox1.ColumnCount = 5
Form1.ListBox1.ColumnWidths = "90;30;235;60;50,25"

    With Form1.ListBox1
        .ColumnCount = 5

 For i = 1 To Feuil1.Range("a10000").End(xlUp).Row
 
       If Form1.ComboBox1 = Feuil1.Cells(i, 1) And Form1.ComboBox2 = Feuil1.Cells(i, 2) Then
            
            .AddItem
             y = .ListCount - 1   ' dernier indice (créé par .Additem)
            
            .List(y, 0) = Feuil1.Cells(i, 1)
            .List(y, 1) = Feuil1.Cells(i, 2)
            .List(y, 2) = Feuil1.Cells(i, 3)
            .List(y, 3) = Feuil1.Cells(i, 4)
            .List(y, 4) = Feuil1.Cells(i, 5)
            .List(y, 5) = i  'Stockage du numéro de ligne pour fonction suppression
      Else
      End If
        
    Next i
    End With
 
End Sub
 

Pièces jointes

  • TEST 2.xlsm
    21.5 KB · Affichages: 2

Hasco

XLDnaute Barbatruc
Bonjour,

En matière de comparaison, il faut comparer ce qui est comparables ou ne pas mélanger les serviettes et les torchons :)

La valeur d'un combobox est toujours un string et vos années sont des nombres. C'est là l'erreur.
Dans le fichier joint, j'ai changé le nom 'DATE' en 'DATES' car DATE est un mot réservé de vba (donne la date du jour). Du coup j'ai également changé 'NOM' en 'NOMS' ce qui est plus logiques (nous avons des liste d'itemS et pas un seul item).

Déjà la dernière fois, je ne comprenais pas pourquoi vous mettiez votre procédure de chargement de la listBox dans un module général et pas dans le module du userForm.
Je l'ai donc déménagé dans le module du userform.

Il est préférable de mettre les valeurs à chercher dans des variables, plutôt que demander à vba de ressortir la propriété des combo à chaque test if.... de la boucle for. De plus en mode debogage c'est plus facile de voir ce qu'elles contiennent.

Cordialement
 

Pièces jointes

  • TEST 2.xlsm
    26.6 KB · Affichages: 2

Blaster

XLDnaute Nouveau
@Hasco merci infiniment pour votre aide, j'aurais pu chercher pendant des heures.
j'étais loin du compte. Je prends note de vos conseils sur l'organisation du code.

Je me permets de continuer à solliciter vos conseils.

J'ai développé une fonction suppression qui n'apparait pas dans le fichier joint, elle me permet de supprimer une ligne dans la feuille base de données de puis la listbox.

Pour ce faire, je stock le numéro de la ligne dans une cellule de la listbox que je récupère au moment de la supression :

Stockage :
Code:
.List(y, 5) = i  'Stockage du numéro de ligne pour fonction suppression

Lecture et supression :
Code:
Ligne = ListBox1.List(ListBox1.ListIndex, 5)

If MsgBox("Êtes-vous sûr de vouloir supprimer cette ligne ?", vbYesNo, "Confirmation suppression") = vbYes Then

Feuil1.Rows(Ligne).Delete

Load_Listbox1

Pensez que ce soit la méthode la plus adaptée ?
 

Discussions similaires

Statistiques des forums

Discussions
298 770
Messages
1 971 598
Membres
203 411
dernier inscrit
Marc1515