AIDE - MACRO somme si

Y compris Power BI, Power Query et toute autre question en lien avec Excel
T
Theze
Passionné d'Excel
Passionné d'Excel
Messages : 3'849
Appréciations reçues : 280
Inscrit le : 26 janvier 2011
Version d'Excel : 2007

Message par Theze » 20 septembre 2019, 06:59

Oups, pas D et E mais E et F :(
Je suis parti de la feuille DATA de Steelson (°v°)° pour l'exemple !
Il vaut mieux un qui sait que cent qui cherchent :wink:

Ce forum étant un lieu de partage, je n'accepte pas les messages privés !
T
Theze
Passionné d'Excel
Passionné d'Excel
Messages : 3'849
Appréciations reçues : 280
Inscrit le : 26 janvier 2011
Version d'Excel : 2007

Message par Theze » 20 septembre 2019, 07:13

Voici le code commenté pour plus de compréhension :
Sub Test()
    
    Dim Plage As Range
    Dim Cel As Range
    Dim Dico As Object
    Dim Cle As Variant
    Dim Longueur As Long
    Dim I As Long
    
    With Worksheets("DATA")
        
        'défini la plage sur la colonne A de la feuille "DATA" à partir de A2
        Set Plage = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
        
        'crée le dictionnaire qui va servir aux noeuds de départ
        Set Dico = CreateObject("Scripting.Dictionary")
        
        'parcours la plage et totalise les longueurs. Le dictionnaire évite les doublons
        For Each Cel In Plage
            
            'totalise pour la même origine comme par exemple, les deux A
            Dico(Cel.Value) = Dico(Cel.Value) + Cel.Offset(, 2).Value
            
            'appel de la Sub récursive un peu comme on fait avec un TreeView
            Totaliser Plage, Longueur, Cel.Offset(, 1).Value
            
            'au retour, additionne à la valeur déjà présente dans le dico
            Dico(Cel.Value) = Dico(Cel.Value) + Longueur
            
            'remet à 0 pour le calcul de la longueur suivante
            Longueur = 0
            
        Next Cel
        
        'inscrit les résultats en colonnes E et F sur la même feuille (DATA)
        For Each Cle In Dico.Keys
            
            I = I + 1
            .Cells(I, 5).Value = Cle
            .Cells(I, 6).Value = Dico(Cle)
                    
        Next Cle
    
    End With
End Sub

Sub Totaliser(Plage As Range, Longueur As Long, Extremite As String)
    
    Dim Cel As Range
    
    'parcours la plage à la recherche de l'extrémité correspondante
    For Each Cel In Plage
        
        'si trouvée, additionne puis recherche la nouvelle extrémité
        'comme on le ferait dans l'explorateur pour la recherche des sous-dossiers
        If Cel.Value = Extremite Then
        
            Longueur = Longueur + Cel.Offset(, 2).Value
            Totaliser Plage, Longueur, Cel.Offset(, 1).Value
            
        End If
        
    Next Cel
    
    'si l'extrémité n'existe pas, fin de procédure et retour de la longueur qui est passée en référence (par défaut dans VBA)
    'comme pour l'explorateur quand on arrive au dernier sous-dossier
    
End Sub
Il vaut mieux un qui sait que cent qui cherchent :wink:

Ce forum étant un lieu de partage, je n'accepte pas les messages privés !
Avatar du membre
Steelson
Fanatique d'Excel
Fanatique d'Excel
Messages : 12'152
Appréciations reçues : 639
Inscrit le : 13 octobre 2014
Version d'Excel : 2013 FR

Message par Steelson » 20 septembre 2019, 08:48

Excellent ! la fonction récursive que je cherchais !

O.o°• ♪♪♫ °º¤ø,¸¸,ø¤º°`°º¤ø,¸ O.o°• ♪♪♫ °º¤ø,¸¸,ø¤º°`°º¤ø,¸
PI = 3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510 58209 74944 59230 78164 06286 20899 86280

( ͡• ͜ʖ ͡• )
T
Theze
Passionné d'Excel
Passionné d'Excel
Messages : 3'849
Appréciations reçues : 280
Inscrit le : 26 janvier 2011
Version d'Excel : 2007

Message par Theze » 20 septembre 2019, 11:36

Après réflexion, je pense que je totalise plusieurs fois les montants donc je crois qu'il faut sortir de la boucle dans la fonction récursive une fois l'extrémité trouvée :
Sub Totaliser(Plage As Range, Longueur As Long, Extremite As String)
    
    Dim Cel As Range
    
    For Each Cel In Plage
        
        If Cel.Value = Extremite Then
        
            Longueur = Longueur + Cel.Offset(, 2).Value
            Totaliser Plage, Longueur, Cel.Offset(, 1).Value
            Exit For '<--- sortir une fois l'extrémité trouvée !
            
        End If
        
    Next Cel
    
End Sub
Si par exemple on suit depuis le premier A on a :
A - B = 3, B - C = 4, C - F = 2, A - H = 3, H - I = 2 soit un total de 14 et non de 33 !
De même pour B :
B - C = 4, C - F = 2, B - D = 4, D - E = 1, E - G = 8 soit un total de 19 et non 25 !

Donc, à voir avec notre ami Lige ce qu'il en pense :wink:
Il vaut mieux un qui sait que cent qui cherchent :wink:

Ce forum étant un lieu de partage, je n'accepte pas les messages privés !
Avatar du membre
Steelson
Fanatique d'Excel
Fanatique d'Excel
Messages : 12'152
Appréciations reçues : 639
Inscrit le : 13 octobre 2014
Version d'Excel : 2013 FR

Message par Steelson » 20 septembre 2019, 11:43

Non, je ne pense pas ! je trouve la même chose et j'ai fait le parcours à la main pour vérifier (c'est l'avantage du tracé de la nomenclature).

O.o°• ♪♪♫ °º¤ø,¸¸,ø¤º°`°º¤ø,¸ O.o°• ♪♪♫ °º¤ø,¸¸,ø¤º°`°º¤ø,¸
PI = 3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510 58209 74944 59230 78164 06286 20899 86280

( ͡• ͜ʖ ͡• )
Avatar du membre
Steelson
Fanatique d'Excel
Fanatique d'Excel
Messages : 12'152
Appréciations reçues : 639
Inscrit le : 13 octobre 2014
Version d'Excel : 2013 FR

Message par Steelson » 20 septembre 2019, 11:54

Theze a écrit :
20 septembre 2019, 11:36
Si par exemple on suit depuis le premier A on a :
A - B = 3, B - C = 4, C - F = 2, A - H = 3, H - I = 2 soit un total de 14 et non de 33 !
N'oublie pas la branche B-D, D-E, E-H, H-I, et E-G, et enfin B-C, C-F ... soit bien 33.
Capture d’écran (79).png
Donc tu avais bon sans aucun doute et ta fonction est super puissante !

O.o°• ♪♪♫ °º¤ø,¸¸,ø¤º°`°º¤ø,¸ O.o°• ♪♪♫ °º¤ø,¸¸,ø¤º°`°º¤ø,¸
PI = 3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510 58209 74944 59230 78164 06286 20899 86280

( ͡• ͜ʖ ͡• )
T
Theze
Passionné d'Excel
Passionné d'Excel
Messages : 3'849
Appréciations reçues : 280
Inscrit le : 26 janvier 2011
Version d'Excel : 2007

Message par Theze » 21 septembre 2019, 08:02

Bonjour,

Bonjour Steelson (°v°)°
Donc tu avais bon sans aucun doute et ta fonction est super puissante !
Merci, donc j'ai eu une mauvaise réflexion, suivre à l'oeil c'est pas évident !
Excellent ! la fonction récursive que je cherchais !
Je te la donne avec plaisir, prends en bien soin :lol:
Il vaut mieux un qui sait que cent qui cherchent :wink:

Ce forum étant un lieu de partage, je n'accepte pas les messages privés !
Avatar du membre
Steelson
Fanatique d'Excel
Fanatique d'Excel
Messages : 12'152
Appréciations reçues : 639
Inscrit le : 13 octobre 2014
Version d'Excel : 2013 FR

Message par Steelson » 21 septembre 2019, 08:50

Theze a écrit :
21 septembre 2019, 08:02
Excellent ! la fonction récursive que je cherchais !
Je te la donne avec plaisir, prends en bien soin :lol:
J'en fais régulièrement, j'en ai fait en javascript des tonnes, mais là j'étais bloqué et je ne sais pas pourquoi.

O.o°• ♪♪♫ °º¤ø,¸¸,ø¤º°`°º¤ø,¸ O.o°• ♪♪♫ °º¤ø,¸¸,ø¤º°`°º¤ø,¸
PI = 3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510 58209 74944 59230 78164 06286 20899 86280

( ͡• ͜ʖ ͡• )
T
Theze
Passionné d'Excel
Passionné d'Excel
Messages : 3'849
Appréciations reçues : 280
Inscrit le : 26 janvier 2011
Version d'Excel : 2007

Message par Theze » 21 septembre 2019, 08:55

mais là j'étais bloqué et je ne sais pas pourquoi.
Rassures toi, ça m'arrive souvent et pour des choses bien plus simples !
Il vaut mieux un qui sait que cent qui cherchent :wink:

Ce forum étant un lieu de partage, je n'accepte pas les messages privés !
L
Lige
Jeune membre
Jeune membre
Messages : 10
Inscrit le : 15 octobre 2018
Version d'Excel : 2016

Message par Lige » 24 septembre 2019, 10:32

Bonjour,

Je voulais vous remercier car la macro fonctionne parfaitement. Je ne pensais pas qu'on pouvait aller aussi loin.
Impressionnant Bravo :)

Pour vous expliquer le but du fichier est d'identifier l'impact d'un point de blocage.
Pour vous donner un exemple lorsque j'ai un blocage entre A et B, il faut que j'arrive à savoir quelle longueur cela impact.
Avec votre fichier j'y arrive, je sais qu'il y a une longueur de 33. Cela me permet de prioriser mes actions pour lever ces points de blocages.

Par contre lorsque je lève le blocage entre A et B, cela ne me débloque pas forcément la longueur de 33 (il peut y avoir un blocage plus loin). Pensez vous qu'il est possible d'avoir un tableau dynamique qui me permet de suivre ces points de blocages ? et de savoir lorsque je lève un point de blocage, l'impact derrière ?

J'ai joint votre fichier, en ajoutant des colonnes dans l'onglet DATA avec des types de blocages, lorsque que la valeur est égal à 1 c'est que c'est ok pas de blocage par contre lorsque la valeur est égal à 0, il y a un blocage

Merci
cable v2-2.xlsm
(30.76 Kio) Téléchargé 5 fois
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message