Listview Excel VBA Sélection Déselection cases à cocher
Bonsoir la communauté j'espère que vous allez bien.
Je me tourne vers vous car je beugue depuis 2 jours sur un truc. Etant juste intermédiaire en VBA, j'espère vraiment solliciter votre appui :)
Alors j'ai une Listview LV sur un userform qui est la suivante :
Voici tout d'abord le code que j'ai employé avant de vous expliquer ce dont j'ai besoin :
Private Sub ListView2_ItemCheck(ByVal Item As MSComctlLib.ListItem)
Application.Calculation = xlCalculationManual
Dim x, y As Integer
For x = 1 To Me.ListView2.ListItems.Count
If x = Item.Index Then
If ListView2.ListItems(x).Checked = False Then
If ListView2.ListItems(x).Selected = True Then
For y = 1 To Me.ListView2.ListItems.Count
If ListView2.ListItems(y).ListSubItems(1).Text = ListView2.ListItems(x).ListSubItems(1).Text Then
ListView2.ListItems(y).Checked = True
End If
Next y
End If
Else
If ListView2.ListItems(x).Selected = True Then
For y = 1 To Me.ListView2.ListItems.Count
If ListView2.ListItems(y).ListSubItems(1).Text = ListView2.ListItems(x).ListSubItems(1).Text Then
ListView2.ListItems(y).Checked = False
End If
Next y
End If
End If
End if
Next x
End Suble
ListSubItems(1) fait référence à la colonne N° FactureVoici la première situation :
En cochant un fournisseur en une seule fois, les lignes N°Facture identique à celle de la ligne cochée se cochent aussi automatiquement. là si je coche la première ligne, les autres en flèche rouge se coche aussi.
Ensuite :
En cochant une autre facture (ici en bleue), elle se coche aussi sans que les autres ne se décochent.
S'en suit :
en cliquant de nouveau sur la première case à cocher qui était cochée, elle se décoche, ainsi que les lignes avec son même N° facture.
Finalement :
Si je clique sur la dernière case à cocher qui était cochée, elle se décoche.
j'espère avoir été bien clair dans mon exposé du problème.
Dans l'attente de vous lire, je vous souhaite une agréable journée :)
Merci d'avance
Bonjour,
Ce n'est pas très clair mais je pense que tu souhaites :
Qu'en cochant un fournisseur, toutes ses factures soit cochées et que les autres fournisseurs soient décochés.
Si c'est le cas il faut supprimer toutes les sélections antérieures avant de procéder à la sélection finale.
Voici le code corrigé et simplifié. A voir si c'est ce que tu cherches.
Pour l'annulation des sélections, il faudra prévoir un bouton spécifique ou une autre méthode (via ListView2_Click() par exemple) car un nouveau clique sur un item déjà sélectionné ne désélectionne pas l'item.
Private Sub ListView2_ItemCheck(ByVal Item As MSComctlLib.ListItem)
Application.Calculation = xlCalculationManual ' ** Inutile
Dim x As Integer, y As Integer ' X était variant
With Me.ListView2
' Raz des sélections antérieures
For x = 1 To .ListItems.Count
.ListItems(x).Checked = False
Next x
' Maj de la sélection
For x = 1 To .ListItems.Count
If x = Item.Index Then
' Recherche des autres lignes du même fournisseur
' On reprend en début de liste (on va donc traiter l'item sélectionné)
For y = 1 To .ListItems.Count
If .ListItems(y).Text = .ListItems(x).Text Then ' Même fournisseur ?
' Oui : Même facture ?
If .ListItems(y).ListSubItems(1).Text = .ListItems(x).ListSubItems(1).Text Then
ListView2.ListItems(y).Checked = True
End If
End If
Next y
End If
Next x
.Refresh ' Raffraichit la liste
End With
End SubBonne journée
Eric
Bonjour Eric,
Merci beaucoup pour votre appui. En effet, en cochant et décochant je voudrais traiter les N°Facture identiques style je n'ai pas à les cocher/décocher 3 fois si j'ai ce N°facture sur trois lignes (je pense que l'objet ultime de VBA c'est de faciliter la manipulation des données :) ). Donc c'est bien les N°Facture c'est à dire la colonne 2 de la LV.
En effet, j'ai fait usage de bricoloage en faisant jouer une colonne additionnelle de la feuille source de la LV. La colonne CD et donc voici le code que j'ai maintenant et qui fonctionne parfaitement :
'Coche et décoche (X dans colonne CD de MVTPASSE)-------------------------------------------------
derlig = Sheets("MVTPASSE").Range("A" & Rows.Count).End(xlUp).Row
For x = 1 To Me.ListView2.ListItems.Count
If x = Item.Index Then
For i = 6 To derlig
If Sheets("MVTPASSE").Range("C" & i) = ListView2.ListItems(x).ListSubItems(1) Then 'Colonne C c'est le N° facture
If Sheets("MVTPASSE").Range("CD" & i) <> "X" Then ' Pas coché là
For y = 1 To Me.ListView2.ListItems.Count
If ListView2.ListItems(y).ListSubItems(1) = Sheets("MVTPASSE").Range("C" & i) Then
Sheets("MVTPASSE").Range("CD" & i) = "X" ' On coche
ListView2.ListItems(y).Checked = True
ListView2.ListItems(y).Selected = False
End If
Next y
ElseIf Sheets("MVTPASSE").Range("CD" & i) = "X" Then ' Là c'est coché
For y = 1 To Me.ListView2.ListItems.Count
If ListView2.ListItems(y).ListSubItems(1) = Sheets("MVTPASSE").Range("C" & i) Then
Sheets("MVTPASSE").Range("CD" & i) = "" ' On décoche
ListView2.ListItems(y).Checked = False
ListView2.ListItems(y).Selected = False
End If
Next y
End If
End If
Next i
End If
Next x:)
Y a t-il pas moyen d'une visualisation du code en format paysage ???
Tout est ok alors !
Tout est ok alors !
Bonjour
Y a t-il pas moyen d'une visualisation du code en format paysage ???
La fenêtre de code VBA peut être agrandie en largeur, en réduisant la fenêtre de gauche. En principe on évite les lignes de code trop longues.
Si on ne peut faire autrement, on utilise la touche underscore (le 8) précédée d'un espace pour continuer sur la ligne suivante.
Exemple
MsgBox "Texte du message xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" _
vbCritical, "Titre"A+
Merci Eric et désolé pour le retard je marque le sujet Résolu.
Bien à vous
Ok
Bonne journée