ListBox et cellule vide dans un tri

Bonjour à tous,

la macro ci dessous fonctionne bien elle recherche les dates dépassées en colonne "I", mais j'aurai besoin d'ajouter que : si dans cette colonne ("I") des cellules sont vide ne pas les prendre en compte. (actuellement elle me les prend en compte dans l'alimentation de la listebox.)

(de A jusqu'à j 'aurai toujours des éléments, donc jamais une ligne ne sera entièrement vide seul en "I")

je suppose que c'est dans : " If .Range("I" & i).Value < Date Then" , mais n'arrive pas à rajouter cette condition

En gros : alimenter lisbox des dates dépassées en colonne "I" et ne pas tenir compte si vide ou n'est pas une date.

Merci de votre aide .

cordialement .

la Macro complète :

Private Sub UserForm_Click()

Dim i As Long, DerLig As Long

On Error Resume Next

Me.ListBox2.ColumnCount = 3

Me.ListBox2.ColumnWidths = "80,80,80"

With Sheets("Feuil000")

DerLig = .Range("C" & Rows.Count).End(xlUp).Row

For i = 2 To DerLig

If .Range("I" & i).Value < Date Then

Me.ListBox2.AddItem .Range("A" & i).Value

Me.ListBox2.List(Me.ListBox2.ListCount - 1, 1) = .Range("C" & i).Value

Me.ListBox2.List(Me.ListBox2.ListCount - 1, 2) = .Range("F" & i).Value

End If

Next i

End With

Bonsoir,

Tu devrais :

1) Mettre ton code sous balises Code (et préalablement l'indenter s'il ne l'est pas), ce qui permettra de le lire sans effort !

2) Mettre ton fichier de façon qu'on voie de plus près ce qu'il en est avec tes dates, et que l'on puisse te faire les bonnes propositions pour rectifier les divers points de ta procédure qui méritent de l'être.

Cordialement.

Bonsoir

Avoir avec IsDate

If IsDate(.Range("I" & I).Value) Then

A+

Maurice

Bonsoir,

voici un fichier exemple

cordialement.

Bonsoir,

Private Sub UserForm_Initialize()
    Dim Tbl(), n&, i&, j&, d
    With Worksheets("Feuil000")
        n = .Cells(.Rows.Count, 3).End(xlUp).Row
        ReDim Tbl(2, n): d = Date
        For i = 1 To n
            If IsDate(.Cells(i, 9)) Then
                If .Cells(i, 9) < d Then
                    Tbl(0, j) = .Cells(i, 1): Tbl(1, j) = .Cells(i, 3)
                    Tbl(2, j) = .Cells(i, 4): j = j + 1
                End If
            End If
        Next i
    End With
    If j > 0 Then
        ReDim Preserve Tbl(2, j - 1)
        If j > 1 Then
            ListBox2.Column = Tbl
        Else
            With ListBox2
                .AddItem Tbl(0, 0)
                .List(0, 1) = Tbl(1, 0)
                .List(0, 2) = Tbl(2, 0)
            End With
        End If
    End If
End Sub

NB- Les propriétés par défaut fixes, se définissent dans la fenêtre de propriétés, celles qui varient se définissent lors de l'ouverture (procédure Initialize).

Cordialement.

Re bonsoir,

Merci beaucoup de ton aide, effectivement c'est plus propre et ca fonctionne impec, respect!

j'ai mis en résolu, mais j'ai une question : peut on pouvoir faire cela mais en prenant en compte plusieurs classeurs car j'en ai 10 avec la page nommée pareil et les cellules également ?, ou bien reprendre les 10 ListBox dans une seul?

Comment (dans les grande ligne) je dois m'y prendre?

Encore pour la correction précédente, et tes explications

Cordialement


archer a écrit :

Bonsoir

Avoir avec Isdate

If IsDate(.Range("I" & I).Value) Then

A+

Maurice

Bonsoir,

Merci de ton aide, la solution à été résolu (dans le fil)

Cordialement

Re,

