Listbox conditonnelle

julien34

XLDnaute Occasionnel
Bonjour,

Je m'adresse à vous ce jour car confronté à un problème.

Je m'explique....

J'ai un formulaire en feuil 1 dont les infos sont renvoyées en feuil2 (base).
Pour chaque client, il est stipulé s'il faut effectuer une relance et a quelle date. Seulement certains clients n'ont pas besoin de relance, ils sont à jour.

Ma question est la suivante:
Est ce possible d'afficher une listbox (via bouton), me permettant de montrer uniquement les clients qui ont besoin d’être relancés (histoire d'avoir un bouton "consulter la liste des taches")

J’espère avoir été clair. Pas facile à expliquer.
D'avance merci
Julien
 

klin89

XLDnaute Accro
Re : Listbox conditonnelle

re à tous,

Dans UserForm3 :

VB:
Private Sub UserForm_Initialize()
Dim myArray
k = 0
With Sheets("Base") 'MA FEULLE QUI CONTIENT LA BASE DE DONNEES
  For i = 2 To .[A65000].End(xlUp).Row
    If Not IsEmpty(.Cells(i, 105)) And Not IsEmpty(.Cells(i, 106)) Then
      Me.ListBox1.AddItem
      Me.ListBox1.List(k, 0) = .Cells(i, 1) 'COLONNE NUM DOSSIER
      Me.ListBox1.List(k, 1) = .Cells(i, 3) 'COLONNE NOM
      Me.ListBox1.List(k, 2) = .Cells(i, 4) 'COLONNE PRENOM
      Me.ListBox1.List(k, 3) = .Cells(i, 10) 'COLONNE MARQUE
      Me.ListBox1.List(k, 4) = .Cells(i, 11) 'COLONNE MODELE
      Me.ListBox1.List(k, 5) = .Cells(i, 105) 'COLONNE ACTIONS
      Me.ListBox1.List(k, 6) = .Cells(i, 106) 'COLONNE RELANCE'
      k = k + 1
    End If
  Next i
  myArray = Array("", "N° DOSSIER", "NOM", "PRENOM", "MARQUE", "MODELE", "ACTIONS", "RELANCE")
  x = 25
  For j = 1 To UBound(myArray)
    retour = Me.Controls.Add("Forms.Label.1", "Label" & j, True)
    Me("label" & j).Caption = myArray(j)
    Me("label" & j).Top = 30
    Me("label" & j).Left = x
    x = x + 80
    'x = x + Columns(j).Width * 1.1
    temp = temp & Columns(j).Width & ";"
  Next j
End With
End Sub
Par rapport au code de Boisgontier :
Je n'arrive pas à définir x et temp correctement pour parvenir à bien centrer les labels (en-têtes) par rapport aux 7 colonnes de ta Listbox.

Si quelqu'un veut intervenir et affiner la position des Labels.

Klin89

Edit : Ne t'emballes pas, on n'a pas fini de régler un problème, que déjà tu passes à autre chose, en plus tu passes du coq à l'âne, ouvres un nouveau post :mad:
 
Dernière édition:

lotfi

XLDnaute Nouveau
Re : Listbox conditonnelle

bojour,
une peutit essaye, mais je ne sais pas si cela te convient ou non.

j'ai ajouter un type de relance "paiment" mais que tu peux modifier celon tes besoins.

@+
 

Pièces jointes

  • FORM SIMPLIFIE POUR AIDE FORUM.xlsm
    45 KB · Affichages: 58
  • FORM SIMPLIFIE POUR AIDE FORUM.xlsm
    45 KB · Affichages: 61
  • FORM SIMPLIFIE POUR AIDE FORUM.xlsm
    45 KB · Affichages: 59

klin89

XLDnaute Accro
Re : Listbox conditonnelle

re le forum,

Toujours dans UserForm3 :

VB:
Private Sub UserForm_Initialize()
Dim myArray
k = 0
With Sheets("Base") 'MA FEULLE QUI CONTIENT LA BASE DE DONNEES
 For i = 2 To .[A65000].End(xlUp).Row
    If Not IsEmpty(.Cells(i, 105)) And Not IsEmpty(.Cells(i, 106)) Then
      Me.ListBox1.AddItem
      Me.ListBox1.List(k, 0) = .Cells(i, 1) 'COLONNE NUM DOSSIER
     Me.ListBox1.List(k, 1) = .Cells(i, 3) 'COLONNE NOM
     Me.ListBox1.List(k, 2) = .Cells(i, 4) 'COLONNE PRENOM
     Me.ListBox1.List(k, 3) = .Cells(i, 10) 'COLONNE MARQUE
     Me.ListBox1.List(k, 4) = .Cells(i, 11) 'COLONNE MODELE
     Me.ListBox1.List(k, 5) = .Cells(i, 105) 'COLONNE ACTIONS
     Me.ListBox1.List(k, 6) = .Cells(i, 106) 'COLONNE RELANCE'
     k = k + 1
    End If
  Next i
  myArray = Array("", "N° DOSSIER", "NOM", "PRENOM", "MARQUE", "MODELE", "ACTIONS", "RELANCE")
  x = 26
  For j = 1 To UBound(myArray)
    retour = Me.Controls.Add("Forms.Label.1", "Label" & j, True)
    Me("label" & j).Caption = myArray(j)
    Me("label" & j).Top = 30
    Me("label" & j).Left = x
    x = x + Sheets("Base").Columns(j).Width * 1.1
    temp = temp & Sheets("Base").Columns(j).Width * 1.1 & ";"
  Next j
  Me.ListBox1.ColumnWidths = temp
