XL 2013 VBA Listbox et tableaux : impossible de créer boucle sur éléments Listbox

agourn

XLDnaute Junior
Bonjour à tous,
Après avoir rempli ma Listbox avec un tableau, dépendant des cas, je peux avoir des lignes vises. Je veux les supprimer. Impossible de faire fonctionner une boucle sur les éléments de la Listbox pour supprimer la ligne selon un critère, comme celui de ligne vide ou ligne commençant par un élément de la colonne 0 vide.
C’est une Listbox à 7 colonne. mais je ne boucle que sur les lignes.


Code:
            MaListbox.List = tableau1
            Nb_List=MaListbox.ListCount
'               For ii = 0 To Nb_List - 1   
'                           xx = MaListbox.List(ii)
'                           MsgBox xx
'                          If xx = "" MaListbox.RemoveItem (ii) ' (ou MaListbox.ListIndex) 
'             Next ii
je traite beaucoup de Listbox avec uniquement des tableaux (pas de range Excel), y a-t-il un moyen fiable de boucler en lignes et colonnes ?
merci de votre aide
 
Solution
re
VB:
Merci patricktoulon. ça marche effectivement avec Malistbox.List(ii,0). Bizarre que ça ne marche pas avec MaListbox.List(ii) quand on veut appliquer Removeitem alors que l'instruction xx=MaListbox.List(ii) marche.
non pas bizarre du tout c'est meme normal et tant mieux je dirais ça t’évite de faire des erreurs
quand tu a une listbox multicolonne
et quand tu fait malistbox(ii) il est difficile pour vba de savoir de quoi tu parle ii OUI!! mais quelle colonne si on veux utiliser la colonne 0 (la première) on utilise le .value a condition qu'il y est un item de sélectionner
mais ton problème plus important était le fait qu'il fallait faire la boucle a reculons et non l'inverse
for ii= 0 to NB_List-1--->> PAS BIEN...

pierrejean

XLDnaute Barbatruc
Bonjour agourn
salut jmfmarques
Je te propose la fonction suivante qui permet de vider un tableau de ses lignes vides
VB:
Function vider(tablo)
ReDim tabres(1 To UBound(tablo, 2), 0)
For n = LBound(tablo, 1) To UBound(tablo, 1)
  For m = LBound(tablo, 2) To UBound(tablo, 2)
     tot = tot & tablo(n, m)
  Next
  If tot <> "" Then
    For m = LBound(tablo, 2) To UBound(tablo, 2)
     tabres(m, UBound(tabres, 2)) = tablo(n, m)
    Next
    ReDim Preserve tabres(1 To UBound(tablo, 2), UBound(tabres, 2) + 1)
  End If
  tot = ""
Next
vider = Application.Transpose(tabres)
End Function
 

patricktoulon

XLDnaute Barbatruc
Bonjour
je m’abstiendrais de dire qu'il est préférable de travailler sur une variable tableau ;) :p
par contre si tu tiens a travailler toujours sur ta listbox pour supprimer des items pour une raison ou une autre il te faut boucler a l'envers ( sujet récurrent)car quand tu supprime un item les autres remontent et donc l'indexation des items ne correspondent plus dès la première suppression

exemple
suppression de lignes dans la listbox si la colonne(0) est vide en reprenant la base de ton code

MaListbox.List = tableau1
Nb_List=MaListbox.ListCount
For ii = Nb_List-1 to 0 step -1
If MaListbox.list(ii,0)="" then MaListbox.RemoveItem (ii)
Next ii
 

patricktoulon

XLDnaute Barbatruc
et et toujours sur ta listbox mais pour les lignes completes et vides
VB:
With malistbox
    Dim ii&, c&, T$
    .List = tableau1
    Nb_List = .ListCount
    For ii = Nb_List - 1 To 0 Step -1
        T = "": For c = 0 To .columncount-1: T = T & .List(ii, c): Next
        If Trim(T) = "" Then .RemoveItem (ii)
    Next ii
End With
 

agourn

XLDnaute Junior
Bonjour
je m’abstiendrais de dire qu'il est préférable de travailler sur une variable tableau ;) :p
par contre si tu tiens a travailler toujours sur ta listbox pour supprimer des items pour une raison ou une autre il te faut boucler a l'envers ( sujet récurrent)car quand tu supprime un item les autres remontent et donc l'indexation des items ne correspondent plus dès la première suppression

exemple
suppression de lignes dans la listbox si la colonne(0) est vide en reprenant la base de ton code

MaListbox.List = tableau1
Nb_List=MaListbox.ListCount
For ii = Nb_List-1 to 0 step -1
If MaListbox.list(ii,0)="" then MaListbox.RemoveItem (ii)
Next ii
Merci patricktoulon. ça marche effectivement avec Malistbox.List(ii,0). Bizarre que ça ne marche pas avec MaListbox.List(ii) quand on veut appliquer Removeitem alors que l'instruction xx=MaListbox.List(ii) marche.
re
comme je l ' ai dis plus haut
non le code ne peut pas fonctionner espace ou pas!!
la boucle suppression doit impérativement commencer par le listcount-1 et non 0 pour des raisons évidentes citées plus haut ;)
C'est clair. Merci patricktoulon.
 

patricktoulon

XLDnaute Barbatruc
re
VB:
Merci patricktoulon. ça marche effectivement avec Malistbox.List(ii,0). Bizarre que ça ne marche pas avec MaListbox.List(ii) quand on veut appliquer Removeitem alors que l'instruction xx=MaListbox.List(ii) marche.
non pas bizarre du tout c'est meme normal et tant mieux je dirais ça t’évite de faire des erreurs
quand tu a une listbox multicolonne
et quand tu fait malistbox(ii) il est difficile pour vba de savoir de quoi tu parle ii OUI!! mais quelle colonne si on veux utiliser la colonne 0 (la première) on utilise le .value a condition qu'il y est un item de sélectionner
mais ton problème plus important était le fait qu'il fallait faire la boucle a reculons et non l'inverse
for ii= 0 to NB_List-1--->> PAS BIEN
FOR NB_List-1 to 0 -->> BIEN
 

agourn

XLDnaute Junior
Bonjour agourn
salut jmfmarques
Je te propose la fonction suivante qui permet de vider un tableau de ses lignes vides
VB:
Function vider(tablo)
ReDim tabres(1 To UBound(tablo, 2), 0)
For n = LBound(tablo, 1) To UBound(tablo, 1)
  For m = LBound(tablo, 2) To UBound(tablo, 2)
     tot = tot & tablo(n, m)
  Next
  If tot <> "" Then
    For m = LBound(tablo, 2) To UBound(tablo, 2)
     tabres(m, UBound(tabres, 2)) = tablo(n, m)
    Next
    ReDim Preserve tabres(1 To UBound(tablo, 2), UBound(tabres, 2) + 1)
  End If
  tot = ""
Next
vider = Application.Transpose(tabres)
End Function
Merci pierrejean. C'est aussi une très bonne piste pour ne plus à manipuler les listbox. Je testerai.
 

Discussions similaires

Statistiques des forums

Discussions
311 540
Messages
2 080 523
Membres
101 234
dernier inscrit
Layani89