Synthèse globale d'un tableau de détail

StrictlyEast

XLDnaute Nouveau
Bonjour,

J'ai eu beau regarder les diverses fusion, concaténations avec conditions etc... je ne m'en sors pas!

Le principe est simple j'ai un tableau de chiffrage détaillé, je veux en faire la synthèse automatiquement dans la première feuille de mon classeur.

Le problème c'est que le tableau détaillé peut contenir de 1 à X phases et donc je dois générer le tableau récapitulatif.

J'ai mis en pièce jointe le fameux fichier sans les macros existantes d'ajout suppression de ligne ou de phase.

Le tableau global en Feuille 1 est celui que je cherche à générer dynamiquement à partir du détaillé.

Merci d'avance pour votre aide,

Olivier
 

Pièces jointes

  • modele.xlsx
    34.9 KB · Affichages: 89
  • modele.xlsx
    34.9 KB · Affichages: 87
  • modele.xlsx
    34.9 KB · Affichages: 89

Zon

XLDnaute Impliqué
Re : Synthèse globale d'un tableau de détail

Salut,

Une spécialiste TCD aurait pu faire le boulot, mais en code .


Voici un code que j'avais que j'ai vite adapté, où le nom (ou mot clef ) est Phase puis un chiffre , si ce n'est pas le cas il y a juste une adaptation à faire ...
Puis les colonnes dont on veut faire la somme sont toujours en à la même place. => Pareil si ça évolue on avisera.

Il manque l'intitulé des phases, par défaut je met phase1 etc...

à copier coller dans un module, demander si tu veux infos complémentaires.

Code:
'Numero de colonne
Const Phase As Byte = 2
Const ColOption As Byte = 5
Const Chef As Byte = 6
Const Directeur As Byte = 7
Const Developpeur As Byte = 8
Const Cout As Byte = 9

Const MotClef = "Phase"
'nom des feuilles
Const NomF1$ = "Global"
Const NomF2$ = "Détail"
Dim T, V

Sub Princ()
Dim Res(), Temp
Dim I&, J&, K&, X&

  Init
     
  For I = LBound(T) To UBound(T)
    
    If InStr(1, T(I, Phase), MotClef) > 0 Then 'on teste dans la colonne 2 si on a phase contenu dans la chaine
      K = K + 2
      'on ne connait pas le nombre de phase=> Construtction du tableau à l'envers
'où connait le nombre de lignes grâce à V, ici 8(4 phases + option)
'dans laquelle on a besoin de 2 colonnes options ou pas
'si on voulait rajouter Jour on mettriat juste une constante coljour=10
'et on rajoute coljour dans V
      ReDim Preserve Res(1 To UBound(V) + 1, 1 To K * 2)
    End If
    
    While InStr(1, T(I, Phase), MotClef) > 0
      For X = LBound(V) To UBound(V)
        If X = 0 Then
          Res(X + 1, K - 1) = T(I, V(X))
          Res((X + 1), K) = "OPTIONS"
        Else
          Res(X + 1, K - 1) = IIf(T(I, ColOption) = "Oui", Res(X + 1, K - 1), Res(X + 1, K - 1) + T(I, V(X)))
          Res((X + 1), K) = IIf(T(I, ColOption) = "Oui", T(I, V(X)) + Res((X + 1), K), Res((X + 1), K))
        End If
      Next X
      I = I + 1
      If I > UBound(T) Then Exit For
    Wend
    
  Next I
  
  Temp = InverseTab(Res, 1)
  With Sheets(NomF1)
'pour les tests A19, sinon mettre A5
    [A19].Resize(UBound(Temp), UBound(Temp, 2)) = Temp
  End With
End Sub

Sub Init()
  With Sheets(NomF2)
    T = Range(.[A5], .Cells(.[A65536].End(xlUp).Row, Cout))
  End With
    V = Array(Phase, Chef, Directeur, Developpeur, Cout)
End Sub

Function InverseTab(T, Optional Base As Byte = 0) 'Zon
 Dim Temp(), I&, J&
  ReDim Temp(Base To UBound(T, 2), Base To UBound(T))
  For I = LBound(T, 2) To UBound(T, 2)
    For J = LBound(T) To UBound(T)
      Temp(I, J) = T(J, I)
    Next J
  Next I
  InverseTab = Temp
End Function

A+++
 

Zon

XLDnaute Impliqué
Re : Synthèse globale d'un tableau de détail

Re,

il faut faire une liste sans doublons des éléments de la colonne 2 et rajouter un boucle pour la recherche des nomclés.

avec un "vrai" extrait du fichier ce serait plus simple

sinon otes les (total de ta colonne 2 de la feuille détail),

en rajoutant


