Faire un tri en fonction des valeurs des combobox

Bonjour à tous,

Voilà j'ai fait un excel dans lequel se trouve déjà un code.

Je suis actuellement bloqué. J'ai un UserForm dans lequel sont placées des combobox. J'aimerai que lorsque l'on choisit par exemple bâtiment 1, la date, le nom et prénom un tri est effectué dans le fichier excel et s'affiche dans la list box.

J'aimerai également que par rapport aux critères des combobox, il y est un total du nombre total de travaux qui soit fait.

J'espère être précis :/

Je bloque pour cette partie de mon code.

En vous remerciant d'avance !

Bonjour Eagles, bonjour le forum,

Ton code ne devrait pas permettre la date Au inférieure à la date Du ainsi que le choix d'un nom qui me matche pas avec le prénom. Sinon ça va être beaucoup plus compliqué à gérer...

Pourquoi des dates avec des heures puisque la durée ne s'effectue pas par un calcul du temps ? Ça complique !...

Bonjour,

Pour la date il est logique que Au sera inférieure à Du lors de l'utilisation (en tout cas j'éspère ^^')

Concernant la date, oui tu as raison, les heures me dérangent. j'aimerai m'en affranchir, par exemple si la date est 03/01/2017 10:58. J'aimerai considérer uniquement 03/01/2017.

Re,

Logique oui mais tu dois prévoir dans ton code une mauvaise manipulation de l'utilisateur.

Ensuite si les heures te gênent pourquoi les éditer ? Pourquoi ne pas taper que la date ?

Et pour le nom/prénom ?

Oui c'est sûr mais pour le moment j'aimerai au moins arriver à faire mon tri.

Pour la date, en changeant le format des cellules je peux avoir uniquement les dates. Et je ne peux pas les taper, puisque c'est un fichier que je reçois chaque fin de mois, avec plus de 7 000 lignes.

Pour le reste c'est des questions de formes que je réglerai plus tard.

Re,

Essaie comme ça :

Private Sub CommandButton1_Click() 'bouton "Valider"
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim NL As Long 'déclare la variable NL (Nombre de Lignes)
Dim NC As Byte 'déclare la variable NC (Nombre de Colonnes)
Dim I As Long 'déclare la variable I (Incrément)
Dim J As Byte 'déclare la variable J (incrément)
Dim K As Long 'déclare la variable K (incrément)
Dim DS As Double 'déclare la variable DS (Date Serial)
Dim TS As Double 'déclare la variable TS (Temps Serial)
Dim DD As Double 'déclare la variable DD (Date Double)
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)
Dim T As Long 'déclare la variable T (Total)

Me.ListBox1.Clear 'vide la ListBox1
TV = f.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
NL = UBound(TV, 1) 'définit le nombre de lignes NL du tableau des valeurs TV
NC = UBound(TV, 2) 'définit le nombre de colonnes NC du tableau des valeurs TV
K = 1 'initialise la variable K
For I = 2 To NL 'boucle 1 : sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
    DS = DateSerial(Year(TV(I, 3)), Month(TV(I, 3)), Day(TV(I, 3))) 'définit le numéro sérial DS de la date
    TS = TimeSerial(Hour(TV(I, 3)), Minute(TV(I, 3)), Second(TV(I, 3))) 'définit le numéro sérial TS de l'heure
    DD = DS + TS 'définit la date au format Double
    'condition : si les données de la lignes correspondent aux données des contrôles
    If TV(I, 6) = Me.ComboBox1.Value And TV(I, 2) = Me.ComboBox6.Value And TV(I, 1) = Me.ComboBox5.Value And CDate(DD) >= Me.ComboBox7.Value And CDate(DD) <= Me.ComboBox8.Value Then
        ReDim Preserve TL(1 To NC, 1 To K) 'redimensionne le tableau des lignes TL (autant de lignes que TV a de colonnes, K colonnes)
        For J = 1 To NC 'boucle 2 : sur toutes les colonnes J du tableau des valeurs TV
            TL(J, K) = TV(I, J) 'récupère dans la ligne J de TL la donnée en colonne J de TV
        Next J 'prochaine colonne de la boucle 2
        K = K + 1 'incrémente K (ajoute une colonne au tableau des lignes TL)
    End If 'fin de la condition
