[Résolu] Alimenter une listview sans doublons+somme colonnes

Lone-wolf

XLDnaute Barbatruc
Bonjour à tous,

dans UsfVentes, j'aimerais visualiser les achats et ventes par mois avec la Listview, grâce à la feuille Recap. Comme il y a des doublons, je n'arrive pas à alimenter celle-ci et faire le total des entrées et sorties sur une ligne. J'ai mis aussi la feuille Achats_Ventes au cas où il y aurais besoin d'une feuille pour faire les totaux. Je demande donc, l'aide des experts pour solutionner mon problème, merci d'avance.

EDIT: voici en image le résultat provisoire.
usf.gif

Est-il possible d'avoir celui-ci sur une seule ligne?

Exemple: 187462 - Pince coupante - 29.07.2014 - Entrées: 10 - 29.07.2014 - Sorties: 20


A+ :cool:
 

Pièces jointes

  • Gestion-stock.zip
    383.2 KB · Affichages: 114
  • usf.gif
    usf.gif
    11.3 KB · Affichages: 188
Dernière édition:

Bebere

XLDnaute Barbatruc
Re : Alimenter une listview sans doublons+somme colonnes

bonjour LoneWolf,le forum
si problème avec dictionary, il faut cocher Microsoft Scripting Runtime dans outils,références

Code:
Private Sub Recherche_Change()
Dim F As Worksheet
Dim Plage As Range, c As Range
Dim T As String, Firstaddress As String
Dim x As Integer, k As Long, m As Long, n As Long, j As Byte, q As Variant
Dim lig As Long, val
Dim Tablo, dentree As New Dictionary, dsortie As New Dictionary

If Len(Recherche.Text) = 6 Then
          With Sheets("Recap")
          Tablo = .UsedRange
'          .Range ("a2:f65536")
'          Set cel = .Find(Recherche, , xlValues)
'            If Not cel Is Nothing Then
'                Firstaddress = cel.Address
'                Do
'                  Set cel = .FindNext(cel)
'                  tot1 = WorksheetFunction.Sum(cel.Offset(, 5))
'                    tot2 = WorksheetFunction.Sum(cel.Offset(, 3))
'                   Report = tot1 - tot2
'                   If tot2 > tot1 Then
'                   Report.ForeColor = vbRed
'                   Else
'                   Report.ForeColor = vbBlack
'                   End If
'                Loop While Not cel Is Nothing And cel.Address <> Firstaddress
'            End If
 End With
 
For i = 2 To UBound(Tablo, 1)
If IsDate(Tablo(i, 3)) Then
If Tablo(i, 1) = CDbl(Recherche) Then dentree(Tablo(i, 1) & "-" & Tablo(i, 2) & "-" & Tablo(i, 3)) = dentree(Tablo(i, 1) & "-" & Tablo(i, 2) & "-" & Tablo(i, 3)) + Tablo(i, 4)
End If
If IsDate(Tablo(i, 5)) Then
If Tablo(i, 1) = CDbl(Recherche) Then dsortie(Tablo(i, 1) & "-" & Tablo(i, 2) & "-" & Tablo(i, 5)) = dsortie(Tablo(i, 1) & "-" & Tablo(i, 2) & "-" & Tablo(i, 5)) + Tablo(i, 6)
End If
Next i

Me.ListView1.ListItems.Clear

For Each cle In dentree.Keys
a = cle
Me.ListView1.ListItems.Add , , Mid(cle, 1, 6)
x = Me.ListView1.ListItems.Count
a = Mid(cle, 8)
Me.ListView1.ListItems(x).ListSubItems.Add , , Mid(a, 1, InStr(a, "-") - 1)
a = Mid(a, InStr(a, "-") + 1)
Me.ListView1.ListItems(x).ListSubItems.Add , , a
Me.ListView1.ListItems(x).ListSubItems.Add , , dentree.Item(cle)
Next cle
Me.ListView1.ListItems(x).ListSubItems.Add , , ""
Me.ListView1.ListItems(x).ListSubItems.Add , , ""

