Microsoft 365 Calculer %age de %age

WTF

XLDnaute Impliqué
Bonjour le Forum

Je cherche à déterminer les valeurs des cellules jaunes à partir des donées de la feuille 2.
J'ai construit la feuille 3 uniquement pour vous montrer le résultat a atteindre, mais bien sur je ne peux pas me permettre de faire ca pour toute mes lignes.
Le principe est un calcul de %age de %age :
- Si je détient 50% de A qui lui même détient 25% de B, alors je détiens (25%x50%=12,5%) de B
Sauf que dans la vrai vie, j'ai beaucoup plus d'étages.

Dans la feuille 2, j'ai une base de données qui liste les détentions :
- Colonne C : code détentrice
- Colonne F : code société détenue :
- colonne R : % de détention

Je voudrais pour chaque entité de la colonne A (feuille 1), connaitre le %age de détention final de chaque tête de file (entités de E2 à I2).
Il faut donc pour ca faire des calculs en cascade mais je suis perdu pour l'automatiser via une formule ou une macro.
Un grand merci pour votre aide
 

Pièces jointes

  • Test WTF.xlsx
    20 KB · Affichages: 16

WTF

XLDnaute Impliqué
Bonjour le Forum,

J'ai trouvé sur Excel pratique un problème qui s'apparente au mien et que serait résolu par une fonction personnalisée ci dessous.

Mais ca ne fonctionne pas chez moi, excel ne reconnait pas la formule. Je ne sais pas si c'est un pb qui vient de mon cas ou la fonction qui n'est pas bonne.

VB:
Function holding(t, racine, participant)
    Dim a(100, 100)
    Dim pct(100, 100)
    searchmaster t, racine, participant, a, pct, 0
    pctt = 0
    For i = 1 To a(0, 0)
        pctlg = 1
        For j = 1 To a(i, 0)
            If pct(i, j) <> 0 Then
                pctlg = pctlg * pct(i, j)
            End If
        Next j
        pctt = pctt + pctlg

    Next i
    holding = pctt
End Function
private Sub searchmaster(t, racine, participant, ByRef a, ByRef pct, n)
    For Each r In t.Rows
        If r.Cells(1, 2) = participant Then
            If n = 0 Then
                a(0, 0) = a(0, 0) + 1
                l = a(0, 0)
            Else
                l = a(0, 0)
                If a(l, a(l, 0)) = racine Then
                    a(0, 0) = a(0, 0) + 1
                    l = a(0, 0)
                    i = 0
                    While a(l - 1, i) <> participant
                        a(l, i) = a(l - 1, i)
                        pct(l, i) = pct(l - 1, i)
                        i = i + 1
                    Wend
                    a(l, 0) = a(l, 0) - 2
                End If
            End If
            a(l, 0) = a(l, 0) + 1
            c = a(l, 0)
            a(l, c) = participant
            pct(l, c) = r.Cells(1, 3)
            If r.Cells(1, 1) <> racine Then
                searchmaster t, racine, r.Cells(1, 1), a, pct, n + 1
            Else
                a(l, 0) = a(l, 0) + 1
                c = a(l, 0)
                a(l, c) = racine
                pct(l, c) = 1
            End If
        End If
    Next
End Sub

Source : https://forum.excel-pratique.com/excel/formule-taux-de-detention-t62336.html
 

WTF

XLDnaute Impliqué
Bon,
j'avance tout doucement à partir d'éléments glanés sur le Web.
En PJ un solution utilisant une fonction personnalisée, mais elle ne fonctionne pas.
Je pense qu'il y a un pb sur l'autodétention, c'est à dire une société fille détient des titres de sa mère (directement ou indirectement). Dans ce cas il faudrait pouvoir identifier les "boucles" pour pouvoir les couper avant de lancer le calcul.

Si vous aviez une idée pour m'aider ca serait génial
 

Pièces jointes

  • Copie de fichier-exemple.xlsm
    43.5 KB · Affichages: 1

Nairolf

XLDnaute Accro
Salut WTF,

J'ai eu un peu de mal à mettre en place quelque chose, ce qui explique le temps de réponse.
Tu trouveras ma proposition dans le fichier joint.
A noter que le code écrit volontairement dans la feuille "1" afin que tu vois le traitement, ensuite il faudra l'adapter selon la mise en forme que tu souhaites mettre en place.

Le code est probablement largement perfectible, et je n'ai pas déterminé le nombre d'imbrications qu'il faut traité, la valeur est actuellement en dur à 10 niveaux (le temps de traitement est plutôt court).
 

Pièces jointes

  • Test WTF_Nairolf_final.xlsm
    38.3 KB · Affichages: 2

WTF

XLDnaute Impliqué
Bonjour Nairolf

Un grand merci

Ca fonctionne bien sur la base extrait que j'avais mis en PJ, les résultats sont très probants donc top ....
.... Mais quand j'augmente ma base de données j'ai l'impression qu'il y a des pb dans le calcul qui peuvent venir je pense de 2 choses :
- Soit il y a plus de 10 niveaux ..
- Soit c'est lié aux "boucles" (S1 détient x% de S2 qui détient x% de S3 ... SY qui détient x% de S1)
Dans ce cas il faudrait pouvoir couper les boucles :
- Soit en les identifiant et je viendrais supprimer les données manuellement (pas fou car la base n'est plus intangible, mais c'est une solution de facilité)
- Soit en arretant le calcul à ce niveau

En PJ un fichier un peu plus complet
 

Pièces jointes

  • Test WTF_Nairolf_final.xlsm
    556.7 KB · Affichages: 1

Nairolf

XLDnaute Accro
Salut,

Tu as raison, l'optimisation du nombre d'incrémentation par société serait un bon moyen de ne pas trop augmenter le temps de traitement, mais ce n'est pas si simple que ça.
Je pense qu'il y a probablement un moyen d'optimiser les boucles.

En attendant, je te joins le fichier est différents nombre d'imbrication (jusqu'à 1000, ça prend 10-15 minutes).
 

Pièces jointes

  • Test WTF2_Nairolf2.xlsm
    925.5 KB · Affichages: 2

WTF

XLDnaute Impliqué
Bonjour Nairof,
Merci pour ce fichier
En effet on sent qu'il y a des calculs, il a mis presque 20 min à tourner 😁
Meme si c'est long sur le principe ca n'est pas très grave car ce n'est pas un calcul que je lancerais souvent.

Par contre j'avoue être surpris par le résultat.
Si on prend S401 qui correspondait au 1er fichier partagé, je m'attendais à avoir les meme résultat (ou à peut prêt), c'est à dire :
S014 : 36,03%
S044 : 20,86%
S013 : 24,04%
S010 : 6,07%
S211 : 0%

Et là j'ai des résultats très différents.
 
Haut Bas