Repositionnement d'un Listview

GeoTrouvePas

XLDnaute Impliqué
Bonjour tout le monde !

A peine rentré de vacances, me voilà de nouveau contraint de vous solliciter.

J'explique mon cas :

- J'ai un Listview qui affiche une liste de chiffres répondant à un filtre défini par l'utilisateur
- Lorsque mon listview est vide, je passe sa propriété visible à False
- Lorsque mon listview n'est pas vide, je passe sa propriété visible à True

Mon soucis est que, lorsque je repasse cette propriété à True, la position du listview dans mon Userform n'est plus la même et ne correspond pas aux propriétés Top et Left de ce contrôle.

Je vous joints un fichier expemple pour vous permettre de tester.

Simple bug, opération du saint esprit ou subtilité que je n'aurai pas compris ???

Si quelqu'un peut me mettre sur la voie...

Merci d'avance à tous ! :)

P.S. : Pour tester rapidement, appliquer un premier seuil à 60 puis repasser le à 10 ensuite.
 

Pièces jointes

  • Test Listview.xls
    40 KB · Affichages: 80
Dernière édition:

Habitude

XLDnaute Accro
Re : Repositionnement d'un Listview

Il y a un bug d'affichage.

Lorsqu'on bouge la fenêtre du userform, la listview se repositionne correctement.

2 choix

Soit au lieu de cacher la listview, tu peux rapetisser le userform
Code:
If UserForm1.ListView1.ListItems.Count = 0 Then
    MsgBox "Il n'existe aucun chiffre répondant à vos critères"
    UserForm1.Height = 100
Else
    UserForm1.Height = 400
    MsgBox "UserForm1.ListView1.Top = " & UserForm1.ListView1.Top
    MsgBox "UserForm1.ListView1.Left = " & UserForm1.ListView1.Left
End If

Ou encore creer la listview en fonction des besoins

voir pj
 

Pièces jointes

  • Test Listview.zip
    20.2 KB · Affichages: 39
  • Test Listview.zip
    20.2 KB · Affichages: 42
  • Test Listview.zip
    20.2 KB · Affichages: 50

YANN-56

XLDnaute Barbatruc
Re : Repositionnement d'un Listview

Bonsoir GeoTrouvePas, habitude et à ceux qui passeront par ici,

La ListView est un contrôle particulier et capricieux!

Il faut seulement lui préciser son "Top" Et son "Left" à chaque action "Visible"
ou à la réinitialisation de l'USF.

Pour info, sauf si plus ample informé...

Amicalement,

Yann
 

GeoTrouvePas

XLDnaute Impliqué
Re : Repositionnement d'un Listview

Merciiiiiiiiiiiiiii !

Effectivement ce @#"%! de contrôle listview bug !

Par contre Yann, juste pour info (et pour chipoter :D), lui rappeler son top et son left ne fonctionne pas vraiment, il faut les modifier pour lui rafraichir la mémoire. J'ai donc fait :

Code:
    UserForm1.ListView1.Top = UserForm1.ListView1.Top + 1
    UserForm1.ListView1.Top = UserForm1.ListView1.Top - 1

Merci à vous deux pour vos réponses qui vont bien m'aider (même si ce @#"%! de contrôle listview m'oblige à faire un genre de code pas très propre que je déteste :D)

Bonne soirée à vous !!!
 

YANN-56

XLDnaute Barbatruc
Re : Repositionnement d'un Listview

Re Chipoteur,

J'ai bien dit: "Lui préciser" et non lui Rappeler"... Et toc! :D :D

Genre:

Code:
With Me.ListView1: .Top = 20: .Left = 6: End With
(Code non salissant!)

Mais chacun fait ce qu'il veut! :)

Amicalement

Yann
 
Dernière édition:

GeoTrouvePas

XLDnaute Impliqué
Re : Repositionnement d'un Listview

J'ai bien dit: "Lui préciser" et non lui Rappeler"... Et toc!

Mais c'est qu'est ce que je dis ! :p

Il est bien là le problème. Si le listview avait un top de 20 à l'origine, tu es obligé de modifier ce top puis de lui redonner sa valeur d'origine en faisant par exemple :

Code:
With Me.ListView1: 
    .Top = 19
    .Top = 20
End With

Si on se contente de lui rappeler que "top = 20", cela ne rafraichi pas les propriétés du listview et il continue à être affiché comme si "top = 0".

(Code non salissant!)

Oui c'est pas salissant mais ça m'énerve de devoir faire des bidouilles comme ça. Quoi que pour une fois, je me suis pas pris la tête à cause d'une de mes fautes de frappe, ça change :p

Bien amicalement mon très cher Yann,

Je te souhaite une bonne journée et encore merci pour ton coup de main.
 

YANN-56

XLDnaute Barbatruc
Re : Repositionnement d'un Listview

Bonjour GeoTrouvera

Il est bien là le problème. Si le listview avait un top de 20 à l'origine, tu es obligé de modifier ce top puis de lui redonner sa valeur d'origine

Non!Non!Non!!!

Il y a certainement quelque chose que toi ou moi n'avons pas pigé.

Je vais regarder ton fichier joint pour mieux comprendre,
et l'adapter s'l n'est pas trop farci de variables du genre "lkugvbstr"

A plus.

Yann
 

GeoTrouvePas

XLDnaute Impliqué
Re : Repositionnement d'un Listview

Non!Non!Non!!!
Je ne veux pas prendre un verre ! Non!Non!Non!!!.......
Roooooooo elle est honteuse celle là. Je cours me cacher :p


Pourtant c'est bien ce que j'ai remarqué Yann.

Le Top initial du Listview est de 144. Si je modifie les conditions d'affichage comme ceci :

