Afficher List en fonction d'une condition!

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Provence Vintage

XLDnaute Occasionnel
Bonjour,

Dans une colonne, ("AL"), d'une bdd, j'ai des valeurs = "Oui" ou ""
Je cherche si "Oui" à afficher une list avec pour résultats, les lignes correspondantes à "Oui" suivant deux colonnes: Col B et Col D!

C'est plutôt hard quand on débute!!!!
Merci à toutes et tous😱

Bonne journée
 

Pièces jointes

Re : Afficher List en fonction d'une condition!

Bonjour Provence Vintage, bonjour le forum,

Je te propose le code suivant :
Code:
Private Sub UserForm_Initialize()
Dim cel As Range 'déclare la variable cel
 
With Me.ListBox1 'prend en compte la ListBox1
    .ColumnCount = 3 'attribut le nombre de colonnes
    .ColumnWidths = "90;120;0" 'définit la largeur des colonne (la 3ème ne sera pas affichée)
End With 'fin de la prise en compte de la ListBox1
 
With Sheets("Data") 'prend en compte l'onglet "Data"
    For Each cel In .Range("AL3:AL" & .Range("AL65536").End(xlUp).Row) 'boucle sur toute les cellules éditée de la colonne AL
        If cel.Value = "Oui" Then 'condition : si la cellule contient "Oui"
            Me.ListBox1.AddItem cel.Offset(0, -36).Value 'ajoute à la ListBox1 la donnée en colonne B (colonne 0 de la listbox)
            Me.ListBox1.Column(1, ListBox1.ListCount - 1) = cel.Offset(0, -34).Value 'ajoute à la ListBox1 la donnée de la colonne D (colonne 1 de la listBox)
            Me.ListBox1.Column(2, ListBox1.ListCount - 1) = cel.Row 'Ajoute à la ListBox1 le numéro de ligne de la donnée (Colonne 2 (masquée) de la listbox)
        End If 'fin de la condition
    Next cel 'prochaine cellule de la boucle
End With 'fin de la prise en compte de l'onglet "Data"
End Sub
La troisième colonne de la ListBox1 n'est pas obligatoire mais elle te permettra de récupérer d'autres données en cas de sélection (ListIndex) puisque l'on connaîtra le numéro de ligne de la donnée stocké dans cette colonne cachée de la ListBox...

Remarque : si les propriétés ColumnCount et Columnwidths restent fixes, autant les inscrire en dur dans la fenêtre des propriétés de la ListBox1.
 
Re : Afficher List en fonction d'une condition!

Robert, le Fil,
Dans le même esprit, avec une date, j'aimerais remplacé:

#If cel.Value = "Oui" Then 'condition : si la cellule contient "Oui"

par:
#If cel.Value < (Aujourdhui() - 7) Then

Mais là, ça joue pas🙄

As-tu et (vous) une idée!
 
Re : Afficher List en fonction d'une condition!

Re, Robert, Le Fil,

Donc, un Deuxième ListBox, avec la propo:


#Private Sub UserForm_Initialize()
Dim cel As Range 'déclare la variable cel

With Me.ListBox1 'prend en compte la ListBox1
.ColumnCount = 3 'attribut le nombre de colonnes
.ColumnWidths = "90;120;0" 'définit la largeur des colonne (la 3ème ne sera pas affichée)
End With 'fin de la prise en compte de la ListBox1

With Sheets("bdd acheteur") 'prend en compte l'onglet "Data"
For Each cel In .Range("AL3:AL" & .Range("AL65536").End(xlUp).Row) 'boucle sur toute les cellules éditée de la colonne AL
If cel.Value = "Oui" Then 'condition : si la cellule contient "Oui"

Me.ListBox1.AddItem cel.Offset(0, -36).Value 'ajoute à la ListBox1 la donnée en colonne B (colonne 0 de la listbox)
Me.ListBox1.Column(1, ListBox1.ListCount - 1) = cel.Offset(0, -34).Value 'ajoute à la ListBox1 la donnée de la colonne D (colonne 1 de la listBox)
Me.ListBox1.Column(2, ListBox1.ListCount - 1) = cel.Row 'Ajoute à la ListBox1 le numéro de ligne de la donnée (Colonne 2 (masquée) de la listbox)
End If 'fin de la condition
Next cel 'prochaine cellule de la boucle
End With 'fin de la prise en compte de l'onglet "Data"

