Appliquer une condition sur seulement 4 cellules au-dessus d'une autre
Bonjour,
J'ai des besoins en chauffage au pas de temps horaire. Je dois bloquer mon appel en puissance à 29kW maximum. Jusque là j'arrive à plafonné avec une formule de condition (colonne B). Toutefois je souhaite répartir ma différence (colonne A - colonne B) lorsque ma colonne A est supérieur a 29. Je souhaite lisser, répartir la différence sur les 4 heures précédents ce pic. Je souhaite
| A | B | C | D |
| Besoins chauffage kW | Besoins plafonné à 29 kW | Différence à répartir sur les 4 h précédent le pic | objectifs |
| 10 | 10 | - | 10 |
| 15 | 15 | - | 15 |
| 15 | 15 | - | 19 (15+4) |
| 18 | 18 | - | 22 (18+4) |
20 | 20 | - | 24 (20+4) |
| 18 | 18 | - | 22 (18+4) |
| 45 | 29 | 16 (45-29) | 29 |
Merci d'avance pour votre aide !!!!
J'ai également joint mon fichier pour manipuler peut être plus facilement pour vous.
Merci
Bonjour,
Question: si plusieurs valeurs consécutives dépassent 29000 et que les autres auxquelles on doit ajouter la répartition dépassent à leur tour les 29000, voir le cas aux lignes 622 à 630, nous sommes bien d'accord qu'il y aura des valeurs de lissage supérieures à 29000.
La formule en E19 :
=SIERREUR(SI(ET(B19=0;B20=0;B21=0;B22=0;B23=0);C19;SI(OU(B19>0;B20>0;B21>0;B22>0;B23>0);C19+B20/4+B21/4+B22/4+B23/4));"")Pour mettre en valeur ces données modifiées suite au lissage, j'ai utilisé une macro qui applique un quadrillage et une police rouge.
La macro génère aussi la formule.
Cdlt
Merci beaucoup effectivement votre formule correspond à ce que je voulais faire.
En revanche il est vrai que du coup il y a toujours des valeurs au-dessus de 29... Je peux modifier en lissant encore plus (sur plus d'heures). Ou alors je recommence l'opération... de la même façon jusqu'à ce que tout soit lissé !
J'aimerai comprendre un peu les formules que vous avez utilisé. Pouvez-vous m'expliquer la méthode ? Qu'est ce que le SIERREUR ? le SI(ET ? SI(OU ?
Egalement comment utilise ton la macro ?
Merci d'avance
en décortiquant la formule en E19:
-SI(ET(B19=0;B20=0;B21=0;B22=0;B23=0);C19, si les 5 cellules B19 et B20 et B21 et B22 et B23 sont à 0, alors on recopie la valeur de C19
-SI(OU(B19>0;B20>0;B21>0;B22>0;B23>0);C19+B20/4+B21/4+B22/4+B23/4), si l'une des 5 cellules B19 ou B20 ou B21 ou B22 ou B23 est supérieure à 0 alors,on récupère la valeur de C19 à laquelle on ajoute le 1/4 de la somme des valeurs des 4 cellules suivantes.
*********************************************************************************************************************
"Egalement comment utilise ton la macro ?"
La macro s'utilise en cliquant sur le bouton "Lissage".
Pour voir le contenu de la macro, faire ALT + F11
Voici la macro avec les commentaires pour sa compréhension
Sub Lissage()
'Déclaration de variables
Dim PremLig As Long, DerLig As Long, i As Long
Dim x As Object
Dim f1 As Worksheet
'*******************************************************************
Application.ScreenUpdating = False 'évite les rafraîchissement de l'écran et augment la vitesse d'exécution
Set f1 = Sheets("Feuil1") 'on attribut la variable f1 à la feuille "Feuil1"
DerLig = f1.Range("A" & Rows.Count).End(xlUp).Row 'recherche la dernière ligne des valeurs
Set x = f1.Range("A2:A" & DerLig).Find("Chauffage(Wh)") ' Cherche la position de la cellule "Chauffage(Wh)"
PremLig = x.Row + 1 'on ajoute 1 àau résultat précédent pour avoir la première ligne des valeurs
'ensuite on applique la formule excel
f1.Range("E19:E" & DerLig).FormulaR1C1 = "=IFERROR(IF(AND(RC[-3]=0,R[1]C[-3]=0,R[2]C[-3]=0,R[3]C[-3]=0,R[4]C[-3]=0),RC[-2],IF(OR(RC[-3]>0,R[1]C[-3]>0,R[2]C[-3]>0,R[3]C[-3]>0,R[4]C[-3]>0),RC[-2]+R[1]C[-3]/4+R[2]C[-3]/4+R[3]C[-3]/4+R[4]C[-3]/4)),"""")"
'*******************************************************************
'dans ce pavé, on supprime le quadrillage existant et on met les polices en noir
With Range(f1.Cells(PremLig, "A"), f1.Cells(DerLig, "E"))
.Borders().LineStyle = xlNone 'pas de quadrillage
.Font.Color = RGB(0, 0, 0) 'police en noir
End With
'*******************************************************************
'dans ce pavé, on passe toutes les valeurs de la colonne B en partant de la dernière jusqu'à la première ligne
For i = DerLig To PremLig Step -1
If Cells(i, "B") <> 0 Then ' si le contenu de la cellule testée est différent de 0 alors,
With Range(f1.Cells(i, "A"), f1.Cells(i - 4, "E")) ' on délimite la zone à la ligne testée et avec les 4 lignes au-dessus
.Borders().LineStyle = xlThin ' on applique le quadrillage sur cette zone
.Font.Color = RGB(255, 0, 0) 'on applique une police rouge sur cette zone
End With
End If
Next i
'*******************************************************************
Set f1 = Nothing ' on libère la mémoire
End Suble fichier avec la macro commentée