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
Bonsoir.
Suggestion: Gigogne accepte aussi bien un tableau qu'une plage.
Alors ne pourrait tu charger dans un tableau PlgSrc.Value, et parcourir un coup la colonne contenant les titres dont certains sont à regrouper, l'y remplacer à chaque ligne par le titre de groupe, et soumettre ensuite à Gigogne ce tableau ainsi modifié ?

Remarque: seul MGigogne, MTableaux et le module de classe SsGr sont nécessaires. Mais ça m'a fait plaisir de retrouver MDictionnArbo. Ça pourrait être intéressant de l'adapter avec IndexerParFusions pour qu'il n'ait plus non plus besoin de TableIndex. Enfin… peut être…
Sinon j'ai aussi deux classeurs précurseur de compléments Excel qui permettraient de ne plus avoir dans le classeur d'application la programmation de service.
Si ça te dit d'essayer cette formule un de ces 4…
 

Pièces jointes

  • CBxL.xlsm
    101.2 KB · Affichages: 49
  • GigIdx.xlsm
    58.5 KB · Affichages: 38
Dernière édition:

KIM

XLDnaute Accro
Bonjour Dranreb,
J'ai besoin d'un 1er exemple pour mieux comprendre. Ton aide m'est nécessaire et je t'en remercie par avance. Peux-tu stp voir mon fichier ci-joint dans la conversation #45 ?
Je compte sur ta disponibilité. Merci encore.

Concernant les 2 classeurs compléments d'Excel, je vais essayer d'adapter un de mes synthèses qui utilise Gigogne et DCols.

KIM
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
C'est que je n'ai pas trop compris en détail ce que tu veux.
Tu saurais bien construire un petit dictionnaire DCols donnant par exemple arbitrairement, d'après deux Array constants, un numéro de colonne de sortie en fonction de la valeur de la dernière colonne CAT des données, un même numéro pouvant être attribué à plusieurs.
alors tu fais en gros
VB:
Dim TSrc()
TSrc = PlgUti(FBase1.[A5:P5]).Value
For L = 1 To UBound(TSrc, 1)
   TSrc(L, 16) = DCols(TSrc(L, 16)): Next L
For Each OP In Gigogne(TSrc, 16, 1, 2)
 

KIM

XLDnaute Accro
Désolé Dranreb je n'ai pas compris comment on peut attribuer un même numéro à plusieurs colonnes.
Je me permets de revenir vers toi car je souhaite ne plus utiliser SOMMEPROD.
un 1é tableau de synthese dans R1 avec comme titre de colonnes le résultat de DCols:
Pour simplifier (voir fichier joint) les titres des colonnes de synthèse sont :
DCols = DicInvent(Données, 16, ColDép:=7) me donne les titres suivants pour les colonnes de synthèse: A, B, C, D, E, F, G
et pour chacune la somme des surfaces de la col 14 (Détail(14)). OK c'est fait (onglet R1).
Je souhaite construire un 2è tableau en regroupant certaines colonnes du résultat de DCols, par ex :
1è col du tableau de synthese correspondra aux titres des colonnes A+D+F
2è col : B+C+G
3è col : E
et les sommes de la col 14 doivent aussi être regroupés voir résultat souhaité dans R2.

Merci encore de ton aide.
KIM
 

Pièces jointes

  • T_RecapGigogne_vKIM2E.xlsm
    289.4 KB · Affichages: 43

Dranreb

XLDnaute Barbatruc
Non, on peut attribuer un même numéro de colonne d'arrivée (ou un titre générique) à plusieurs valeurs différentes d'entrée prises de la colonne 16. Mais on ne peut pas utiliser DicInvent pour cela.
On peut éventuellement définir une table de correspondance dans une feuille, ou le figer dans des Array(…
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Mais qu'est-ce qu'il y a de si compliqué ?
Soit on utilise le Dictionary fabriqué arbitrairement comme celui fait automatiquement, soit, si ça joue plus en profondeur dans la structure du rapport et qu'on a besoin d'avoir ensemble tout ce qui va dans une colonne, on s'en sert pour remplacer le critère par le numéro de colonne dans les données chargées en tableau lors d'une étape préparatoire.
Mais à priori ça ne me semble pas nécessaire de prévoir un niveau de regroupement pour le critère qui détermine les différentes colonne où ça doit aller, même pour le 1er rapport.
Il suffirait de cumuler dans le tableau de destination, n'est ce pas.
Et calculer les totaux aussi dans des éléments de tableaux au fur et à mesure.
VB:
            For Each Détail In SITE.Co
               C = DCols(Détail(16))
               Tbl(L, C) = Tbl(L, C) + Détail(14): Next Détail
            For C = 7 To 9: TotDpt(C) = TotDpt(C) + Tbl(L, C): Next C
C'est vrai que dans les commentaires guides d'utilisation de DicInvent il y a :
' Le dictionnaire permettra de retrouver à quelle colonne ventiler un Id de SsGr trouvé.
Mais ce n'est pas la seule utilisation possible. Si c'est pour des cumuls, ils peuvent être effectués en désordre, du moment que c'est chaque fois dans la bonne colonne.
C'est pourquoi dans la feuille Aide GigIdx j'ai corrigé :
Le dictionnaire permettra de retrouver à quelle colonne ventiler un Id de SsGr ou cumuler un montant même hors arguments.
Ses Keys donneront d'abord les titres de ces colonnes (ajouter ColDép à l'indice pour le ventiler dans les bonnes).
 
