Tableaux dans vba

akni

XLDnaute Nouveau
Bonjour,
J'ai un tableau des quantités vendues par articles, clients et mois, je veux faire une récap par client sans passer par TCD quand j'utilise la méthode FOR NEXT elle tarde un peu, je crois qu'avec les tableaux Ubound et Lbound le résultat sera rapide.
ci joint mon fichier avec la macro FOR NEXT.


Merci beaucoup pour toute aide.
 

Pièces jointes

  • test Tableau 2.xlsm
    1.8 MB · Affichages: 116

Dranreb

XLDnaute Barbatruc
Bonjour.
1) — Parce que ListObjects est une Collection attachée à tout objet Worksheet au même titre que les collections Shapes, ChartObjects, HyperLinks et quelles autres que je connais moins bien.
Chaque membre de cette collection est un objet de type ListObject, lequel a pour rôle de représenter dans VBA un tableau Excel.
Oui, un ListObject est muni de nombreuses propriétés dont certaines sont des collections. Et la propriété Name d'un membre de sa collection ListColumns est le titre de la colonne.
2) — Le second paramètre de la fonction DicInvent ne désigne pas forcément une colonne des données d'entrée. C'est un cas particulier ici parce que toutes les colonnes précédentes sont à la même place dans le résultat souhaité et dans les données. On ne peut y préciser qu'un numéro de colonne dans le résultat souhaité.
3) — Je n'ai calculé que les numéros des colonnes dont on avait besoin en dehors de celles qu'on peut préciser à Gigogne par leurs noms.
 

KIM

XLDnaute Accro
Bonsoir Dranreb et le forum,
Une question pour simplifier un code qui fonctionne.
J'ai 5 niveau de SsGr avec For Each OP In Gigogne(PlgDon, 17, 1, 2, 7, ColTitre)
Au 5è niveau For Each Détail In Statut.Co
je rajoute des conditions par exemple If Détail(24) = "OUI" Then etc.

Au niveau du 3è SsGr j'ai le code suivant :
For Each SIT In DPT.Co
TS(L, 5) = TS(L, 5) + SIT.Count
TS(L, 10) = TS(L, 10) + SIT.Somme(13)

Ma question : Comme je ne peux pas utiliser à ce niveau If Détail(24) = "OUI" Then ,
Y-a-t-il une possiblité de mettre une condition pour ce niveau :
Pour Colonne(24) = "OUI", calculer SIT.Count et SIT.Somme ?

Merci d'avance
KIM
 

Dranreb

XLDnaute Barbatruc
Il n'y a pas encore de SommeSi dans les méthodes de l'objet SsGr. Donc dès qu'on doit sommer autre chose que tout il faut profiter de la boucle Détail pour se le sommer par des instructions. Ou alors prévoir un SsGr pour cette colonne 24 afin de ne prendre que la Somme de celui avec .Id = "OUI".
 

KIM

XLDnaute Accro
En effet, pour réussir mes tableaux de synthèse mes données sources sont sous forme de tableaux.
As-tu l'idée de développer un SommeSi et CountSi dans les méthodes de l'objet SsGr? ou bien cela ne s'inscrit pas dans la logique des SsGR.
 

Dranreb

XLDnaute Barbatruc
Ajouter ces deux méthodes (à tester) dans le module de classe SsGr :
VB:
Public Function NbSi(ByVal CR As Long, ByVal V) As Long
Dim Mmbr As SsGr, Détail
If TypeOf Co(1) Is SsGr Then
   For Each Mmbr In Co: NbSi = NbSi + Mmbr.NbSi(CR, V): Next Mmbr
Else: On Error Resume Next
   For Each Détail In Co: If Détail(CR) = V Then NbSi = NbSi + 1
      Next Détail: End If
End Function

Public Function SommeSi(ByVal CR As Long, ByVal V, ByVal CS As Long) As Double
Dim Mmbr As SsGr, Détail
If TypeOf Co(1) Is SsGr Then
   For Each Mmbr In Co: SommeSi = SommeSi + Mmbr.SommeSi(CR, V, CS): Next Mmbr
Else: On Error Resume Next
   For Each Détail In Co: If Détail(CR) = V Then SommeSi = SommeSi + Détail(CS)
      Next Détail: End If
End Function
Le seul problème c'est que je ne sais pas dans quoi on s'embarque.
C'est à dire jusqu'où ça va s'arrêter si on commence à ajouter de telles sophistications.
Surtout qu'on ne s'économise pas le parcours des lignes Détail, on s'évite seulement de se le farcir, mais on le fait plusieurs fois, une fois pour chaque invocation d'une de ces méthodes.
Faut-il ajouter la méthode TotalSi qui calcule la somme en Currency ?
Ce n'est à mon avis que la première d'une longue série des questions qu'on va se poser.
Je crois que pour le peu d'utilisateurs qui vont penser à s'en servir, je vais en rester aux quelques méthodes de base les plus simples et pas me lancer dans des calculs de maxi, mini, moyenne et écart type…
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Je me demande s'il ne vaudrait pas mieux extraire de petits tableaux une dimension de tout ce qu'on trouve dans une colonne, et à partir desquels on peut calculer ce qu'on veut :
VB:
Public Sub Extraire(T(), ByVal C As Long)
Dim Mmbr As SsGr, Détail, TD(), N As Long, V
ReDim T(1 To Nombre)
If TypeOf Co(1) Is SsGr Then
   For Each Mmbr In Co: Mmbr.Extraire TD, C
      For Each V In TD: N = N + 1: T(N) = V: Next V, Mmbr
