Additionner une colonne dans un UserForm dynamique [Résolu]

itzik92 - 11 nov. 2013 à 19:00 - Dernière réponse : ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention
- 22 nov. 2013 à 17:08
Bonjour,
Je souhaite avoir dans le TextBox2, le total des articles figurant dans une colonne L,6 dans un UserForm dynamique, par exp:
Sub init()
Dim DerLgn As Integer, C As Byte



    With Me.ListView1
        With .ColumnHeaders
            .Clear
            
            .Add , , Worksheets("Ventas").Cells(4, 1), 70
            .Add , , Worksheets("Ventas").Cells(4, 2), 70
            .Add , , Worksheets("Ventas").Cells(4, 3), 160
            .Add , , Worksheets("Ventas").Cells(4, 4), 60
            .Add , , Worksheets("Ventas").Cells(4, 5), 90, 1
            .Add , , Worksheets("Ventas").Cells(4, 6), 60, 1
            .Add , , Worksheets("Ventas").Cells(4, 7), 50, 1
            .Add , , Worksheets("Ventas").Cells(4, 8), 70, 1
            .Add , , Worksheets("Ventas").Cells(4, 9), 70, 1
            
         End With
        .Gridlines = True
        .LabelEdit = 1
        .View = lvwReport
            With ThisWorkbook.Worksheets("Ventas")
                .Activate
                
                DerLgn = .Range("A65535").End(xlUp).Row
                TabTemp = .Range(.Cells(6, 1), .Cells(DerLgn, 9)).Value
            End With
            x = 1
            For L = 1 To UBound(TabTemp, 1)
                .ListItems.Add , , TabTemp(L, 1)
                .ListItems(x).ListSubItems.Add , , TabTemp(L, 2)
                .ListItems(x).ListSubItems.Add , , TabTemp(L, 3)
                .ListItems(x).ListSubItems.Add , , TabTemp(L, 4)
                .ListItems(x).ListSubItems.Add , , TabTemp(L, 5)
                .ListItems(x).ListSubItems.Add , , Format(TabTemp(L, 6), "###,##0")
                .ListItems(x).ListSubItems.Add , , Format(TabTemp(L, 7), "##0.00")
                .ListItems(x).ListSubItems.Add , , Format(TabTemp(L, 8), "###,##0.00")
                .ListItems(x).ListSubItems.Add , , Format(TabTemp(L, 9), "###,##0.00")
               x = x + 1
        Next
      
    End With
    
   
IniCombobox

End Sub
Afficher la suite 

Votre réponse

23 réponses

jordane45 22098 Messages postés mercredi 22 octobre 2003Date d'inscriptionContributeurStatut 17 août 2018 Dernière intervention - 12 nov. 2013 à 01:52
0
Merci
Bonjour,

Je ne comprend pas vraiment la question...

Déjà .. un userform Dynamique.. qu'est-ce que c'est ?
Ensuite vous nous parlez de colonne L,6 ... pour moi ça ressemble plus aux coordonnées d'une cellule ( du listView je suppose )...

enfin, le total des articles... le nombre d'articles présents dans votre listview ? => UBound(TabTemp, 1)
.. Sinon il existe aussi la méthode COUNT..

Bref, si mes réponses ne correspondent pas à ce que vous cherchez.. je vous invite à reformuler votre question en nous donnant plus d'informations sur ce que vous souhaitez faire.