Dernière édition:

KIM

XLDnaute Accro
Merci Dranreb,
Si j'ai bien compris, ton dernier script calcule les sous totaux par DPT et par titre des colonnes.
Je vais l'appliquer et te mettre au courant.

Il me reste ta proposition de la discussion 52 pour regrouper des colonnes. Je n'ai pas su l'appliquer.
Merci d'avance pour ton aide.

KIM
 

Dranreb

XLDnaute Barbatruc
Mais avec cette technique l'utilisation de DCols est pareille après, comme au #55, qu'il soit obtenu par DicInvent, par le petit bout de code arbitraire du #52 ou en le renseignant d'après une table de correspondance établie dans une feuille.
 
Dernière édition:

KIM

XLDnaute Accro
Bonjour Dranreb,
EN effet avec
Set DCols = DicInvent(Données, ColTitre, ColDép:=7): CFin = DCols.Count + 7
La synthèse se déroule correctement avec les titres des col A, B, C, D, E, et F de la col 16.
Comme suggéré, j'ai remplacé DCols par le petit bout de code arbitraire du #52 :
Set DCols = New Dictionary
For N = 0 To 6
DCols(Array("A", "B", "C", "D", "E", "F", "G")(N)) _
= Array(7, 8, 8, 7, 9, 7, 8)(N)
Next N

Dans la boucle ci-dessous C prend la valeur de 7 à 9 selon la déclaration de DCols.
Je me heurte à un message d'erreur : "L'indice n'appartient pas à la sélection" au niveau de ligne TS(L, C) = Tot. Manque-t-il un contrôle ou une boucle sur C ?

For Each Statut In SITE.Co
C = DCols(Statut.Id)
Tot = 0
For Each Détail In Statut.Co
Tot = Tot + Détail(14): Next Détail

TS(L, C) = Tot

TotSite = TotSite + Tot
TotOP = TotOP + Tot
TotDR = TotDR + Tot
NbDR = NbDR + Statut.Count
TotG(C) = TotG(C) + Tot: TotG(CFin) = TotG(CFin) + Tot
TotD(C) = TotD(C) + Tot

NbG(C) = NbG(C) + Statut.Count: NbG(CFin) = NbG(CFin) + Statut.Count
Next Statut

Fichier ci-joint, onglet R3, macro Synthese_ParOPetDPT_Site_v7
Merci d'avance
 

Pièces jointes

  • T_RecapGigogne_vKIM2E.xlsm
    292.2 KB · Affichages: 49

Dranreb

XLDnaute Barbatruc
Bonjour.
Ça ne va pas comme ça. Il faut retirer le statut des arguments, et totaliser dans le tableau en faisant donc C = DCols(Détail(16)) à chaque Détail et plus C = DCols(Statut.Id) à chaque Statut. Supprimez le SsGr Statut, le ColTitre, ça doit devenir directement For Each Détail In SITE.Co
Vous ne pouvez plus prendre DCols.Keys pour le titres non plus puisque plusieurs différents vont dans les mêmes colonnes.

Parce qu'encore une fois, si vous tenez à prévoir un niveau pour la colonne, ça ne peut plus être sur le Statut mais sur un numéro de groupe de statuts de 7 à 9 préalablement calculé sur l'ensemble du tableau avant soumission à Gigogne. Mais on pourrait aussi le faire comme ça, bien sûr. Le seul avantage serait de pouvoir exploiter le Count du SsGr ColGrStat. Le début pour le faire de cette façon là pourrait ressembler à ça :
VB:
For C = 1 To 10: TS(1, C) = Choose(C, "OP", "DPT", "SITE", "SUB", _
   "", "", "A+D+F", "B+C+G", "E", "Total"): Next C
Set DCols = New Dictionary
For C = 7 To 9: TSpl = Split(TS(1, C), "+")
   For N = 0 To UBound(TSpl): DCols(TSpl(N)) = C: Next N, C
TE = ColUti(FBase.[A5:P5]).Value
For L = 1 To UBound(TE, 1)
   If Not DCols.Exists(TE(L, 16)) Then MsgBox "Statut """ & TE(L, 16) & """ non prévu.", vbCritical: Exit Sub
   TE(L, 16) = DCols(TE(L, 16)): Next L
L = 1
For Each OP In Gigogne(TE, 10, 1, 2, 16)
Dans ce cas le DCols ne sert plus par la suite, pour la colonne 16 on pourrait directement utiliser ColGrStat.Id comme numéro de colonne de destination.
 
Dernière édition:

Discussions similaires

Réponses
1
Affichages
353

Statistiques des forums

Discussions
312 169
Messages
2 085 924
Membres
103 042
dernier inscrit
slfjs