Somme automatique des différents niveaux d'une nomenclature

antwane

XLDnaute Nouveau
Bonjour,

J'ai besoin de connaître le coût des différents sous-ensembles d'une nomenclature.
Exemple :
Niv1 = Somme des Niv2 + Main d'oeuvre (du Niv1)
Niv2 = Somme des Niv3 +MO du Niv2
Niv3 = etc...

Le problème c'est q'une nomenclature contient plusieurs sous-ensemble.
Donc, pour calculer un Niv1, on ne peut lui dire d'ajouter tous les Niv2.

(Voir en pièce-jointe un exemple d'une nomenclature calculé manuellement)

Je bloque sur la formule exacte à mettre, mais l'idée est de faire ça :
SI NIV=1 ET Case en-dessous = N+1 ALORS SOMME de X+X

En bonus, je souhaiterais mettre une mise en forme conditionnelle, pour différencier les cases qui ont besoin d'être "renseignés" et celle qui sont "calculés"

Merci d'avance
 

Pièces jointes

  • Exemple nomenclature.xlsx
    12.3 KB · Affichages: 51
  • Exemple nomenclature.xlsx
    12.3 KB · Affichages: 66
  • Exemple nomenclature.xlsx
    12.3 KB · Affichages: 63

A4L9

XLDnaute Occasionnel
Re : Somme automatique des différents niveaux d'une nomenclature

Bonjour,

ci joint un tableau d'essai, cela correspond t-il à votre demande?

sinon merci de préciser ce qui ne va pas, que je tente de mieux répondre,


dans l'attente de vous lire

cordialement,
 

Pièces jointes

  • Exemple nomenclature - test.xlsx
    13 KB · Affichages: 58

antwane

XLDnaute Nouveau
Re : Somme automatique des différents niveaux d'une nomenclature

Je me compliquais la vie, j'essayais avec des "SOMMEPROD" "SOMME.SI.ENS", etc.
Cependant la formule =SI(H5=H4+1;K6;L5) ne fonctionne pas s'il y a du texte dans "H4", ça indique "#VALEUR!"

Dans mon cas, j'aurais dans cette cellule mon en-tête de nomenclature "Niveau"

Est-ce qu'il y a un moyen simple de corriger ce problème ?

Merci d'avance
 

antwane

XLDnaute Nouveau
Re : Somme automatique des différents niveaux d'une nomenclature

J'ai répondu un peu vite...
Je viens de me rendre compte mon exemple est faux, et du coup la formule proposé ne correspond pas au résultat souhaité.

Il faut bien faire la somme des niveaux N+1 par sous-ensemble.
Ci-joint l'exemple corrigé. (Voir le résultat souhaité dans la colonne E)

Veuillez m'excuser.
 

Pièces jointes

  • Exemple nomenclature corrigé.xlsx
    13.2 KB · Affichages: 54

djidji59430

XLDnaute Barbatruc
Re : Somme automatique des différents niveaux d'une nomenclature

ce que tu veux, c'est la somme des niveaux 2 (quelque soit le nb de niveaux 2) ?
en B5 =SOMMEPROD((A6:A11=2)*(D6:d11))
ou =SOMME.SI(A6:A11;2;D6:d11)
tu choisis celle qui te plait !
 

antwane

XLDnaute Nouveau
Re : Somme automatique des différents niveaux d'une nomenclature

Depuis la création du topic, je n'ai pas beaucoup avancé sur mon problème...
Ci-joint un nouvel exemple de mon problème, qui me semble plus simple/concret.
Dans la colonne C, c'est le résultat souhaité (fait manuellement)
Dans la colonne E, le "début" de formule qui permet de faire ça automatiquement sur n'importe quelle ligne.


Mais dès qu'il y a une somme de plusieurs sous-niveaux, la formule ne fonctionne plus (c'est le cas des lignes 2 et 3)

Exemple pour remplacer (E3) par une formule, il faudrait que la formule "automatique" permette de faire la somme (E3+E6).
J'espère avoir été plus clair.

Merci d'avance,
 

Pièces jointes

  • nomenclature cout cumulé.xlsx
    9.2 KB · Affichages: 30

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Somme automatique des différents niveaux d'une nomenclature

Bonjour antwane, A4L9, djidji59430,

