filtrer base de donnée par userform

jtitin

XLDnaute Occasionnel
Bonjour à tous

je ne parvient pas à finaliser le code du fichier ci joint
dans un userform je filtre la 1ère colonne par une listbox1 (des Dates sans doublons)
je sélectionne une date dans la listbox1 puis je clic sur le bouton
je voudrais faire s'incrémenter dans les textbox les valeur recherchées en fonction de la date

mais je ne parviens pas au résultat
j'ai fait juste un essai pour la textbox1 et le résultat reste à 0

merci pour votre aide et conseil
 

Pièces jointes

  • Classeur1.xlsm
    21.4 KB · Affichages: 51
  • Classeur1.xlsm
    21.4 KB · Affichages: 71
  • Classeur1.xlsm
    21.4 KB · Affichages: 71

Paf

XLDnaute Barbatruc
Re : filtrer base de donnée par userform

Bonjour

Dans Private Sub filtre() , le test If ListBox1.List(j) = tablo(i, 1) Then n'est jamais vrai car les deux éléments n'ont pas le même type .
Apporter cette modif : If ListBox1.List(j) = CDate(tablo(i, 1)) Then

Ensuite le test If tablo(i, 6) = "X" Then ne sera jamais vrai, car les X sont plutôt en tablo(i, 5)

Et le nombre de X est à faire apparaître en TextBox1, donc modifier TextBox2 = NbX

A+ et bon courage
 

jtitin

XLDnaute Occasionnel
Re : filtrer base de donnée par userform

merci Paf pour ta réponse
oui c'est vrais pour la colonne et la textbox, c'est à force de tourner et retouner ce code je n'ai pas remi comme c'était quant mon résultat était = 0

merci pour ce CDate
je vais essayer pour les autres textbox à trouvé le résultat
mais dois-je resté dans la même boucle ou faire une autre boucle pour chaques résultats à trouvés

merci encore
 

Paf

XLDnaute Barbatruc
Re : filtrer base de donnée par userform

Re et bonjour herve62

@ jtitin il faut rester dans la même boucle (ça marcherait aussi d'en faire plusieurs mais c'est du gaspillage!)
par exemple
Code:
            If ListBox1.List(j) = CDate(tablo(i, 1)) Then
                
                If tablo(i, 5) = "X" Then NbX = NbX + 1
                If tablo(i, 4) > 0 Then Npos = Npos + 1
                If tablo(i, 4) < 0 Then Nneg = Nneg + 1
                ...
                ...
            End If


@ herve62 :
Paf : si t'as le temps , j'en aide un autre KOD... mais je coince !!
ben ... oui... mais où ? un lien ?

A+
 

jtitin

XLDnaute Occasionnel
Re : filtrer base de donnée par userform

Ok merci pour la réponse
j'ai continué dans ce sens mais je ne trouve pas pour la colonne 7 ( Ref)

je cherche à récupérer combien il y a de chiffres différent ( pas de doublons) dans la colonne 7


For i = 1 To UBound(tablo)
For j = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(j) Then
If ListBox1.List(j) = CDate(tablo(i, 1)) Then

If tablo(i, 5) = "X" Then
NbX = NbX + 1
End If
If tablo(i, 5) = "" Then
Nb = Nb + 1
End If
If tablo(i, 6) = "OUI" Then
Nboui = Nboui + 1
End If
If tablo(i, 4) > 0 Then
TotP = TotP + tablo(i, 4)
End If
If tablo(i, 4) < 0 Then
TotN = TotN + tablo(i, 4)
End If

'''''''ICI POUR NbRef colonne 7 le chiffres différents

End If
End If
Next j
Next i
TextBox1 = NbX
TextBox4 = Nboui
TextBox2 = TotP
TextBox3 = TotN
TextBox5 = Nb
'TextBox6 = NbRef

Merci
 

Paf

XLDnaute Barbatruc
Re : filtrer base de donnée par userform

Re re

@ herve62 : j'ai mis un lien sur la discussion, vers le site de J.Boisgontier

@ jtitin :

Pour les références sans doublon c'est différent. Il faut utiliser l'objet dictionary pour avoir une liste des référence avec le nombre de fois où elles apparaissent puis refiltrer sur celles qui n'apparaissent qu'une fois.

NB: s'il n'y a qu'une instruction après Then, on peut omettre le End If si on l'écrit sur la même ligne
Code:
...
Dim MonDico, MonDico2
Set MonDico = CreateObject("Scripting.Dictionary")

For i = 1 To UBound(tablo)
   For j = 0 To ListBox1.ListCount - 1
      If ListBox1.Selected(j) Then
          If ListBox1.List(j) = CDate(tablo(i, 1)) Then
             If tablo(i, 5) = "X" Then NbX = NbX + 1
             If tablo(i, 5) = "" Then Nb = Nb + 1
             If tablo(i, 6) = "OUI" Then Nboui = Nboui + 1
             If tablo(i, 4) > 0 Then TotP = TotP + tablo(i, 4)
             If tablo(i, 4) < 0 Then TotN = TotN + tablo(i, 4)
             MonDico(tablo(i, 7)) = MonDico(tablo(i, 7)) + 1
         End If
      End If
   Next j
Next i
TextBox1 = NbX
TextBox4 = Nboui
TextBox2 = TotP
TextBox3 = TotN
TextBox5 = Nb