For Each cle In dsortie.Keys
For i = 1 To Me.ListView1.ListItems.Count
If Me.ListView1.ListItems(i).Text = Mid(cle, 1, 6) And Me.ListView1.ListItems(x).ListSubItems(2).Text = Mid(cle, InStrRev(cle, "-") + 1) Then
Me.ListView1.ListItems(x).ListSubItems(4).Text = Me.ListView1.ListItems(x).ListSubItems(2).Text
Me.ListView1.ListItems(x).ListSubItems(5).Text = dsortie.Item(cle)

End If
Next i
Next cle

 End If
      
End Sub
 

Lone-wolf

XLDnaute Barbatruc
Re : Alimenter une listview sans doublons+somme colonnes

Bonsoir Bebere,

désolé de ne pas avoir répondu plus tôt, 1er août en Suisse, c'est la fête. ;)

En ce qui concerne Scripting, il me semble l'avoir déjà sélectionné. Et là, je te remercie infiniment pour le travail, c'est TOP!.


Très bonne soirée.


EDIT: serait-il posssible d'y ajouter un combo pour afficher un bilan mensuel, avec cette condition:

Si Valeur TextBox = Valeur Feuille et Si ComboBox(Date) = Valeur Feuille, alors afficher les résultats.




Amicalement Lone-wolf :cool:
 
Dernière édition:

Bebere

XLDnaute Barbatruc
Re : Alimenter une listview sans doublons+somme colonnes

bonjour Lonewolf
tu as bien raison d'abord la fête puis le reste
mis une listbox ,ainsi tu verras plusieurs lignes
2 labels qui contiennent les totaux entrée et sortie du mois
 

Pièces jointes

  • GestionDeStockloneWolf.xlsm
    644.1 KB · Affichages: 110

Lone-wolf

XLDnaute Barbatruc
Re : Alimenter une listview sans doublons+somme colonnes

Bonjour Bebere,

L'idée est très bien, bravo! ;)

Là j'ai une erreur "Utilisation incorrecte de Null" ici:

For i = 0 To Me.ListBox1.ListCount - 1
e = e + Me.ListBox1.List(i, 1)
s = s + Me.ListBox1.List(i, 2)
Next i

Ensuite il faudra apporter des modifications pour qu'il prenne en compte ceci:
Admettons qu'il y a eu un entrée au mois de Juillet ou autre mois, et que cette entrée est sortie ce mois; celle-ci n'est pas affichée dans la liste. Il faudrait la prendre en consideration. Je ne sais pas si tu comprend.


A+ :cool:
 

Bebere

XLDnaute Barbatruc
Re : Alimenter une listview sans doublons+somme colonnes

bonjour LoneWolf
C'est un départ maintenant je cherche à gérer le tout
tu n'auras pas toujours entrée et sortie
edit: une proposition,à la place de la textbox recherche mettre une combobox
 
Dernière édition:

Lone-wolf

XLDnaute Barbatruc
Re : Alimenter une listview sans doublons+somme colonnes

Bonjour Bebere,

à la place de la textbox recherche mettre une combobox

oui mais, la textbox(1er critère) est utile; la combobox (2ème critère de recherche) vas servir pour les mois. Le problème avec la combo: comment afficher dans celle-ci (Janvier-Février-Mars etc) vus que dans la feuille les dates sont numériques.

Résumé: Recherche-moi les entrées ou sorties du code article 187458 du mois sélectionné.


A+ :cool:
 

Lone-wolf

XLDnaute Barbatruc
Re : Alimenter une listview sans doublons+somme colonnes

Re Bebere,

je pense avoir trouver le moyen d'afficher les dates en mois-texte pour la Combobox.

Code:
'Dans la feuille Recap
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Range("l2") = UserForm1.ComboBox1.Value
Range("n2") = Mid(Range("l2"), 4, 2)
Range("n2") = Format(Range("l2"), "mmmm")
Application.EnableEvents = True
End Sub