Code:
If UserForm1.ListView1.ListItems.Count = 0 Then
    UserForm1.ListView1.Visible = False
Else
    UserForm1.ListView1.Visible = True
    UserForm1.ListView1.Top = 144
End If

ça ne change rien. L'affichage bug toujours.

Par contre si je le modifie comme celà, ça marche :

Code:
If UserForm1.ListView1.ListItems.Count = 0 Then
    UserForm1.ListView1.Visible = False
Else
    UserForm1.ListView1.Visible = True
    UserForm1.ListView1.Top = 143
    UserForm1.ListView1.Top = 144
End If

Le Listview s'affiche de nouveau au bon endroit. Pour moi ça veut bien dire qu'il faut modifier le Top et non simplement le rappeler pour que la position du Listview soit rafraichie.

Obtiens tu le même résultat chez toi ???
 

YANN-56

XLDnaute Barbatruc
Re : Repositionnement d'un Listview

Re

Dans ta Macro:

Code:
Sub RemplirListview()
With UserForm1.ListView1

Ajouter seulement:

Code:
Sub RemplirListview()
With UserForm1.ListView1
.Top = 20: .Left = 6

Et quand il y a un souci quant au contenu:
Code:
.Refresh
est quelquefois utile!

Au plaisir.

Yann
 

GeoTrouvePas

XLDnaute Impliqué
Re : Repositionnement d'un Listview

Bon je vais faire le casse bonbons :p (pitié pas taper ! pitié pas taper !) mais ça ne marche pas si l'on se contente de rajouter :

Code:
.Top = 20: .Left = 6

ou même si l'on fait un refresh. En fait ça marche une fois mais pas 2. Le top initial étant à 144, lors de la première "réapparition" du Listview, le top passe à 20 et du coup affichage normal. Mais lors de la 2ème "réapparition", il passe de 20 à 20 et ne s'affiche donc pas correctement. Enfin en tout cas pas chez moi (Excel 2002).

Par contre avec macro, ça marche puisqu'elle modifie le Top à chaque "réapparition" :

Code:
Sub RemplirListview()

With UserForm1.ListView1
   .ListItems.Clear
    
    With .ColumnHeaders
        .Clear
        .Add , , "N° choisis", 85
    End With
    
    i = 1
    
    While ThisWorkbook.Sheets("Feuil1").Range("Maplage").Item(i, 1) <> ""
               
        If ThisWorkbook.Sheets("Feuil1").Range("Maplage").Item(i, 1).Value <= CDbl(UserForm2.TextBox1.Text) Then
            GoTo LigneSuivante
        End If
        
        .ListItems.Add , "a" & i, ThisWorkbook.Sheets("Feuil1").Range("Maplage").Item(i, 1)

LigneSuivante:
        
        i = i + 1
        
    Wend
    
    .View = lvwReport

If .ListItems.Count = 0 Then
    .Visible = False
Else
    .Visible = True
    [COLOR="Red"].Top = 143
    .Top = 144[/COLOR]
End If

End With

End Sub

Enfin bon, on va pas chipoter là dessus toute la journée :p
Ta petite info sur ce bug m'a bien aidée, je crois que sans ça, je serai encore en train de chercher d'où ça venait (à condition que je n'ai pas déjà éclater mon pc :p)
 

Habitude

XLDnaute Accro
Re : Repositionnement d'un Listview

Je crois quand même que de créer et liste vide pour ensuite la masquer n'est pas du bon code.
Encore moins avec un msgbox très lourd point de vue usager.

Pour ne pas juste afficher le message dans la listview ?
Ou encore comme l'exemple que j'ai donné.
Crée la liste seulement si besoin il y a.
 

GeoTrouvePas

XLDnaute Impliqué
Re : Repositionnement d'un Listview

Bonjour Habitude,

Je crois quand même que de créer et liste vide pour ensuite la masquer n'est pas du bon code.

C'est pas faux mais c'est difficilement réalisable avec mon fichier "réel". En fait j'utilise une dizaine de fichiers comme source de mon listview. J'ai donc créé une boucle pour :

1) Ouvrir le premier fichier
2) importer dans mon listview les lignes qui répondent à mes critères
3) Fermer le fichier et passer au suivant

A la suite de ça, je vérifie si mon listview n'est pas vide et je choisi de l'afficher ou pas.

Compte tenu du fait que les données sont externes, je ne voulais pas commencer par ouvrir chaque fichier pour tester si des lignes correspondaient à mes critères de sélection avant de charger mon listview.

Encore moins avec un msgbox très lourd point de vue usager.

Le msgbox n'était là que pour mes tests. J'en ai mis le moins possible dans mon application car moi aussi ça m'irrite beaucoup à l'usage :p

Pour ne pas juste afficher le message dans la listview ?

Ben euh parce que je savais pas faire ^^ En tout cas je ne savais pas comment affiché ce message en grand et en plein milieu du listview.

Bonjour Pierrot93,

cette même "listview" positionnée dans un conteneur, en l'occurence un "frame" ne bouge plus... peut être une solution..@+

Carrément oui ! Je n'y aurais pas pensé, bien vu l'artiste ! :p
En naviguant hier soir, j'ai vu que les premières versions du contrôle listview souffraient de quelques bug de ce genre là. Des MaJ ont été faites mais je ne peux pas savoir si les postes sur lesquels tournera mon application seront à jour ou pas.

Heureusement que vous étiez là tous les trois pour trouver une soluce.

Bonne soirée à vous et encore merci !
 

Discussions similaires

Statistiques des forums

Discussions
312 676
Messages
2 090 804
Membres
104 670
dernier inscrit
Djnic30