With Me.ListBox2 'prend en compte la ListBox1
.ColumnCount = 4 'attribut le nombre de colonnes
.ColumnWidths = "90;120;120;0" 'définit la largeur des colonne (la 3ème ne sera pas affichée)
End With 'fin de la prise en compte de la ListBox1

With Sheets("bdd acheteur") 'prend en compte l'onglet "Data"
For Each cel In .Range("G3:G" & .Range("G65536").End(xlUp).Row) 'boucle sur toute les cellules éditée de la colonne AL
If CDate(cel.Value) < Date - 7 Then 'condition : si la cellule contient "Oui"

Me.ListBox2.AddItem cel.Offset(0, -36).Value 'ajoute à la ListBox2 la donnée en colonne B (colonne 0 de la listbox)
Me.ListBox2.Column(1, ListBox2.ListCount - 1) = cel.Offset(0, -34).Value 'ajoute à la ListBox2 la donnée de la colonne D (colonne 1 de la listBox)
Me.ListBox2.Column(2, ListBox2.ListCount - 1) = cel.Offset(0, -32).Value 'ajoute à la ListBox2 la donnée de la colonne F (colonne 1 de la listBox)
Me.ListBox2.Column(3, ListBox2.ListCount - 1) = cel.Row 'Ajoute à la ListBox2 le numéro de ligne de la donnée (Colonne 3 (masquée) de la listbox)
End If 'fin de la condition
Next cel 'prochaine cellule de la boucle
End With 'fin de la prise en compte de l'onglet "Data"
End Sub

Mais, il me met en erreur: erreur définie par l'application ou par l'objet???
Merci pour vos idées!
 
Re : Afficher List en fonction d'une condition!

Bonjour Provence Vintage, bonjouir le forum,

Quand tu adaptes un code il faut bien le comprendre... Offset(x, y) représente un décalage entre deux cellules où x est le decalage entre les lignes et y le décalage entre les colonnes. Positif quand on se dépalce vers la bas et/ou vers la droite et negatif quand on se déplace vers le haut et/ou vers la gauche...

De la colonne Al à la colonne B il y a un décalage de 34 colonne vers la gauche d'où le Offset(0, -34)... Mais dans ta copie tu agis sur la colonne G et tu demandes d'ajouter à la ListBox2 une donnée décalée de 34 colonnes vers la gauche ce qui provoque une erreur !!!! Tu dois adapter et modifier l'Offset. Compte le nombre de colonnes qu'il y a entre G et la donnée que tu veux rajouter.
 
Re : Afficher List en fonction d'une condition!

Re,

Merci pour tes précisions Robert,
j'ai modifié l'offset en conséquence;
par contre toujours le même message d'erreur!?

Est ce a cause de CDate!
je ne l'ai défini nul part!
Merci
A+
 
Dernière édition:
Re : Afficher List en fonction d'une condition!

Bonjour Provence Vintage, bonjour le forum,

Bon déjà depuis le temps tu devrais savoir qu'un fichier exemple permet de ne pas perdre un temps fou... Et ne dis pas que ton fichier est trop lourd, il suffit d'en faire un autres juste avec quelques données et les bouts de code correspondant au problème...

CDate(valeur) converti la valeur en date et provoque une erreur si elle n'est pas convertible. Du style CDate("Robert") ne te renverra pas la Saint Innocent mais bel et bien une erreur...

Dans le nouveau code, tu balaies la colonne G et tu vérifies la condition : If CDate(cel.Value) < Date - 7 Then. J'en ai déduis qu'elle ne devait contenir que des dates. Mais si ce n'est pas le cas ça va planter. Supprime le CDate ou ajoute une gestion d'erreur dans le code du style :
Code:
With Me.ListBox2 'prend en compte la ListBox2
    .ColumnCount = 4 'attribue le nombre de colonnes
    .ColumnWidths = "90;120;120;0" 'définit la largeur des colonnes (la 4ème ne sera pas affichée)