'Dans le formulaire
Private Sub ComboBox1_Change()
Feuil2.Range("l2").Value = ComboBox1.Value
ComboBox1.Value = Feuil2.Range("n2").Value
End Sub

Private Sub UserForm_Initialize()
    Dim j As Integer
    With Feuil2
    For j = 2 To .Range("c65536").End(xlUp).Row
        ComboBox1 = .Range("c" & j)
        If ComboBox1.ListIndex = -1 Then ComboBox1.AddItem Format(.Range("c" & j), "mmmm")
    Next j
    End With
End Sub

Maintenant pour coder comme je l'ai expliqué dans le post précédent, je ne sais pas comment faire.

Edit: Le code est bien pour mettre en texte, mais n'est pas concluant pour le reste de la macro.



A+ :cool:
 

Bebere

XLDnaute Barbatruc
Re : Alimenter une listview sans doublons+somme colonnes

bonjour LoneWolf
tu peux garder la textbox
une cascade
choix mois combobox1 initialise combobox2 avec les n°article du mois choisi
voilà un exemple de code
Code:
Private Sub ComboBox1_Change()

If Me.ComboBox1 <> "" Then
Me.ComboBox2.Clear
    Set Dico = New Dictionary
For i = 1 To UBound(Tablo)
If Format(Tablo(i, 3), "mmmm") = Me.ComboBox1 Then Dico(Tablo(i, 1)) = Tablo(i, 1)
If Format(Tablo(i, 5), "mmmm") = Me.ComboBox1 Then Dico(Tablo(i, 1)) = Tablo(i, 1)
Next i
Me.ComboBox2.List = Dico.Items
End If

End Sub
 

Lone-wolf

XLDnaute Barbatruc
Re : Alimenter une listview sans doublons+somme colonnes

Bonjour Bebere,

j'ai trouvé la solution concernant l'affichage des mois en lettre dans la combo1 pour qu'elle fasse la recherche et mis les années dans la combo2. J'ai aussi supprimer (dans le classeur original) les lignes de code concernant les "-" qui causaient problèmes; et dans ce classeur, plus besoin de ListBox et TextBox.

Code:
Public mois, ms, msv, annee, an, temp

Private Sub CmbAnnee_Change()
Dim critere1 As String, critere2 As String, critere3 As String, _
k As Long, i As Integer, wksh As Worksheet

    If Me.TxtCode <> "-" Then critere1 = Me.TxtCode
    If Me.CmbMois <> "-" Then critere2 = Me.CmbMois
    If Me.CmbAnnee <> "-" Then critere3 = Me.CmbAnnee

    Me.LvEtats.ListItems.Clear
    Set wksh = Sheets("Feuil1")
         With wksh
         For i = 2 To .Range("c" & Cells.Rows.Count).End(xlUp).Row
         msv = MonthName(CLng(Mid(.Range("c" & i), 4, 2)))
         an = Right(.Range("c" & i), 4)
        If .Range("a" & i).Value Like critere1 And msv Like critere2 And an Like critere3 Then

         With Me.LvEtats
         k = k + 1
            .ListItems.Add , , wksh.Range("a" & i)
            .ListItems(k).ListSubItems.Add , , wksh.Range("b" & i)
            .ListItems(k).ListSubItems.Add , , wksh.Range("c" & i)
            .ListItems(k).ListSubItems.Add , , wksh.Range("d" & i)
            .ListItems(k).ListSubItems.Add , , wksh.Range("e" & i)
            .ListItems(k).ListSubItems.Add , , wksh.Range("f" & i)
        End With
        End If
        Next
    End With
End Sub

Private Sub UserForm_Activate()
Me.CmbMois.Text = ""
Me.CmbAnnee.Text = ""
End Sub

