Programmer des priorités

Bonjour le forum !

Je travail actuellement sur la création d'un fichier qui concerne l'utilisation de plusieurs chaudières en même temps.

Les chaudières sont numéroté de 1 à 10 et elles ne fonctionne pas toutes en même temps mais ont des priorités en fonction du mois.

J'ai calculé ma puissance nécessaire à fournir heure par heure sur un an mais maintenant je dois utiliser une formule pour que le générateur qui à la priorité 1 apporte sa puissance et si ça ne convient pas que le générateur en priorité 2 prenne le relais ect.

Vous trouvez ci joint un exemple de mon fichier.

Dans "donnée générateurs" il faut saisir les informations sur les chaudières, leur type de combustible, leur puissance, leur priorité en fonction du mois.

Ensuite dans l'onglet "Feuille calculs" à partir de la colonne I je doic utiliser une formuler qui détermine la puissance fourni par chaque chaudière pour combler le besoin d'énergie indiqué en colonne H.

Pour exemple, le 01/01/2016 à 00:00 j'ai besoin d'avoir une puissance de 13.26 MW. Et je dispose de 10 chaudières ayant chacune une puissance différente.

Au vu des priorités présent dans l'onglet "données générateurs", le générateur avec la priorité 1 apportera sa puissance max puis le générateur avec la priorité 2 aussi jusqu'a ce que le besoin soit atteint.

De plus la priorité n'est pas la même d'un mois à l'autre ...

Je me creuse la tête pour essayer de trouver une formule avec des =SI surement mais je ne sais pas par où commencer !

Pouvez vous me donner des pistes de réflexions svp ?

merci d'avance !

PS: Seul les 3 premiers mois sont présent sur mon fichier car il est trop volumineux pour l'envoyer si je mets toute l'année

bonjour,

une solution via une macro. note que ton classeur contient des erreurs de références criculaires pour certaines de tes formules. je ne les ai pas corrigées.

Sub aargh()
    Set wsg = Sheets("données générateurs")
    With Sheets("feuille calculs")
        i = 2
        While .Cells(i, 1) <> ""
            b = .Cells(i, "H")
            j = 8
            While b > 0
                m = Month(.Cells(i, 1)) + 8
                For k = 1 To 9
                    Set r = wsg.Range("B" & m & ":K" & m).Find(k, lookat:=xlWhole)
                    If r Is Nothing Then MsgBox "priorité " & k & " non trouvée": Exit Sub
                    b = b - wsg.Cells(7, k + 1)
                    j = j + 1
                    .Cells(i, j) = r.Column - 1
                    If b <= 0 Then Exit For
                Next k
            Wend
            i = i + 1
        Wend
    End With
        Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub

Bonjour h2so4 et merci pour ta réponse.

Le problèmes de références circulaires doit venir du fait que j'ai supprimé des onglets pour ne transmettre que l'essentiel car sinon mon fichier est trop lourd. Le fichier sur lequel je travail vraiment comporte plus d'onglet et différentes macro.

Pour en revenir à ta macro, je l'ai testé sur le fichier que j'ai posté mais je n'obtiens pas de résultats satisfaisant. J'ai l'impression qu'elle ne fait que recopier les priorités sur l'onglet feuille de calculs et ne calcul pas la puissance de chaque chaudière en fonction de la priorité.

Je dois t'avouer que je suis complètement novice en terme de VBA et donc je peux difficilement comprendre pourquoi celle-ci ne fonctionne pas. C'est pourquoi je m'étais imaginé trouver une formule avec des SI=.

J'avais également masqué des colonnes je ne sais pas si tu l'as vu, c'est peut être pour ca que la macro ne semble pas fonctionner.

Voici le fichier sans référence circulaire et sans colonnes masquées

bonjour,

correction

Sub aargh()
    Dim a
    Set wsg = Sheets("données générateurs")
    With Sheets("feuille calculs")
    dl = .Cells(Rows.Count, 1).End(xlUp).Row
    .Range("I2:R" & dl).ClearContents
    a = .Range("I2:R" & dl)
        i = 2
        While .Cells(i, 1) <> ""
            b = .Cells(i, "H")
            j = 0
            While b > 0
                m = Month(.Cells(i, 1)) + 8
                For k = 1 To 10
                    Set r = wsg.Range("B" & m & ":K" & m).Find(k, lookat:=xlWhole, LookIn:=xlValues)
                    If r Is Nothing Then MsgBox "priorité " & k & " non trouvée ": Stop: Exit Sub
                    b = b - wsg.Cells(7, r.Column)
                    j = j + 1
                    a(i - 1, j) = r.Column - 1
                    If b <= 0 Then Exit For
                Next k
            Wend
            i = i + 1
        Wend
        .Range("I2:R" & dl) = a
    End With
    MsgBox "générateurs sélectionnés"
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub

Je ne comprend pas pourquoi la macro m'affiche ca

capture1

Je vais prendre pour exemple la première ligne à la date du 01/01/2016 00:00

Les besoins sont de 13,26.

D'après l'onglet "données générateurs" les priorités pour le mois de janvier sont :

1er générateur à être appellé G1

2e générateur à être appellé G2

3e générateur à être appellé G9

4e générateur à être appellé G7

Le G1 à une puissance maxi de de 1,24. La valeur en I2 de l'onglet "feuille de calcul" devrai donc être 1,24

Le G2 à une puissance maxi de de 3,40. La valeur en J2 devrai donc être 3,40

Le G9 à une puissance maxi de de 1,97. La valeur en Q2 devrai donc être 1,97

Le G7 à une puissance maxi de de 7,10.

Ces 4 générateurs ont une puissance cumulé de 13,71 or le besoin est de 13,26. Le générateur 7 n'as donc pas besoin d'utiliser sa puissance maxi de 7,1.

La valeur affiché en O2 doit donc être de 7-(13,71-13,26)=6.55

J'ai rentré les valeurs en dur pour la première ligne comme elle devrait apparaître avec la macro. Il faut que la colonne S soit égale à la valeur de la colonne H.

Je m'excuse j'ai surement mal expliqué ce que je souhaitais obtenir. J'espère que ça sera plus parlant avec cet exemple.

bonjour,

je n'avais donc pas bien compris ta demande. je t'avais rempli le tableau avec les générateurs à utiliser(en G1, le numéro du premier générateur à utiliser, en G2 le numéro du deuxième, etc ..)

voici une nouvelle version, dans lequel j'ai mis la puissance des générateurs à utiliser

Sub aargh()
    Dim a
    Set wsg = Sheets("données générateurs")
    With Sheets("feuille calculs")
    dl = .Cells(Rows.Count, 1).End(xlUp).Row
    .Range("I2:R" & dl).ClearContents
    a = .Range("I2:R" & dl)
    MsgBox LBound(a, 1) & "," & LBound(a, 2)
        i = 2
        While .Cells(i, 1) <> ""
            b = .Cells(i, "H")
            j = 0
            While b > 0
                m = Month(.Cells(i, 1)) + 8
                For k = 1 To 10
                    Set r = wsg.Range("B" & m & ":K" & m).Find(k, lookat:=xlWhole, LookIn:=xlValues)
                    If r Is Nothing Then MsgBox "priorité " & k & " non trouvée ":  Exit Sub
                    p = wsg.Cells(7, r.Column)
                    If b - p < 0 Then p = b
                    b = b - p
                    j = j + 1
                    a(i - 1, r.Column - 1) = p
                    If b <= 0 Then Exit For
                Next k
            Wend
            i = i + 1
        Wend
        .Range("I2:R" & dl) = a
    End With

    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub

Merci ! Tout marche parfaitement ! Juste une question, pour une boite de dialogue portant l'inscription 1,1 s'affiche lorsque le lance la macro ?

Bonjour,

enlève la ligne avec l'instruction msgbox.

Sub aargh()
    Dim a
    Set wsg = Sheets("données générateurs")
    With Sheets("feuille calculs")
    dl = .Cells(Rows.Count, 1).End(xlUp).Row
    .Range("I2:R" & dl).ClearContents
    a = .Range("I2:R" & dl)
        i = 2
        While .Cells(i, 1) <> ""
            b = .Cells(i, "H")
            j = 0
            While b > 0
                m = Month(.Cells(i, 1)) + 8
                For k = 1 To 10
                    Set r = wsg.Range("B" & m & ":K" & m).Find(k, lookat:=xlWhole, LookIn:=xlValues)
                    If r Is Nothing Then MsgBox "priorité " & k & " non trouvée ":  Exit Sub
                    p = wsg.Cells(7, r.Column)
                    If b - p < 0 Then p = b
                    b = b - p
                    j = j + 1
                    a(i - 1, r.Column - 1) = p
                    If b <= 0 Then Exit For
                Next k
            Wend
            i = i + 1
        Wend
        .Range("I2:R" & dl) = a
    End With

    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub
 

Merci beaucoup !

Rechercher des sujets similaires à "programmer priorites"