jordane45 22098 Messages postés mercredi 22 octobre 2003Date d'inscriptionContributeurStatut 17 août 2018 Dernière intervention - 12 nov. 2013 à 08:22
Et c'est la somme de tous les éléments presents dans la liste ou seulementde ceux ssélectionnés ?
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 12 nov. 2013 à 08:28
Bonjour,
J'ai à première lecture l'impression de ce qu'une listbox liée suffirait (en lieu et place de ces ajouts par add).
Et pour l'addition : la question posée par jordane45 est en effet très importante dans la mesure où la réponse conditionnera le choix de la méthode.
Bonjour,
C'est juste sur deux colonnes de la ListView qu'il faut faire le total : la 6eme "cantidad" et la 9ème "Total ttc" ,
Sur ce UserForm il y a 2 boutons d'option 1: pour un filtre unique et 2: pour filtre en cascade , avec 5 ComboBox
Cordialement
Itzik92
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 12 nov. 2013 à 18:14
Mis à part ce que j'ai déjà dit plus haut (utilisation d'une listbox liée qui éviterait ces boucles...)
Qu'est donc chacun de tes totaux, sinon celui de la plage correspondante ? Le même !
ainsi (exemple) le total de ta 6ème colonne n'est rien d'autre que celui de la plage
Worksheets("Ventas").Range("F4:F" & DerLgn)
et est donc :
WorksheetFunction.sum(Worksheets("Ventas").Range("F4:F" & DerLgn))

Je me demande accessoirement l'intérêt de faire la dépense d'une textbox pour un simple affichage. Un label suffirait.
Bonsoir et merci pour vos réponses,

Ucfoutu ton code fait le total de la colonne "F" de la Feuile "Ventas" or ce que moi je voudrais c'est d'avoir le total des sommes qui s'affichent dans la 6ème et la 9ème colonne dans ma ListView du UserForm1

Merci d'avance,

itzik92
Commenter la réponse de jordane45
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 12 nov. 2013 à 23:27
0
Merci
pas du tout !
Puisque tu as écrit :
TabTemp = .Range(.Cells(6, 1), .Cells(DerLgn, 9)).Value

et qu'ensuite, par :
For L = 1 To UBound(TabTemp, 1)