End With 'fin de la prise en compte de la ListBox2
 
With Sheets("bdd acheteur") 'prend en compte l'onglet "bdd acheteur"
For Each cel In .Range("G3:G" & .Range("G65536").End(xlUp).Row) 'boucle sur toute les cellules éditées de la colonne G
    [COLOR=red]On Error GoTo suite[/COLOR] 'gestion des erreurs (si la cellule ne contient pas de donnée convertible en date, passe à la cellule suivante)
    If CDate(cel.Value) < Date - 7 Then 'condition : si la date de cellule est inférieure à la date du jour - 7 jours
        Me.ListBox2.AddItem cel.Offset(0, x).Value 'ajoute à la ListBox2 la donnée en colonne X (colonne 0 de la listbox)
        Me.ListBox2.Column(1, ListBox2.ListCount - 1) = cel.Offset(0, y).Value 'ajoute à la ListBox2 la donnée de la colonne Y (colonne 1 de la listBox)
        Me.ListBox2.Column(2, ListBox2.ListCount - 1) = cel.Offset(0, z).Value 'ajoute à la ListBox2 la donnée de la colonne Z (colonne 2 de la listBox)
        Me.ListBox2.Column(3, ListBox2.ListCount - 1) = cel.Row 'Ajoute à la ListBox2 le numéro de ligne de la donnée (Colonne 3 (masquée) de la listbox)
    End If 'fin de la condition
[COLOR=red]suite:[/COLOR]
[COLOR=red]On Error GoTo 0[/COLOR] 'annule la gestion des erreurs
Next cel 'prochaine cellule de la boucle
End With 'fin de la prise en compte de l'onglet "bdd acheteur"
 
Dernière édition:
Re : Afficher List en fonction d'une condition!

Bonjour a tous
quelle est la valeur de ta "cel." au moment de cdate(cel)
car cdate converti une valeur string en date si cette valeur n'est pas une chaine de caractère je ne suis pas certain que cela fonctionne,
tu peux alors utiliser la fonction isdate(cel) qui te renverra une valeur true ou false selon le cas ou la valeur de ta cellule pourra être converti au format date
en clair :
dim verification as boolean
verification=isdate(cel)
if verification = true then cdate(cel)
else:
end if
A bientot
 
Re : Afficher List en fonction d'une condition!

Robert, Le Fil,

C le B......!
Il m'indique: "erreur d'automation"! (erreur 404)
ci-joint dessous le code.
J'essaye de te compresser le fichier!


#Private Sub UserForm_Initialize()
Dim cel As Range 'déclare la variable cel

With Me.ListBox1 'prend en compte la ListBox1
.ColumnCount = 3 'attribut le nombre de colonnes
.ColumnWidths = "90;120;0" 'définit la largeur des colonne (la 3ème ne sera pas affichée)
End With 'fin de la prise en compte de la ListBox1

With Sheets("bdd acheteur") 'prend en compte l'onglet "Data"
For Each cel In .Range("AL3:AL" & .Range("AL65536").End(xlUp).Row) 'boucle sur toute les cellules éditée de la colonne AL
If cel.Value = "Fiche incomplète" Then 'condition : si la cellule contient "Oui"

Me.ListBox1.AddItem cel.Offset(0, -36).Value 'ajoute à la ListBox1 la donnée en colonne B (colonne 0 de la listbox)
Me.ListBox1.Column(1, ListBox1.ListCount - 1) = cel.Offset(0, -34).Value 'ajoute à la ListBox1 la donnée de la colonne D (colonne 1 de la listBox)
Me.ListBox1.Column(2, ListBox1.ListCount - 1) = cel.Row 'Ajoute à la ListBox1 le numéro de ligne de la donnée (Colonne 2 (masquée) de la listbox)
End If 'fin de la condition
Next cel 'prochaine cellule de la boucle
End With 'fin de la prise en compte de l'onglet "Data"


With Me.ListBox2 'prend en compte la ListBox1
.ColumnCount = 4 'attribut le nombre de colonnes
.ColumnWidths = "90;120;120;0" 'définit la largeur des colonne (la 3ème ne sera pas affichée)
End With 'fin de la prise en compte de la ListBox1

