Manipulation des listbox

Stoopid

XLDnaute Nouveau
Bonjour,

J'ai créé une listbox multi-colonnes (4 ou 5), pouvant contenir un nombre important de données (dans mon cas, pour test, environ une cinquantaine de lignes), une barre de défilement se créer donc automatiquement.

Problème 1:

La première colonne est pré remplie.
En fonction des lignes sélectionnées, la macro remplit les autres colonnes
(boucle if ligne sélectionnée = True then...)

Certaines ligne ne sont pas remplies (les lignes non visibles).
En faisant descendre la barre de défilement et en relançant la macro ces lignes se remplissent.
On dirait donc un bug Excel, ce problème n'intervient que sur les lignes non visibles et en mode pas à pas aucun problème.

Une solution?


Problème 2:

Une macro permet de sélectionner ou de dé-sélectionner l'ensemble des lignes, par contre en mode manuel (pour ne sélectionner que certaines lignes), je ne parviens qu'à sélectionner les lignes les unes après les autres.

Est-il possible de modifier les propriétés de la listbox pour permettre une sélection de plusieurs lignes, par exemple en utilisant la touche shift du clavier, ou en faisant glisser la souris avec le clic gauche enfoncé?

Merci pour votre support ;)

ps: Pas de fichier à vous joindre en exemple dans l'immédiat (fichier sur le pc du taf, pas sous la main ce weekend...), désolé...
 

MichD

XLDnaute Impliqué
Re : Manipulation des listbox

Bonjour,

Le plus simple et rapide pour remplir une listbox ayant plusieurs colonnes et beaucoup de données :
En supposant que tu veuilles insérer les données des colonnes A à E de la feuil1 dans le textbox

VB:
Private Sub UserForm_Initialize()
Dim DerLig As Long, Rg As Range
With Worksheets("Feuil1")
    DerLig = .Range("A:E").Find(What:="*", _
                LookIn:=xlFormulas, _
                SearchOrder:=xlByRows, _
                SearchDirection:=xlPrevious).Row
    
    Set Rg = .Range("A1:E" & DerLig)
End With

With Me.ListBox1
    .RowSource = ""
    .ColumnCount = Rg.Columns.Count
    .ColumnWidths = "50;50;50;50;50"
    .Clear
    .List = Rg.Value
End With
End Sub


Problème II

En mode création, il y a la propriété du listbox : Multiselect tu as plus d'une possibilité
 

Stoopid

XLDnaute Nouveau
Re : Manipulation des listbox

Problème II

En mode création, il y a la propriété du listbox : Multiselect tu as plus d'une possibilité

Problème 2 résolu:
Merci, en effet c'est tout bête, j'étais en mode "simple", en mode "extended" cela semble fonctionner.

Reste le problème 1.
La première colonne est remplie d'une traite, à partir de données stockées dans une matrice.
Les autres colonnes ne doivent être remplies que si la ligne est sélectionnée, d'où l'utilisation d'une boucle IF.

Cette listbox est alimentée à partir de données sélectionnées dans 1 autre listbox et dans un combobox.
 

MichD

XLDnaute Impliqué
Re : Manipulation des listbox

Tu publies un petit fichier tout simple.

A ) Dans une plage de cellules le contenu qui devrait remplir le contrôle Listbox

B ) Que doit contenir le ListBox? Explique ce que tu veux faire exactement?
 

Stoopid

XLDnaute Nouveau
Re : Manipulation des listbox

Tu publies un petit fichier tout simple.

A ) Dans une plage de cellules le contenu qui devrait remplir le contrôle Listbox

B ) Que doit contenir le ListBox? Explique ce que tu veux faire exactement?

MichD je comprends ton code, je sais remplir une liste box, là n'est pas le problème.

Je vais essayer d'être synthétique:

Les ingrédients (tous dans le même userform):

- 1 combobox > tout plein de valeurs
- 1 listbox 2 colonnes > listbox titi> tout plein de valeur
- 1 listbox 4 colonnes > listbox grosminet > uniquement la première colonne (colonne 0) est remplie

La recette:

- sélectionner une ou plusieurs lignes de grosminet (mode multiselect)
- sélectionner 1 ligne de titi

cliquer sur le bouton "ajouter"

les valeurs de titi remplissent les colonnes 2 et 4 de grosminet

- sélectionner une ou plusieurs lignes de grosminet (mode multiselect)
- sélectionner la valeur souhaitée dans le combobox

cliquer sur le bouton "ajouter"

la valeur du combo est affectée à la colonne 3 de grosminet, pour toutes les lignes sélectionnées.

Parfois mon code fonctionne, parfois non (comme dit plus haut certaines lignes ne sont pas remplies) . En mode pas à pas il marche systématiquement.

Problème de mémoire ? (j'ai une mega matrice 5000 lignes x 300 colonnes en variant...)
Ce que je trouve bizarre c'est que les lignes non remplies sont uniquement des lignes non visibles.
 
Dernière édition:

MichD

XLDnaute Impliqué
Re : Manipulation des listbox

A ) Je suis bénévole! Aide-toi et le ciel t'aidera!

B ) Tu veux que je te ponde l'application qui va bien à ton problème + le code

C ) Je vais essayer d'être synthétique... regarde tout est là, avec un peu d'imagination!

Je passe la main à un plus vaillant!
 

Stoopid

XLDnaute Nouveau
Re : Manipulation des listbox

A ) Je suis bénévole! Aide-toi et le ciel t'aidera!

B ) Tu veux que je te ponde l'application qui va bien à ton problème + le code

C ) Je vais essayer d'être synthétique... regarde tout est là, avec un peu d'imagination!

Je passe la main à un plus vaillant!

;)

A) Et je te remercie de m'avoir accordé un peu de ton temps, grâce aux gens comme toi et avec un peu d'entraide, on avance.

B) L'application et le code sont déjà pondus, certes ça bug un peu... Mais ça tourne.

C) Sûr que la solution n'est pas loin, devant mon nez certainement, je ne désespère pas.
 
Dernière édition:

Stoopid

XLDnaute Nouveau
Re : Manipulation des listbox

Bon j'ai récupéré un bout de mon code, ce sera plus parlant que mon blabla qui embrouille:


VB:
Sub paste_mat()
With userform
    For i = 0 To .ListBox_grosminet.ListCount - 1
        If .ListBox_grosminet.Selected(i) = True Then .ListBox_grosminet.List(i, 2) = .ComboBox_mat
    Next
End With
End Sub

VB:
Sub paste_titi()
Dim titi_ As String
Dim titi_offset As Long
 
With userform
    For i = 0 To .ListBox_titi.ListCount - 1
        If .ListBox_titi.Selected(i) = True Then
            titi = .ListBox_titi.List(i)
            titi_offset = .ListBox_titi.List(i, 1)
        End If
    Next
    For i = 0 To .ListBox_grosminet.ListCount - 1
        If .ListBox_grosminet.Selected(i) = True Then
            .ListBox_grosminet.List(i, 1) = titi
            .ListBox_grosminet.List(i, 3) = titi_offset
        End If
    Next
End With
End Sub

Donc pour résumer, certaines des lignes non visibles à l'écran ne se remplissent pas. Je suis obligé de faire descendre la barre de défilement verticale de ma listbox et de relancer la macro pour remplir ces lignes.
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 691
Messages
2 090 998
Membres
104 724
dernier inscrit
Max.Jean.Noel