En espérant avoir compris la demande, un essai avec une fonction personnalisée. Le code de la fonction est dans module1:
VB:
Function Cumul(xrg)
Application.Volatile
Dim i&
  Cumul = xrg(1, 2): i = 2
  Do While xrg(i, 1) > xrg(1, 1)
    Cumul = Cumul + xrg(i, 2)
    i = i + 1
  Loop
End Function

nota 1 : une ligne vide doit être présente sous chaque tableau
nota 2 : on doit pouvoir rajouter des niveaux (voir tableau 2)
 

Pièces jointes

  • antwane-nomenclature cout cumulé-v1.xlsm
    15.5 KB · Affichages: 45
Dernière édition:

antwane

XLDnaute Nouveau
Re : Somme automatique des différents niveaux d'une nomenclature

Bonjour mapomme,
Merci beaucoup, enfin une solution qui fonctionne ! (même si c'est du VBA, et que mes connaissances VBA sont inexistantes)
Pour ma vrai nomenclature, ça se complique un peu (plusieurs colonnes avec "coût cumulé" et "quantité").
Pour dupliquer le principe, j'ai copier/coller le code en essayant de le modifier, mais je n’obtiens pas le bon résultat.
Code:
Function Cumul2(xrg)
Application.Volatile
Dim i&
  Cumul2 = xrg(1, 5): i = 1
  Do While xrg(i, 1) > xrg(1, 1)
    Cumul2 = Cumul2 + xrg(i, 5)
    i = i + 1
  Loop
End Function

Là où ça se complique, c'est que chaque ligne possède une notion de quantité.
Dois-je créer une colonne supplémentaire facilitant le calcul (Coût*Qté) ? Ou ça peut être intégrer au code/formule ?
 

Pièces jointes

  • nomenclature cout cumulé-v2.xlsm
    16.7 KB · Affichages: 21

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Somme automatique des différents niveaux d'une nomenclature

Bonsoir antwane,

J'ai fait dans le long et tarabiscoté (ça je sais bien le faire ! :p)

Une seule fonction Cumul mais sous deux formes.

Forme n° 1 : Cumul(xrg, xColCout)
.

  • cette forme ne prend pas en compte les quantités
  • xrg est la cellule contenant le niveau pour la ligne dont on veut le coût cumulé
  • xColCout est le numéro de colonne contenant les coûts. Cette colonne est obligatoirement à droite de xrg
  • la colonne de xrg est la colonne n° 1

Forme n° 2 : Cumul(xrg, xColCout, xColQuantite)
.
  • cette forme prend en compte les quantités
  • xrg est la cellule contenant le niveau pour la ligne dont on veut le coût cumulé
  • xColCout est le numéro de colonne contenant les coûts. Cette colonne est obligatoirement à droite de xrg
  • xColQuantite est le numéro de colonne contenant les quantités. Cette colonne est obligatoirement à droite de xrg
  • la colonne de xrg est la colonne n° 1

il doit y avoir obligatoirement une ligne VIDE sous chaque tableau.

attention ! quand on parcourt en profondeur la nomenclature (de n vers n+p), il ne doit pas y avoir de "saut".
1, 2, 2, 3, 3, 4, 4, 2 , 1 est admis mais 1, 2, 2, 4, 4, 2, 1 aboutit à un cumul faux (on saute de 2 à 4 en omettant le niveau 3)

nota : je n'ai testé que très superficiellement. A vous de de jouer. Si ça se trouve, je me suis même complètement planté ! :(


Le code dans module1 :
VB:
Function Cumul(xrg As Range, xColCout, Optional xColQuantite)
Application.Volatile
Dim i&, imax&, tablo, nivMax&, aux, j&, k&

  If IsMissing(xColQuantite) Then
    ' 2 ième paramètre manquant -> on calcule les coûts cumulés sans notion de quantité
    ' initialisation de cumul par le coût de la ligne de xrg
    Cumul = xrg(1, xColCout): i = 2
    ' on parcourt les lignes suivantes en ajoutant les coûts de chaque ligne
    ' tant que le niveau est supérieur à celui de xrg
    Do While xrg(i, 1) > xrg(1, 1)
      Cumul = Cumul + xrg(i, xColCout)
      i = i + 1
    Loop
    ' FIN de la 1ière forme
  Else
    ' 2 ième paramètre présent -> on calcule les coûts cumulés avec les quantités
    
    ' calcul de imax à partir de la ligne de xrg
    ' imax est la ligne max du bloc relatif au niveau de xrg
    imax = 1  'le bloc commence à la ligne de xrg
    Do While xrg(imax + 1, 1) > xrg(1, 1)
      ' si la ligne suivante a un niveau sup. à celui de xrg, la ligne fait partie du bloc
      imax = imax + 1
    Loop
    
    ' recherche du rang de colonne max entre les colonnes   xColCout et xColQuantite
    If xColCout > xColQuantite Then i = xColCout Else i = xColQuantite
    
    ' déclaration du tablo correspondant au bloc de xrg
    ' le nombre de lignes est égal à imax
    ' le nombre de colonnes est égal à i (i = n° de colonne max)
    ReDim tablo(1 To imax, 1 To i)
    
    ' remplissage de tablo
    tablo = xrg.Parent.Range(xrg(1, 1), xrg(imax, i))
    ' on rajoute une colonne au tablo
    ReDim Preserve tablo(1 To imax, 1 To i + 1)
    
    ' calcul du niveau max au sein du bloc de xrg (i.e. tablo)
    nivMax = xrg(1, 1)
    For i = 2 To UBound(tablo)
      If xrg(i, 1) > nivMax Then nivMax = xrg(i, 1)
    Next i
    
    ' on calcule le coût cumulé pour le dernier niveau (égal à nivMAx)
    ' c'est le coût de la ligne multiplié par la quantité
    For i = UBound(tablo) To 1 Step -1
      If tablo(i, 1) = nivMax Then tablo(i, UBound(tablo, 2)) = tablo(i, xColCout) * tablo(i, xColQuantite)
    Next i
    
    ' la dernière ligne du bloc est remplie de la même manière
    ' quelque soit son niveau
    tablo(UBound(tablo), UBound(tablo, 2)) = tablo(UBound(tablo), xColCout) * tablo(UBound(tablo), xColQuantite)
    
    ' on va boucler sur les niveaux. Du niveau max -1 au niveau de xrg
    ' rappel: pour les niveaux max, c'est déjà fait
    For j = nivMax - 1 To xrg(1, 1) Step -1
      ' pour chaque niveau j , on boucle sur le bloc de xrg (moins la dernière ligne)
      For i = 1 To imax - 1
        If tablo(i, 1) = j Then
          ' si la ligne en cours est de niveau j
          ' on initialise le coût aux avec le coût de la ligne
          aux = tablo(i, xColCout)
          
          ' on examine les lignes suivantes.
          ' tant que la ligne a un niveau supérieur au niveau j en cours
          ' si le niveau est égal à j+1, alors on ajoute à aux le coût de la ligne
          ' autrement dit: tant que le niveau est sup. au niveau en cours j et
          ' si ce niveau est le niveau immédiatement supérieur à j, alors on prend en
          ' compte le coût (coût précédemment calculé soit par la boucle sur les niveaux max,
          ' soit par une précédente boucle de j)
          k = i
          Do While tablo(k + 1, 1) > j
            If tablo(k + 1, 1) = j + 1 Then aux = aux + tablo(k + 1, UBound(tablo, 2))
            k = k + 1
            ' si k est sup à la dernière ligne du bloc, on quitte la boucle DO
            If k = imax Then Exit Do
          Loop
          ' le coût cumulé est donc le produit de aux par la quantité de la ligne en cours i
          tablo(i, UBound(tablo, 2)) = aux * tablo(i, xColQuantite)
        End If
      Next i    ' passage à la ligen suivante
    Next j      ' passage au niveau suivant
    
    'le cumul correspondant à xrg est celui de la ligne 1 de table
    Cumul = tablo(1, UBound(tablo, 2))
    ' FIN de la 2ième forme
  End If
End Function
 

Pièces jointes

  • xColQuantite-nomenclature cout cumulé-v2.xlsm
    23.9 KB · Affichages: 72
Dernière édition:

antwane

XLDnaute Nouveau
Re : Somme automatique des différents niveaux d'une nomenclature

Génial ! merci beaucoup.
A première vue, ça fonctionne très bien.
Il ne me reste plus qu'à transposer le tout dans ma "vrai" feuille, et comparer le résultat avec ce que j'obtenais en faisant les calculs manuellement.
 

Discussions similaires

Statistiques des forums

Discussions
312 492
Messages
2 088 931
Membres
103 984
dernier inscrit
maliko67