End With
End Sub

Le problème c'est que pour les instructions suivantes
x = x + Sheets("Base").Columns(j).Width * 1.1
temp = temp & Sheets("Base").Columns(j).Width * 1.1 & ";"
La variable j prend successivement comme valeur 1, 2, 3, 4, 5, 6 et 7 alors qu'elle devrait prendre les valeurs 1, 3, 4, 10, 11, 105, et 106 soit les numéros des différentes colonnes concernées.

Il faut revoir cette partie et ce sera tout bon :p
Un petit coup de main, please :)

Klin89
 

klin89

XLDnaute Accro
Re : Listbox conditonnelle

Re bonsoir,

La largeur des colonnes de la listbox s'ajuste automatiquement à la largeur des colonnes de la feuille "Base".
Quant à la largeur de l'userform, elle s'ajuste à la largeur de la listbox.

A tester dans ton fichier du post #23
Dans UserForm3 :

VB:
Private Sub UserForm_Initialize()
Dim myArray
k = 0
With Sheets("Base") 'MA FEULLE QUI CONTIENT LA BASE DE DONNEES
For i = 2 To .[A65000].End(xlUp).Row
    If Not IsEmpty(.Cells(i, 105)) And Not IsEmpty(.Cells(i, 106)) Then
      Me.ListBox1.AddItem
      Me.ListBox1.List(k, 0) = .Cells(i, 1).Text 'COLONNE NUM DOSSIER
   Me.ListBox1.List(k, 1) = .Cells(i, 3) 'COLONNE NOM
   Me.ListBox1.List(k, 2) = .Cells(i, 4) 'COLONNE PRENOM
   Me.ListBox1.List(k, 3) = .Cells(i, 10) 'COLONNE MARQUE
   Me.ListBox1.List(k, 4) = .Cells(i, 11) 'COLONNE MODELE
   Me.ListBox1.List(k, 5) = .Cells(i, 105) 'COLONNE ACTIONS
   Me.ListBox1.List(k, 6) = .Cells(i, 106) 'COLONNE RELANCE'
   k = k + 1
    End If
  Next i
  myArray = Array("", "N° DOSSIER", "NOM", "PRENOM", "MARQUE", "MODELE", "ACTIONS", "RELANCE")
  x = 26
  For j = 1 To UBound(myArray)
    retour = Me.Controls.Add("Forms.Label.1", "Label" & j, True)
    Me("label" & j).Caption = myArray(j)
    Me("label" & j).Top = 30
    Me("label" & j).Left = x
    Select Case j
      Case 1
        x = x + Sheets("Base").Columns(1).Width
        temp = temp & Sheets("Base").Columns(1).Width & ";"
      Case 2
        x = x + Sheets("Base").Columns(3).Width
        temp = temp & Sheets("Base").Columns(3).Width & ";"
      Case 3
        x = x + Sheets("Base").Columns(4).Width
        temp = temp & Sheets("Base").Columns(4).Width & ";"
      Case 4
        x = x + Sheets("Base").Columns(10).Width
        temp = temp & Sheets("Base").Columns(10).Width & ";"
      Case 5
        x = x + Sheets("Base").Columns(11).Width
        temp = temp & Sheets("Base").Columns(11).Width & ";"
      Case 6
        x = x + Sheets("Base").Columns(105).Width
        temp = temp & Sheets("Base").Columns(105).Width & ";"
      Case 7
        x = x + Sheets("Base").Columns(106).Width
        temp = temp & Sheets("Base").Columns(106).Width & ";"
    End Select
  Next j
  Me.ListBox1.ColumnWidths = temp
  Me.ListBox1.Left = 18
  Me.ListBox1.Width = x - 26
  Application.Wait (Now + TimeValue("00:00:01"))
End With
Me.Width = Me.ListBox1.Width + 36
End Sub

klin89
 
Dernière édition:

Yaloo

XLDnaute Barbatruc
Re : Listbox conditonnelle

Bonsoir,

Ca ne m'a pas l'air très top avec une ListBox, pourquoi ne pas utiliser une ListView avec le code ci-dessus