With Sheets("bdd acheteur") 'prend en compte l'onglet "Data"
For Each cel In .Range("G3:G" & .Range("G65536").End(xlUp).Row) 'boucle sur toute les cellules éditée de la colonne AL
On Error GoTo suite
If cel.Value(Date) < (Date - 7) Then 'condition : si la cellule contient "Oui"

Me.ListBox2.AddItem cel.Offset(0, -5).Value 'ajoute à la ListBox2 la donnée en colonne B (colonne 0 de la listbox)
Me.ListBox2.Column(1, ListBox2.ListCount - 1) = cel.Offset(0, -3).Value 'ajoute à la ListBox2 la donnée de la colonne D (colonne 1 de la listBox)
Me.ListBox2.Column(2, ListBox2.ListCount - 1) = cel.Offset(0, -1).Value 'ajoute à la ListBox2 la donnée de la colonne F (colonne 1 de la listBox)
Me.ListBox2.Column(3, ListBox2.ListCount - 1) = cel.Row 'Ajoute à la ListBox2 le numéro de ligne de la donnée (Colonne 3 (masquée) de la listbox)
End If 'fin de la condition
suite:
On Error GoTo 0

Next cel 'prochaine cellule de la boucle
End With 'fin de la prise en compte de l'onglet "Data"


End Sub
 
Re : Afficher List en fonction d'une condition!

Bonjour le fil, bonjour le forum,

Dans ton fichier tu n'as pas mis la gestion d'erreur (d'une part) et tu as écrit :
If cel.Value(Date) < (Date - 7) Then 'condition : si la cellule contient "Oui"
à la place de :

If CDate(cel.Value) < (Date - 7) Then 'condition : si la cellule contient "Oui"

le bon code... (fait un copier/coller !) :
Code:
With Me.ListBox2 'prend en compte la ListBox2
    .ColumnCount = 4 'attribue le nombre de colonnes
    .ColumnWidths = "90;120;120;0" 'définit la largeur des colonnes (la 4ème ne sera pas affichée)
End With 'fin de la prise en compte de la ListBox2
 
With Sheets("bdd acheteur") 'prend en compte l'onglet "bdd acheteur"
    For Each cel In .Range("G3:G" & .Range("G65536").End(xlUp).Row) 'boucle sur toute les cellules éditée de la colonne G
        On Error GoTo suite 'gestion des erreurs (si la cellule n'est pas convertible en date, passe à la cellule suivante via l'étiquette "suite")
        If CDate(cel.Value) < (Date - 7) Then 'condition : si la date de la cellule est inférieure à la date du jour - 7 jours
            Me.ListBox2.AddItem cel.Offset(0, -5).Value 'ajoute à la ListBox2 la donnée en colonne B (colonne 0 de la listbox)
            Me.ListBox2.Column(1, ListBox2.ListCount - 1) = cel.Offset(0, -3).Value 'ajoute à la ListBox2 la donnée de la colonne D (colonne 1 de la listBox)
            Me.ListBox2.Column(2, ListBox2.ListCount - 1) = cel.Offset(0, -1).Value 'ajoute à la ListBox2 la donnée de la colonne F (colonne 2 de la listBox)
            Me.ListBox2.Column(3, ListBox2.ListCount - 1) = cel.Row 'Ajoute à la ListBox2 le numéro de ligne de la donnée (Colonne 3 (masquée) de la listbox)
        End If 'fin de la condition
suite: 'étiquette
    On Error GoTo 0 'annule la gestion des erreurs
    Next cel 'prochaine cellule de la boucle
End With 'fin de la prise en compte de l'onglet "Data"
 
Dernière édition:
Re : Afficher List en fonction d'une condition!

Robert, fhoest, le Fil,

fhoest, les cellules de la colonne concernée sont au format date;
j'ai copier le code de Robert avant de voir ton post, ça fonctionne, avec un petit hic:

#(Date - 7) Then 'condition : si la date de la cellule est inférieure à la date du jour - 7 jours

les résultats ne tiennent pas compte de: date du jour - 7 jours
comment rajouter dans le code ce paramètre
Date = Aujourd'hui() ?

merci à vous deux
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour