Condition dans listbox

didier09

XLDnaute Occasionnel
Bonsoir à tous,
Je m'en remets une fois de plus à vous, moi je suis à fond....
je voudrais afficher des valeurs dans une listbox seulement si, pour chaque ligne, la valeur de la cellule D est > à la cellule C.
je joins mon début de code
Merci
Didier [file name=list_essai.zip size=15508]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/list_essai.zip[/file]
 

Pièces jointes

  • list_essai.zip
    15.1 KB · Affichages: 10

myDearFriend!

XLDnaute Barbatruc
Bonsoir didier09, Jam, le Forum,

Une autre suggestion :
Private Sub UserForm_Initialize()
Dim TabTemp As Variant
Dim
L As Long
      'Charge les données dans un tableau variant temporaire
      With Sheets('Feuil1')
            L = .Range('A65536').End(xlUp).Row
            TabTemp = .Range(.Cells(2, 1), .Cells(L, 4)).Value
      End With
      'Chargement ListBox1
      For L = 1 To UBound(TabTemp, 1)
            If IsNumeric(TabTemp(L, 4)) Then
                  If TabTemp(L, 4) > TabTemp(L, 3) Then ListBox1.AddItem TabTemp(L, 1)
            End If
      Next L
End Sub
Cordialement,
 

didier09

XLDnaute Occasionnel
Re, Merci à vous deux.
je rentre à l'instant d'une réunion et je découvre vos solutions.
je vais adopter la macro de Mdf , je la trouve zouli zouli....
je pense saisir l'essentiel, mais juste une préscision:
TabTemp = .Range(.Cells(2, 1).Cells(L, 4)).Value
c'est ici que tu défini ton tableau
.Cells(2, 1) : pour la cellule A2
Cells(L, 4) : pour la fin du tableau derniere ligne et D
For L = 1 To UBound(TabTemp, 1) : j'avoue ne pas etre sur de comprendre.
Trouvé sur l'aide Vba: La fonction UBound est utilisée avec la fonction LBound pour déterminer la taille d'un tableau.
En réalité avec cette fonction tu balaye toutes les lignes du tableau que tu defini?

Bonne soirée
Didier
 

myDearFriend!

XLDnaute Barbatruc
Re didier09,

Tu as tout juste !

Ubound(Tableau,dimension) te donne le plus grand indice du Tableau pour la dimension mentionnée.

Etant directement issu d'un objet Range (une plage de cellules), TabTemp() est un tableau variant de base 1 dont la première dimension correspond aux lignes et la deuxième aux colonnes. Autrement dit, Ubound(TabTemp,1) te donne le plus grand indice dans la première dimension du tableau TabTemp(), c'est à dire le nombre total de lignes de la plage mémorisée.

J'aurais donc pu utiliser quelque chose comme :
      For i = 1 To (L-1)
      ...
ce qui revenait donc à la même chose, mais je préfère économiser une variable supplémentaire (i) et réutiliser la variable L pour la boucle.

Cordialement,
 

didier09

XLDnaute Occasionnel
Rebonjour,
En poussant la réflexion un peu plus loin,si j'utilise ce type de tableau
quelle est la syntaxe à ajouter pour éviter d'afficher les doublons de la colonne.
J'ai trouvé une démo de @+Thierry du 05/2004,
http://www.excel-downloads.com/html/French/forum/messages/1_88133_88133.htm
j'ai essayé d'adapter, cela plante à tous les coups: Il avertissait que cela était l'inconvenient principal de la méthode .
Didier
 

myDearFriend!

XLDnaute Barbatruc
Bonsoir Didier09,

Pour moi, la méthode la plus pratique et rapide consiste à utiliser une collection pour ce genre de problème.

Il m'est difficile de te présenter une adaptation de ton fichier avec un exemple de code puisque tu ne remontes dans ta listbox que les index de la colonne A (qui sont, par définition, sans doublon!).

Si tu le souhaites, tu peux joindre dans ce fil un fichier exemple simple que je pourrais t'adapter en conséquence et t'expliquer...

Dans l'attente, tu peux consulter ce lien Lien supprimé dans lequel j'avais essayé d'expliquer un peu le principe.

Cordialement,
 

didier09

XLDnaute Occasionnel
Bonjour et merci de me consacrer de ton temps.
Je te joins un fichier. Je vais consulter aussi le lien que tu m'a donné.
Didier [file name=listbox_doublons.zip size=14471]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/listbox_doublons.zip[/file]
 

Pièces jointes

  • listbox_doublons.zip
    14.1 KB · Affichages: 16

didier09

XLDnaute Occasionnel
Bonsoir,
J'ai essayé de réaliser de mon coté, grace au lien que tu m'a donné,
l'affichage dans la listbox des entrées sans doublon. je n'y suis pas arrivé malgré plusieurs tentatives. Je joins mon code
Didier [file name=listbox_doublons_20051116203050.zip size=14947]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/listbox_doublons_20051116203050.zip[/file]
 

Pièces jointes

  • listbox_doublons_20051116203050.zip
    14.6 KB · Affichages: 16

myDearFriend!

XLDnaute Barbatruc
Bonsoir Didier09, le Forum,

Tu trouveras ci-joint ton exemple modifié en conséquence.

Visiblement, tu avais bien appliqué le principe du filtrage par l'objet collection, c'était simplement le chargement de la ListBox1 à partir de cette collection qui était à revoir...

Dans ce fichier, tu trouveras 2 façons de faire...

La première (la plus simple à comprendre je pense) :
Private Sub UserForm_Initialize()
Dim Tout As Range, Cell As Range
Dim Purge As New Collection
Dim i As Long
      'Mémoriser la plage de données
      With Sheets('Maintenances')
            Set Tout = .Range('A2', .Range('A65536').End(xlUp))
      End With
      'Stocker les données (sans doublons) dans l'objet Collection
      On Error Resume Next
      For Each Cell In Tout
            Purge.Add Cell.Value, CStr(Cell.Value)
      Next Cell
      On Error GoTo 0
      'Charger la ListBox avec les données issues de la collection
      For i = 1 To Purge.Count
            ListBox1.AddItem Purge(i)
      Next i
End Sub
La seconde, qui a ma préférence puisqu'elle permet d'éviter une double boucle (une pour filtrer dans l'objet collection et une pour charger la ListBox). Comme à mon habitude, j'utilise également un tableau variant temporaire   :
Private Sub UserForm_Initialize()
Dim TabTemp As Variant
Dim
Purge As New Collection
Dim Pointeur As Long, L As Long
      'Charger les données dans un tableau variant temporaire
      With Sheets('Maintenances')
            L = .Range('A65536').End(xlUp).Row
            TabTemp = .Range(.Cells(2, 1), .Cells(L, 1)).Value
      End With
      'Récupérer les données (sans doublons)
      On Error Resume Next
      For L = 1 To UBound(TabTemp, 1)
            Purge.Add TabTemp(L, 1), CStr(TabTemp(L, 1))
            If Purge.Count <> Pointeur Then
                  ListBox1.AddItem Purge(Purge.Count)
            End If
            Pointeur = Purge.Count
      Next L
      On Error GoTo 0
End Sub
Testée sur un peu plus de 20000 lignes, cette dernière procédure divise par 2 le temps de traitement par rapport à la première...

Cordialement, [file name=PourDidier09.zip size=17306]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/PourDidier09.zip[/file]
 

Pièces jointes

  • PourDidier09.zip
    16.9 KB · Affichages: 42

Discussions similaires

Statistiques des forums

Discussions
300 822
Messages
1 987 481
Membres
209 863
dernier inscrit
habibino