Else: On Error Resume Next
   For Each Détail In Co: N = N + 1: T(N) = Détail(C): Next Détail: End If
End Sub
 

Dranreb

XLDnaute Barbatruc
Non. Le sans doublon ça doit à mon avis rester l'apanage des Id de SsGr à l'aide des regroupements permis par la fonction Gigogne. Les petits tableaux exhaustifs permettraient de calculer ce qu'on veut, parfois avec des procédures de WorksheetFunction comme CountIf, SumIf, Average, Max, Min etc.
 

KIM

XLDnaute Accro
Re,
Je teste les SommeSI et le NbSI
3 niveaux OP / DR / SIT
En utilisant NbSi et SommeSI au niveau DR ou au niveau SIT
Les surfaces sont correctes avec SommeSI
Parcontre je n'arrive pas à avoir le nombre de SIT correspondant à NbSi(24, "OUI")
J'ai remplacé DR.Count et Sit.Count par
TS(L, 4) = DR.NbSi(24, "OUI") et TS(L, 5) = TS(L, 5) + SIT.NbSi(24, "OUI") me donne le même nombre de BAT
Est-ce une mauvaise utilisation de ces 2 fonctions?
Merci encore

KIM

For Each OP In Gigogne(PlgDon, 17, 1, 2, 7)
nbS = 0: nbB = 0
SHONt = 0
For Each DR In OP.Co
.....
TS(L, 4) = DR.NbSi(24, "OUI") 'Nb SITE
nbS = nbS + DR.NbSi(24, "OUI")

For Each SIT In DR.Co
nbB = nbB + SIT.NbSi(24, "OUI")
TS(L, 5) = TS(L, 5) + SIT.NbSi(24, "OUI") 'nb BAT
SHONt = SHONt + SIT.SommeSi(24, "OUI", 13) 'SHON
Next SIT
Next DR

L = L + 1
TS(L, 4) = nbS
TS(L, 5) = nbB
TS(L, 10) = SHONt
 

Dranreb

XLDnaute Barbatruc
Difficile de répondre comme ça entre d'une part les méthodes que je n'ai pas testées et ne voyant pas d'autre part ce qui ne semble pas ce qui aurait du être…
Mais le code montré semble bizarre, on a l'impression que des NbSi sont calculés deux fois mais de façons différentes…
Il va de soit que le NbSi, tout comme le SommeSi d'ailleurs, va aller chercher toutes les lignes de détails de tous les SsGr attachés à celui dont on invoque la méthode. Cela a-t-il bien été compris comme ça ?
Je ne comprends pas le rôle du SsGr SIT dans ce bout de code d'ailleurs.
Parce que :
For Each SIT In DR.Co
nbB = nbB + SIT.NbSi(24, "OUI")
TS(L, 5) = TS(L, 5) + SIT.NbSi(24, "OUI") 'nb BAT
SHONt = SHONt + SIT.SommeSi(24, "OUI", 13) 'SHON
Next SIT
ça revient à faire :
nbB = nbB + DR.NbSi(24, "OUI")
TS(L, 5) = TS(L, 5) + DR.NbSi(24, "OUI")
SHONt = SHONt + DR.SommeSi(24, "OUI", 13)
Et même je me demande si ces cumuls servent à quelque chose…
Parce qu'ils reviennent à calculer OP.NbSi(24, "OUI") et OP.SommeSi(24, "OUI", 13)
On ne peut pas trouver un nombre de SIT avec NbSi, seulement un nombre de lignes de détail.
On pourrait éventuellement compter pour DR les SIT qui ont SIT.NbSi(24, "OUI") > 0
If SIT.NbSi(24, "OUI") > 0 Then NbB = NbB + 1
 
Dernière édition:

KIM

XLDnaute Accro
Pour une utilisation standard, ces 2 fonctions m'ont donné des résultats corrects en utilisant aussi la recherche du num de col selon le titre via la fonction NColTab.
voir macro RecapParPhase_v3 dans module2.
Par contre comment utiliser la macro Extraire(T(), ByVal C As Long) dans l'exemple ci-joint.
Bonne soirée
KIM
 

Pièces jointes

  • GigogneKIM(AvecLO)_v2.xlsm
    29.9 KB · Affichages: 28

Discussions similaires

Réponses
1
Affichages
360

Statistiques des forums

Discussions
312 201
Messages
2 086 166
Membres
103 151
dernier inscrit
nassim