tu ajoutes bien à ta listview autant de lignes que de lignes du tableau
Le total fait par( mon code est donc bien celui attendu (jusqu'à derlgn) !
Merci ucfoutu, grace à ta reprise du code je viens de voir l'erreur: (Cells(5, 1) et non à la 6eme ligne.
Ok d'accord avec toi, ton code c'est pour afficher le "Total" de la colonne 6 de la Feuille "Ventas" Or j'ai expliqué qu'il y a 2 boutons d'option pour filtrer les informations sur le Formulaire1 et je souhaites afficher sur ce UserForm (Label ou TextBox) les totaux par colonne les valeurs obtenues par les filtres et non pas les valeurs de la Feui!Ventas
Cordialement
itzik92
jordane45 22098 Messages postés mercredi 22 octobre 2003Date d'inscriptionContributeurStatut 17 août 2018 Dernière intervention - 13 nov. 2013 à 00:31
Merci jordane45 c'est tout à fait ça qu'il me faut je vais l'adapter sur ma BD
Merc beaucoup a tous,

Sur le conseil de jordan45, J'ai rajouté ce code:


 Dim Total1 As Double
 Dim Total2 As Double

Total1 = Total1 + TabTemp(L, 9)
           Total2 = Total2 + TabTemp(L, 6)
       End If
       
     Next L
      TextBox1.Value = Total1
     TextBox1 = Format(Total1, "###,##0.00")
     TextBox2.Value = Total2
     TextBox2 = Format(Total2, "###,##0")
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 13 nov. 2013 à 08:24
0
Merci
Toujours pas compris ton affaire de filtres.
Tu filtres quoi et comment (ton code de filtrage) ?
Je reste sur l'impression que l'on passe là "à côté de la plaque" et que l'on peut éviter toutes ces boucles et travailler de manière plus agile et orthodoxe.
Commenter la réponse de ucfoutu
0
Merci
Bonjour ucfoutu,

voici le code du ComboBox2 (il y en a 5 au total) pour filtrer la ListView par le nom du "Clients" (Col 3).
Je suis intéresser par tes observations, si tu penses que l'on peut faire autrement ?
Mon souci dans cette BD (qui va jusqu'a la ligne 317) , si j'en rajoute encore 700 lignes pour la saisie , ça va très lentement, car sur ma Feuil!Ventas j'ai des formules (NB.SI, INDEX, EQUIV et des SI Imbriqués ,, etc. )

2ème probleme:
Mon 1er PC est avec Excel version 2003
Mon deuxieme ordinateur Mac est avec Excel version 2007 ne peut pas ouvrir le UserForm , un message indique qu'il manque "Microsoft Windows Common 6 SP),

Private Sub ComboBox2_Click()
Dim Total1 As Double
Dim Total2 As Double
x = 0
If OptionButton1.Value = True Then
  With Me.ListView1
   .FullRowSelect = True
   .ListItems.Clear
     For L = 1 To UBound(TabTemp, 1)
       If TabTemp(L, 3) = ComboBox2.Value Then
          x = x + 1
         .ListItems.Add , , TabTemp(L, 1)
                .ListItems(x).ListSubItems.Add , , TabTemp(L, 2)
                .ListItems(x).ListSubItems.Add , , TabTemp(L, 3)
                .ListItems(x).ListSubItems.Add , , TabTemp(L, 4)
                .ListItems(x).ListSubItems.Add , , TabTemp(L, 5)
                .ListItems(x).ListSubItems.Add , , Format(TabTemp(L, 6), "###,##0")
                .ListItems(x).ListSubItems.Add , , Format(TabTemp(L, 7), "##0.00")
                .ListItems(x).ListSubItems.Add , , Format(TabTemp(L, 8), "###,##0.00")
                .ListItems(x).ListSubItems.Add , , Format(TabTemp(L, 9), "###,##0.00")
        Total1 = Total1 + TabTemp(L, 9)
        Total2 = Total2 + TabTemp(L, 6)
       End If
     Next L
      TextBox1.Value = Total1
        TextBox1 = Format(Total1, "###,##0.00")
       TextBox2.Value = Total2
    TextBox2 = Format(Total2, "###,##0")
   
      
       ListView1.SetFocus
  End With
  Vide_Combo 2
  
End If

If OptionButton2.Value = True Then
 With Me.ListView1
  .FullRowSelect = True
   .ListItems.Clear
     For L = 1 To UBound(TabTemp, 1)
       If TabTemp(L, 3) = ComboBox2 And TabTemp(L, 1) = ComboBox1 Then
          x = x + 1
           .ListItems.Add , , TabTemp(L, 1)
                .ListItems(x).ListSubItems.Add , , TabTemp(L, 2)
                .ListItems(x).ListSubItems.Add , , TabTemp(L, 3)
                .ListItems(x).ListSubItems.Add , , TabTemp(L, 4)
                .ListItems(x).ListSubItems.Add , , TabTemp(L, 5)
                .ListItems(x).ListSubItems.Add , , Format(TabTemp(L, 6), "###,##0")
                .ListItems(x).ListSubItems.Add , , Format(TabTemp(L, 7), "##0.00")
                .ListItems(x).ListSubItems.Add , , Format(TabTemp(L, 8), "###,##0.00")
                .ListItems(x).ListSubItems.Add , , Format(TabTemp(L, 9), "###,##0.00")
              Total1 = Total1 + TabTemp(L, 9)
            Total2 = Total2 + TabTemp(L, 6)
       End If
     Next L
     TextBox1.Value = Total1
        TextBox1 = Format(Total1, "###,##0.00")
       TextBox2.Value = Total2
     TextBox2 = Format(Total2, "###,##0")
     
      
       ListView1.SetFocus
 End With
 ComboBox3.Clear
 ComboBox4.Clear
 ComboBox5.Clear
 Alim_Combo 3, 3
End If
End Sub


Merci d'avance,
itzik92
Commenter la réponse de itzik92
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 13 nov. 2013 à 20:46
0
Merci
Je ne peux traiter ton problème sur Mac (que je n'ai pas)
Je vois demain l'aspect Windows (fatigué, ce soir).
Commenter la réponse de ucfoutu
0
Merci
ok merci, comme je suis actuellement au Mexique( -7h ), il est 14h chez moi,
Commenter la réponse de itzik92
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 14 nov. 2013 à 07:31
0
Merci
Avant d'aller plus loin aujourd'hui :
Ces propos appellent mon attention :
" Mon souci dans cette BD (qui va jusqu'a la ligne 317) , si j'en rajoute encore 700 lignes pour la saisie , ça va très lentement, car sur ma Feuil!Ventas j'ai des formules (NB.SI, INDEX, EQUIV et des SI Imbriqués ,, etc. ) "
Or, ils n'ont aucun rapport averc le code que tu montres (qui, lui, n'écrit rien sur ta feuille de calcul !)
Explique ...
Bonjour,
Effectivement , ce code n'a rien à voir avec la saisie des données de la Feuil!Ventas, c'est juste un formulaire de recherche avec filtres.
Comment fait on pour joindre mon fichier ?
Bonjour,
Le probleme avec mon programme, il ralenti enormement à partir de la ligne 350 -400,
Quelqu'un a une idée si c'est possible et comment ameliorer ça,?

Comment faire pour joindre mon fichier ?
Excel 2003 (taille: 1,14 MO )

Merci d'avance
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 22/11/2013 à 08:09
0
Merci
Il me semble que je t'en avais parlé plus haut.
Ce n'est pas ton code, qu'il te faut changer, mais carrément changer ton fusil d'épaule (changer carrément de méthode).
En tes lieux et place :
- j'utiliserais la méthode find pour constituer (sur la base de ton filtre) une plage que je copierais sur une feuille ad-hoc
- j'utiliserais ensuite une listbox (et non une listview) liée au usedrange de la feuille ad-hoc en question
- et puisque liée à une plage, j'utiliserais alors très facilement Worksheetfunction.sum pour calculer mon total sur la colonne de mon choix dans cette plage.

Une listview (ton choix actuel) ne permet pas ce genre de liaison. Et du coup : tout est ralenti de manière significative (les additems en boucle, le calcul à chaque ajout, etc ...)
Comme tu le vois, ce ne serait donc pas une modification de ton code, mais un mécanisme totalement distinct du tien.

Conclusion :
1) si tu changes de mécanisme pour celui suggéré :
- ou tu n'as aucune difficulté à le mettre en oeuvre (et voilà donc ..)
- ou tu rencontres une difficulté dans telle ou telle autre étape (isolée) parmi celles que je t'ai décrites ===>> il te faudra alors ouvrir une discussion à ce SEUL sujet (pas à celui de ton appli dans son ensemble)
2) si tu t'obstines dans ton mécanisme actuel, la seule possibilité de gagner un peu (pas tellement) en vitesse d'exécution sera alors de mettre à False la propriété visible de ta listview en début de traitement, puis à true in fine.
Voilà voilà.



________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 22 nov. 2013 à 08:23
0
Merci
Tu pourrais même, encore plus astucieusement :
- copier toute la plage à traiter sur une feuille ad hoc (comme dit plus haut)
- appliquer la méthode Autofilter à cette plage sur la feuille ad-hoc (aucune boucle Find, de cette manière)
- n'y laisser d'un seul coup que les lignes visibles (specialcells.xlCellTypeVisible)
- lier cette plage résultante à la listbox
le reste à l'identique (voir plus haut)
je souhaite joindre mon fichier , comment fait-on ?
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 22 nov. 2013 à 17:08
Ne le joins pas ! Seuls les moins prudents (je ne suis pas l'un d'entre eux) prendraient le risque d'ouvrir un classeur Excel venant d'unbe autre machine (je le dirai jamais assez souvent).
Ici, on sait s'expliquer sans besoin de montrer autre chose que le code concerné.
Commenter la réponse de ucfoutu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.