Tu noteras que la condition mise pour régler d'éventuels problèmes d'incompatibilité de type est la même que celle suggérée par Archer (du moment que les dates qui sont des dates ne peuvent prêter à confusion, ni ce qui n'en est pas, le plus simple est de tester avec IsDate...)

Pour le reste j'ai procédé à la constitution d'un tableau pour l'affecter en bloc à la ListBox (affectation avec Column au lieu de List car il fallait le transposer lors de l'affectation, et l'utilisation de Column à la place de List évite de le transposer). Les conditions afférentes prévoient les cas possibles : pas d'éléments à mettre dans la ListBox, un seul élément (incompatible avec l'utilisation de List, et du même coup de Column), qui provoqueraient des erreurs s'ils se produisaient...

Alimenter la ListBox à partir de 10 classeurs est certainement possible. Il serait cependant plus prudent d'opérer la constitution du tableau à affecter avec une procédure dédiée (plus facile à gérer par la suite) : proc. qui ouvre tour à tour les classeurs, récupère les éléments et les cumule dans un tableau, referme les classeurs... Procédure qui pourrait être lancée par la proc. appelant le Userform avan appel, et qui pourrait d'ailleurs dans la foulée faire l'affectation à la ListBox avant ouverture du Userform. C'est un schéma possible (avec variante déjà selon qu'on utilise une varaible tableau niveau module ou qu'on le fait renvoyer par la proc. qui l'établit en la définissant comme Function...)

L'ensemble est aussi à voir selon ta configuration de départ, et ce que tu entends faire ensuite...

Cordialement.

bonjour,

C'est juste un Projet pour les 10 classeurs, je verrais cela par la suite

Par contre, Je souhaiterais voir apparaitre et en dernière colonne dans la ListBox la colonne "i" des dates, mais je ne trouve pas comment le faire

Merci

Cordialement

Bonjour,

Tu ajoutes une colonne, il te faut donc redimensionner ta ListBox d'un côté, et le tableau destiné à l'alimenter de l'autre...

1) Dans la fenêtre de propriétés, tu portes ColumnCount à 4, et tu ajoutes une dimension à ColumnWidths (un ; suivi d'un nombre, VBA complète...)

NB- Pour ColumnWidths, le séparateur est le ; Tu tapes donc des nombres représentant la largeur en points de chaque colonne, séparés par des ; Si tu ne mets rien entre deux ; la colonne correspondante sera masquée....

2) Tu ajustes ta procédure Initialize :

Private Sub UserForm_Initialize()
    Dim Tbl(), n&, i&, j&, d
    With Worksheets("Feuil000")
        n = .Cells(.Rows.Count, 3).End(xlUp).Row
        ReDim Tbl(3, n): d = Date
        For i = 1 To n
            If IsDate(.Cells(i, 9)) Then
                If .Cells(i, 9) < d Then
                    Tbl(0, j) = .Cells(i, 1): Tbl(1, j) = .Cells(i, 3)
                    Tbl(2, j) = .Cells(i, 4): Tbl(3, j) = .Cells(i, 9).Text
                    j = j + 1
                End If
            End If
        Next i
    End With
    If j > 0 Then
        ReDim Preserve Tbl(3, j - 1)
        If j > 1 Then
            ListBox2.Column = Tbl
        Else
            With ListBox2
                .AddItem Tbl(0, 0)
                .List(0, 1) = Tbl(1, 0)
                .List(0, 2) = Tbl(2, 0)
                .List(0, 3) = Tbl(3, 0)
            End With
        End If
    End If
End Sub

Modifications surlignées : on passe l'indice colonne de 2 à 3, et on sert ce nouvel élément [l'utilisation de .Text au lieu de .Value (par défaut) pour la cellule garantit que la valeur affichée dans la ListBox sera une chaîne formatée en date, telle qu'elle apparaît dans la cellule...]

Cordialement.

Bonjour,

Merci encore de ton soutien,

j'ai une autre question, vu la longueur de ma feuille, je souhaiterais ci c'est possible c'est qu'avec un double clic dans un élément du filtrage de la ListBox, cela m'amène directement sur la ligne concerné de la feuille . J'ai trouvé un code sur le net mais ne s'aligne pas à la ligne dans ma feuille, voici le code :

Private Sub ListBox2_Click()
If ListBox2.ListIndex <> -1 Then
Cells(ListBox2.ListIndex + 3, 1).Select
End If

Merci.

Cordialement.

Ceci ne peut fonctionner que si tu charges tous les éléments de ta feuille dans la ListBox (et en mettant +3 que les données sur ta feuille commencent ligne 3 !)

Comme tu prends les éléments répondant à une condition, il faudra ajouter une colonne (masquée) à la ListBox pour y mettre le numéro de ligne de la feuille. Ainsi, au clic on récupère ce numéro qui indiquera immédiatement où se trouve l'élément sur la feuille.

Je peux voir ça demain (il se fait tard et je fatigue un peu !).

Cordialement.

Bonsoir

Oui pas de soucis c'est déjà gentil de ta part de m'aider dans mon VBA donc quand tu auras le temps

Bonne soirée

Cordialement

Bonjour,

Private Sub ListBox2_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Dim n&
    n = ListBox2.ListIndex
    If n > -1 Then
        n = ListBox2.List(n, 0)
        Me.Hide
        Worksheets("Feuil000").Range("A" & n).Select
    End If
End Sub

Private Sub UserForm_Initialize()
    Dim Tbl(), n&, i&, j&, d
    With Worksheets("Feuil000")
        n = .Cells(.Rows.Count, 3).End(xlUp).Row
        ReDim Tbl(4, n): d = Date
        For i = 1 To n
            If IsDate(.Cells(i, 9)) Then
                If .Cells(i, 9) < d Then
                    Tbl(0, j) = i: Tbl(1, j) = .Cells(i, 1): Tbl(2, j) = .Cells(i, 3)
                    Tbl(3, j) = .Cells(i, 4): Tbl(4, j) = .Cells(i, 9).Text
                    j = j + 1
                End If
            End If
        Next i
    End With
    If j > 0 Then
        ReDim Preserve Tbl(4, j - 1)
        If j > 1 Then
            ListBox2.Column = Tbl
        Else
            With ListBox2
                .AddItem Tbl(0, 0)
                For i = 1 To 4
                    .List(0, i) = Tbl(i, 0)
                Next i
            End With
        End If
    End If
End Sub

La modification d'Initialize est similaire à la précédente : on ajoute une colonne (mettre sa largeur à 0), qu'on alimente avec l'index de ligne (en la plaçant en première position, on décale les autres). Le double-clic sur un élément conduit au positionnement du curseur en col. A sur la feuille, sur la ligne de l'élément double-cliqué et masque le Userform.

Cordialement.


Bonsoir,

Un grand Merci pour le temps consacré à mon soucis, cela fonctionne nickel, et les explications au top

Je ne te derange pas plus

Bonne soirée.

Cordialement.

Cédric

Re Bonjour

"Je suis une buse" j'essai dans un nouveau classeur d'adapter ton BVA, mais j'y arrive pas. j'ai pas du tout comprendre.....

Voici le fichier

Merci

Cordialement

Pas compris ton problème ! A-priori cela n'a pas de rapport avec le sujet initial.

Le sujet initial concernait l'utilisation d'une ListBox pour insérer des valeurs dans une cellule, un de moyens pour y cumuler plusieurs valeurs...

effectivement le sujet etais plus haut. En fait j'essai d'adapter ton bva & listbox au nouveau classeur et nouvelle feuille nommée BD2, je n'arrive pas à faire apparaitre les valeurs dans la lisbox suivant toujours la même condition: faire apparaitre dans la listbox que les lignes dont les dates (de la colonne F) sont dépassées, puis le double clic pour aller a la ligne concernée

Merci

Cordialemennt

Ouille ! un noeud dans mes neurones, j'ai répondu par rapport à un sujet autre qui venait d'être traité, et effectivement je ne voyais pas la même chose...

Besoin d'une pause !!! Je regarderai plus tard.

pas de soucis, je te remercie par avance

Ajusté pour le classeur.

La TextBox est mise à la date... si on change la date dans la TextBox cela modifie la liste...

Mais je ne sais pas si j'ai bien compris car on est en 2017 et filtrer sur des dates toutes de 1970 ? elles sont forcément du même côté au départ...

A voir...

Rechercher des sujets similaires à "listbox vide tri"