Code:
Private Sub UserForm_Initialize()
  Dim DLig As Long
    ' Initialisation du listview
    With ListView1
        With .ColumnHeaders
            ' Vider le listview
            .Clear
            'Ajouter les colonnes
            .Add , , "N°", "40"
            .Add , , "Nom", 90
            .Add , , "Prenom", 85
            .Add , , "Marque", 80
            .Add , , "Type", 80
            .Add , , "Relance", 60
            .Add , , "Date", 60
        End With
        .View = 3                   ' type Report
        .Gridlines = True           ' affichage de lignes
        .FullRowSelect = True       ' sélection complète de la ligne
        .HideColumnHeaders = False  ' afficher les en-têtes de colonnes
        .LabelEdit = 1              ' ne pas autoriser la saisie
    End With
    'Rempli la ListView
    With ListView1
        DLig = Feuil2.Range("A" & Rows.Count).End(xlUp).Row
        For li = 2 To DLig
          If Feuil2.Cells(li, 106) <> "" Then
                .ListItems.Add , , Format(Feuil2.Cells(li, 1).Value, """OCC""000")              'Numéro
                .ListItems(.ListItems.Count).ListSubItems.Add , , Feuil2.Cells(li, 3).Value     'Nom
                .ListItems(.ListItems.Count).ListSubItems.Add , , Feuil2.Cells(li, 4).Value     'Prénom
                .ListItems(.ListItems.Count).ListSubItems.Add , , Feuil2.Cells(li, 10).Value    'Marque
                .ListItems(.ListItems.Count).ListSubItems.Add , , Feuil2.Cells(li, 11).Value    'Type
                .ListItems(.ListItems.Count).ListSubItems.Add , , Feuil2.Cells(li, 105).Value   'Relance
                .ListItems(.ListItems.Count).ListSubItems.Add , , Feuil2.Cells(li, 106).Value   'Date relance
          End If
        Next
    .ListItems.Add , , ""
    .ListItems.Item(.ListItems.Count).Selected = True
    End With
End Sub

Merci à Chalet53 à qui j'ai piqué des idées ici

En plus tu peux trier tes colonnes en ordre croissant ou décroissant, cela peut être intéressant pour les dates notamment, avec le code ci-dessous.

Code:
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
    ListView1.Sorted = False
    ListView1.SortKey = ColumnHeader.Index - 1
    
    If ListView1.SortOrder = lvwAscending Then
        ListView1.SortOrder = lvwDescending
        Else
        ListView1.SortOrder = lvwAscending
    End If
    
    ListView1.Sorted = True
End Sub

A+

Yaloo
 

julien34

XLDnaute Occasionnel
Re : Listbox conditonnelle

Re Yaloo,

J'ai essayé la Listview. Bonne idée !
Par contre le tri ne fonctionne pas ou.......je n'arrive pas à le faire fonctionner?
J'ai simplement recopier le code que tu m'as fourni. Faut il l'adapter ?

D'avance merci,
Julien
 

julien34

XLDnaute Occasionnel
Re : Listbox conditonnelle

Bonjour Yaloo, le forum

Je parle du tri des colonnes via le code suivant...

Code:
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
    ListView1.Sorted = False
    ListView1.SortKey = ColumnHeader.Index - 1
   
    If ListView1.SortOrder = lvwAscending Then
        ListView1.SortOrder = lvwDescending
        Else
        ListView1.SortOrder = lvwAscending
    End If
   
    ListView1.Sorted = True
End Sub

Ci joint le fichier
Voir "userform3"
Ps: J'ai remis d'origine (listbox) pour que tu partes sur une base "saine" au niveau du code parce que je me dis qu'en essayant d’insérer la listview j'ai peut être modifié quelque chose qu'il ne fallait pas !

Merci,
A+
 

Pièces jointes

  • FORM V 8.4.xlsm
    105.5 KB · Affichages: 64
  • FORM V 8.4.xlsm
    105.5 KB · Affichages: 64
  • FORM V 8.4.xlsm
    105.5 KB · Affichages: 66

Yaloo

XLDnaute Barbatruc
Re : Listbox conditonnelle

Bonsoir Julien, le forum,

Voici le fichier avec l'userform3, pour récupérer les données inspires-toi de l'userform2.

Je t'ai mis un format particulier pour repérer les dates de relance qui sont du jour ou déjà passées. Si tu veux l'enlever supprimes les lignes suivantes :

Code:
If Feuil2.Cells(li, 106).Value < Now Then
.ListItems(.ListItems.Count).ListSubItems(6).ForeColor = RGB(100, 0, 0)
.ListItems(.ListItems.Count).ListSubItems(6).Bold = True
End If

A+
 

Pièces jointes

  • FORM V 8.4.xlsm
    109.3 KB · Affichages: 54
  • FORM V 8.4.xlsm
    109.3 KB · Affichages: 62
  • FORM V 8.4.xlsm
    109.3 KB · Affichages: 64
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
315 108
Messages
2 116 287
Membres
112 713
dernier inscrit
sarah.arnold.edc@hotmail.