Code:
Function RecupDoublons(T, ByVal ColT As Byte) 'Zon
Dim I&, J&, Tablo As New Collection, Temp()
  For I = LBound(T, 1) To UBound(T, 1)
    On Error Resume Next
    Tablo.Add T(I, ColT), CStr(T(I, ColT))
    If Err = 0 Then
      ReDim Preserve Temp(J)
      Temp(J) = T(I, ColT)
      J = J + 1
    End If
  Next I
  RecupDoublons = Temp
End Function

puis en changeant 2 ou 3 lignes

Code:
  For I = LBound(T) To UBound(T)
    For Y = LBound(Temp) To UBound(Temp)
      If InStr(1, T(I, Phase), Temp(Y)) > 0

...


Code:
 If I > UBound(T) Then Exit For
    Wend
    Next Y
  Next I


A+++
 

StrictlyEast

XLDnaute Nouveau
Re : Synthèse globale d'un tableau de détail

Oui en effet du coup je te remets un fichier avec les bons intitulés car je n'ai pas compris la manipulation que tu faisais dans le dernier code.

Donc si je met phase ça marche bien mais si je veux intégrer le calcul final je l'insère depuis ma zone donnée ou il vaut mieux l'intégrer dans le module?

Merci encore pour ton aide,

Olivier
 

Pièces jointes

  • Modèle chiffrage.xlsx
    40.6 KB · Affichages: 48

Zon

XLDnaute Impliqué
Re : Synthèse globale d'un tableau de détail

Salut,

il FAUT que tu déplaces Total en colonne 1 de la feuille Développement.


Code:
'Numero de colonne
Const Phase As Byte = 2
Const ColOption As Byte = 5
Const Chef As Byte = 6
Const Directeur As Byte = 7
Const Developpeur As Byte = 8
Const Cout As Byte = 9

Const MotClef = "Phase"
'nom des feuilles
Const NomF1$ = "Global"
Const NomF2$ = "Développement"
Dim T, V

Sub Princ()
Dim Res(), Temp
Dim I&, J&, K&, X&, Y&

  Init
  Temp = RecupDoublons(T, 2)
    For I = LBound(T) To UBound(T)
      For Y = LBound(Temp) To UBound(Temp)
        If InStr(1, T(I, Phase), Temp(Y)) > 0 Then 'on teste dans la colonne 2 si on a phase contenu dans la chaine
      K = K + 2
      'on ne connait pas le nombre de phase=> Construtction du tableau à l'envers
      ReDim Preserve Res(1 To UBound(V) + 1, 1 To K * 2)
    End If
    
    While InStr(1, T(I, Phase), Temp(Y)) > 0
      For X = LBound(V) To UBound(V)
        If X = 0 Then
          Res(X + 1, K - 1) = T(I, V(X))
          Res((X + 1), K) = "OPTIONS"
        Else
          Res(X + 1, K - 1) = IIf(T(I, ColOption) = "Oui", Res(X + 1, K - 1), Res(X + 1, K - 1) + T(I, V(X)))
          Res((X + 1), K) = IIf(T(I, ColOption) = "Oui", T(I, V(X)) + Res((X + 1), K), Res((X + 1), K))
        End If
      Next X
      I = I + 1
      If I > UBound(T) Then Exit For
    Wend
    Next Y
  Next I
  
  Temp = InverseTab(Res, 1)
  With Sheets(NomF1)
    [A5].Resize(UBound(Temp), UBound(Temp, 2)) = Temp
  End With
End Sub

Sub Init()
  With Sheets(NomF2)
    T = Range(.[A5], .Cells(.[A65536].End(xlUp).Row, Cout))
  End With
    V = Array(Phase, Chef, Directeur, Developpeur, Cout)
End Sub

Function InverseTab(T, Optional Base As Byte = 0) 'Zon
 Dim Temp(), I&, J&
  ReDim Temp(Base To UBound(T, 2), Base To UBound(T))
  For I = LBound(T, 2) To UBound(T, 2)
    For J = LBound(T) To UBound(T)
      Temp(I, J) = T(J, I)
    Next J
  Next I
  InverseTab = Temp
End Function

Function RecupDoublons(T, ByVal ColT As Byte) 'Zon
Dim I&, J&, Tablo As New Collection, Temp()
  For I = LBound(T, 1) To UBound(T, 1)
    On Error Resume Next
    Tablo.Add T(I, ColT), CStr(T(I, ColT))
    If Err = 0 Then
      ReDim Preserve Temp(J)
      Temp(J) = T(I, ColT)
      J = J + 1
    End If
  Next I
  RecupDoublons = Temp
End Function

SI d'autres questions, je ne pourrai te répondre que lundi.


A+++
Bon week end
 

Discussions similaires

Statistiques des forums

Discussions
312 545
Messages
2 089 486
Membres
104 182
dernier inscrit
matiasi