Set MonDico2 = CreateObject("Scripting.Dictionary")
For Each C In MonDico.keys
   If MonDico(C) = 1 Then MonDico2(C) = ""
Next
TextBox6 = MonDico2.Count
...

A+
 

jtitin

XLDnaute Occasionnel
Re : filtrer base de donnée par userform

Encore un merci Paf

pour les explications
mais je n'obtient pas le résultat recherche sur la colonne 7
le résultat est = 0 pour chaque date sélectionnée
il devrait être à 5 pour le 1ere date (5 chiffres différents)
et 3 pour la 2ème ( 3 chiffres différents)

je joint le fichier modifié
 

Pièces jointes

  • Classeur1.xlsm
    27.2 KB · Affichages: 58
  • Classeur1.xlsm
    27.2 KB · Affichages: 77
  • Classeur1.xlsm
    27.2 KB · Affichages: 79

Paf

XLDnaute Barbatruc
Re : filtrer base de donnée par userform

Re

on ne doit pas s'entendre sur le contenu de la textbox6.

Je vois son "intitulé" :Nb Ref: sans doublons donc pour moi il faut faire afficher pour une date les N° de référence unique

s'il s'agit de compter les références différentes, modifier comme ça:

Code:
...
TextBox1 = NbX
TextBox4 = Nboui
TextBox2 = TotP
TextBox3 = TotN
TextBox5 = Nb
TextBox6 = MonDico.Count
...

le reste sans changement ( on peut quand même supprimer la déclaration de MonDico2 dans Dim MonDico, MonDico2)

et là on tombe bien sur les chiffres attendus

A+
 

jtitin

XLDnaute Occasionnel
Re : filtrer base de donnée par userform

bonsoir à tous
je reviens une nouvelle fois vous demandez de l'aide
Pour le même fichier du début de cette discussion avec l'aide de Paf
voici ma demande:

Dans le formulaire je sélectionne une date de la listbox
puis je valide la sélection par le bouton ->

je cherche à incrémenter dans la feuil "Récap" pour la date sélectionnée :
toutes les différentes valeurs de la colonne 3 si il y a un " X " dans la colonne 5

Ci dessous exemple pour la date du 22/02/2015 le résultat à obtenir dans la feuil "Récap":

Campagnarde 1
Bolognaise 2
Arménienne 2
Norvégienne 4
Suédoise 3
Végétarienne 1
Paysanne 1

Merci
 

Pièces jointes

  • Classeur2.xlsm
    28.9 KB · Affichages: 76
  • Classeur2.xlsm
    28.9 KB · Affichages: 66
  • Classeur2.xlsm
    28.9 KB · Affichages: 48

jtitin

XLDnaute Occasionnel
Re : filtrer base de donnée par userform

j'ai trouvé, je l'avait devant le nez, Paf va crier...

For i = 1 To UBound(tablo)
For j = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(j) Then
If ListBox1.List(j) = CDate(tablo(i, 1)) Then
'---------
'----------
If tablo(i, 5) = "X" Then
MonDico(tablo(i, 3)) = MonDico(tablo(i, 3)) + 1
End If
End If
End If
Next j
Next i
Sheets("Récap").Range("B2").Resize(MonDico.Count, 1) = Application.Transpose(MonDico.keys)
Sheets("Récap").Range("C2").Resize(MonDico.Count, 1) = Application.Transpose(MonDico.items)
 

jtitin

XLDnaute Occasionnel
Re : filtrer base de donnée par userform

bonjour
je revient vers vous avec ce sujet car j'ai une ligne du code qui bug avec l'objet dictionary .
Si dans la colonne 3 rien n'est trouvé:

If tablo(i, 3) = "Vin Rouge" Or tablo(i, 3) = "Vin Rosé" Or tablo(i, 3) = "Vin Rouge 75cl" Or _
tablo(i, 3) = "Vin Rosé 75cl" Or tablo(i, 3) = "Heineken" Then
MonDico2(tablo(i, 3)) = MonDico2(tablo(i, 3)) + 1
End If


la ligne ci dessous bugue:

Sheets("Récap").Range("D2").Resize(MonDico2.Count, 1) = Application.Transpose(MonDico2.keys)

comment éviter cette erreur
c'est à dire si MonDico2 est vide ne rien transposer ou écrire 0 dans les 2 colonnes "D" et "E" feuil "Récap"

je vous joint le fichier
la sélection de la date du 21/02/2015 bugue ( pas de Vin rouge ......)
celle du 22/02/2015 fonctionne ( il y a du Vin Rouge.....)

merci
 

Pièces jointes

  • Classeur3.xlsm
    32.1 KB · Affichages: 56
  • Classeur3.xlsm
    32.1 KB · Affichages: 79
  • Classeur3.xlsm
    32.1 KB · Affichages: 86

Paf

XLDnaute Barbatruc
Re : filtrer base de donnée par userform

Bonjour

avant d'écrire les données, tester Dico.count qui donne le nombre d'éléments :

Code:
If MonDico2.Count > 0 Then
   Sheets("Récap").Range("D2").Resize(MonDico2.Count, 1) = Application.Transpose(MonDico2.keys)
   Sheets("Récap").Range("E2").Resize(MonDico2.Count, 1) = Application.Transpose(MonDico2.items)
End if

A+
 

Discussions similaires

Réponses
19
Affichages
615
Réponses
93
Affichages
2 K

Statistiques des forums

Discussions
312 176
Messages
2 085 967
Membres
103 072
dernier inscrit
Remithesix