Private Sub UserForm_Initialize()
Dim i As Integer, j As Integer, k As Integer, x As Long, y As Long

    With Me.LvEtats
        .Gridlines = True
        .View = lvwReport
        .ColumnHeaders.Add Text:="ID", Width:=35
        .ColumnHeaders.Add Text:="Produits", Width:=98
        .ColumnHeaders.Add Text:="Date Entrées", Width:=65, Alignment:=fmAlignmentRight
        .ColumnHeaders.Add Text:="Entrées", Width:=44, Alignment:=fmAlignmentRight
        .ColumnHeaders.Add Text:="Date Sorties", Width:=65, Alignment:=fmAlignmentRight
        .ColumnHeaders.Add Text:="Sorties", Width:=42, Alignment:=fmAlignmentRight
    End With

    With Feuil1
For k = 2 To .Range("c65536").End(xlUp).Row
ms = MonthName(CLng(Mid(.Cells(k, 3), 4, 2)))
Set mois = .Cells(k, 3)
mois = ms

an = Right(.Cells(k, 3), 4)
Set annee = .Cells(k, 3)
annee = an

    For i = 2 To .Range("c65536").End(xlUp).Row
        Me.CmbMois = mois
        If Me.CmbMois.ListIndex = -1 Then Me.CmbMois.AddItem mois
    Next i

        For j = 2 To .Range("c65536").End(xlUp).Row
        Me.CmbAnnee = annee
        If Me.CmbAnnee.ListIndex = -1 Then Me.CmbAnnee.AddItem annee
    Next j
        Next k
    End With
    
    With Me.CmbMois
For x = 0 To .ListCount - 1
    For y = 0 To .ListCount - 1
        If .List(x) > .List(y) Then
            temp = .List(x)
            .List(x) = .List(y)
            .List(y) = temp
        End If
    Next y
Next x
End With

    With Me.CmbAnnee
For x = 0 To .ListCount - 1
    For y = 0 To .ListCount - 1
        If .List(x) < .List(y) Then
            temp = .List(x)
            .List(x) = .List(y)
            .List(y) = temp
        End If
    Next y
Next x
End With
End Sub

Voir le classeur modèle en PJ


A+ :cool:
 

Pièces jointes

  • Classeur1.xls
    59 KB · Affichages: 119
  • Classeur1.xls
    59 KB · Affichages: 116
  • Classeur1.xls
    59 KB · Affichages: 84
Dernière édition:

Bebere

XLDnaute Barbatruc
Re : Alimenter une listview sans doublons+somme colonnes

bonjour LoneWolf
changé le code,mis un commentaire où changement
rmq:les combobox ne sont pas en cascade et ne prennent pas les dates de sorties
tu devrais commencé par année et ensuite par mois
tu n'as pas de somme dans listview
 

Pièces jointes

  • ClasseurLoneWolf.xls
    78 KB · Affichages: 74
  • ClasseurLoneWolf.xls
    78 KB · Affichages: 100
  • ClasseurLoneWolf.xls
    78 KB · Affichages: 106

Lone-wolf

XLDnaute Barbatruc
Re : Alimenter une listview sans doublons+somme colonnes

Bonjour Bebere,

le dernier fichier n'est pas opérationnel, pourtant j'ai fait comme tu as dit. La Combo affiche 5-6-7 au lieu de mai-juin-juillet et ne trouve rien. Quand au totaux (entrées - sorties), j'ai fait autrement dans le fichier original.

Dans tous les cas, merci infiniment pour ton aide.


Amicalement
Lone-wolf :cool:
 

Bebere

XLDnaute Barbatruc
Re : [Résolu] Alimenter une listview sans doublons+somme colonnes

bonjour LoneWolf
tu entres un code ,choix d'un mois,d'une année et si code présent dans le mois et l'année donne un résultat
pour moi une cascade année,mois et code te donnerai toujours un résultat
as tu lu le poste #11
 

Discussions similaires

Statistiques des forums

Discussions
312 109
Messages
2 085 381
Membres
102 876
dernier inscrit
BouteilleMan