Next I 'prochaine ligne de la la boucle 1
If K > 1 Then Me.ListBox1.Column = TL 'si K est supérieure a 1, alimente la ListBox1 avec le tableau des lignes TL
With Me.ListBox1 'prend en compte la ListBox1
    For I = 0 To .ListCount - 1 'bocule sur tous les éléments de la ListBox1
        T = T + .Column(4, I) 'définit le total T en ajoutant les valeurs de de la colonne 4 (la cinquieme)
    Next I 'prochaine élément de la boucle
    Me.TextBox3.Value = T 'renvoie le total T dans la TextBox3
End With 'fin de la prose en compte de la ListBox1
End Sub

J'ai testé sur le fichier excel que je t'ai envoyé, en effet sa fonctionne !

Je vais essayer de la mettre sur mon vrai fichier.

Merci pour ton aide ! Et merci surtout pour les commentaires, on apprends de cette manière !

Toujours au top sur ce forum j'adore !

Bonjour tout le monde,

C'est top ton programme fonctionne parfaitement !

Juste une question, je cherche la fonction mais je ne la trouve pas. Si à l'intérieur de la ListBox je veux par exemple afficher les données issues des colonnes C2 et I2 uniquement, as tu une solution ?

Merci d'avance

Re,

Ça devrait donner ça :

Private Sub CommandButton1_Click() 'bouton "Valider"
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim NL As Long 'déclare la variable NL (Nombre de Lignes)
Dim NC As Byte 'déclare la variable NC (Nombre de Colonnes)
Dim I As Long 'déclare la variable I (Incrément)
Dim J As Byte 'déclare la variable J (incrément)
Dim K As Long 'déclare la variable K (incrément)
Dim DS As Double 'déclare la variable DS (Date Serial)
Dim TS As Double 'déclare la variable TS (Temps Serial)
Dim DD As Double 'déclare la variable DD (Date Double)
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)
Dim T As Long 'déclare la variable T (Total)

Me.ListBox1.Clear 'vide la ListBox1
TV = f.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
NL = UBound(TV, 1) 'définit le nombre de lignes NL du tableau des valeurs TV
NC = UBound(TV, 2) 'définit le nombre de colonnes NC du tableau des valeurs TV
K = 1 'initialise la variable K
For I = 2 To NL 'boucle 1 : sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
    DS = DateSerial(Year(TV(I, 3)), Month(TV(I, 3)), Day(TV(I, 3))) 'définit le numéro sérial DS de la date
    TS = TimeSerial(Hour(TV(I, 3)), Minute(TV(I, 3)), Second(TV(I, 3))) 'définit le numéro sérial TS de l'heure
    DD = DS + TS 'définit la date au format Double
    'condition : si les données de la lignes correspondent aux données des contrôles
    If TV(I, 6) = Me.ComboBox1.Value And TV(I, 2) = Me.ComboBox6.Value And TV(I, 1) = Me.ComboBox5.Value And CDate(DD) >= Me.ComboBox7.Value And CDate(DD) <= Me.ComboBox8.Value Then
        ReDim Preserve TL(1 To 2, 1 To K) 'redimensionne le tableau des lignes TL (autant de lignes que TV a de colonnes, K colonnes)
        TL(1, K) = TV(I, 3) 'récupère dans la ligne 1 de TL la donnée en colonne 3 (=C) de TV
        TL(2, K) = TV(I, 9) 'récupère dans la ligne 2 de TL la donnée en colonne 9 (=I) de TV
        K = K + 1 'incrémente K (ajoute une colonne au tableau des lignes TL)
    End If 'fin de la condition
Next I 'prochaine ligne de la la boucle 1
If K > 1 Then Me.ListBox1.Column = TL 'si K est supérieure a 1, alimente la ListBox1 avec le tableau des lignes TL
With Me.ListBox1 'prend en compte la ListBox1
For I = 0 To .ListCount - 1 'bocule sur tous les éléments de la ListBox1
T = T + .Column(1, I) 'définit le total T en ajoutant les valeurs de de la colonne 4 (la cinquieme)
Next I 'prochaine élément de la boucle
Me.TextBox3.Value = T 'renvoie le total T dans la TextBox3
End With 'fin de la prose en compte de la ListBox1
End Sub

Yep c'est tout bon !

Merci beaucoup

Bonjour ThauTheme,

Dis moi, si par exemple je rajoute dans la ListBox ( "ListBox1.ColumnCount = 3 " )

Je vais avoir la différenciation de mes colonnes, le problème et que je n'arrive pas à mettre un titre dans les entêtes.

Je ne sais pas si tu as des idées ?

En te remerciant d'avance

exemple
Rechercher des sujets similaires à "tri fonction valeurs combobox"