Problème de mise à jour de valeur minimale dans Excel VBA
Bonjour à tous,
J'ai actuellement un problème avec une feuille de calcul Excel et j'espère que quelqu'un pourrait m'aider à le résoudre.
J'utilise du code VBA pour mettre à jour les valeurs des cellules C23 et C24 en fonction de la valeur de la cellule C25. La mise à jour de la valeur maximale (C23) fonctionne bien, mais la mise à jour de la valeur minimale (C24) affiche toujours 0.
Voici le code que j'utilise actuellement :
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$C$25" Then
Dim newC25Value As Double
newC25Value = Range("C25").Value
' Mettre à jour C23 avec la valeur maximale entre sa valeur actuelle et la nouvelle valeur de C25
Range("C23").Value = WorksheetFunction.Max(newC25Value, Range("C23").Value)
' Mettre à jour C24 avec la valeur minimale entre sa valeur actuelle et la nouvelle valeur de C25
Range("C24").Value = Application.Evaluate("MIN(" & newC25Value & "," & Range("C24").Value & ")")
End If
End Sub
J'ai essayé plusieurs approches pour résoudre ce problème, mais la mise à jour de la valeur minimale ne semble pas fonctionner correctement.
Est-ce que quelqu'un aurait une idée sur la raison pour laquelle la mise à jour de la valeur minimale ne fonctionne pas comme prévu ? Toute aide serait grandement appréciée.
Merci d'avance !
Edit modo : code à mettre entre balises avec le bouton </> merci d'y faire attention la prochaine fois
Bonsoir BrunoM45,
Désolé, c'est la première fois que mets du code dans le texte.
bonjour aordepz,
pourquoi pas comme le "max", mais une fois que C24 est 0, il ne peut que devenir négatif ....
Range("C24").Value = Application.Min(newC25Value, Range("C24").Value)
Bonjour,
la mise à jour se fait si la valeur en C25 est inférieure à la valeur en C24, comme cette valeur est 0. Elle sera donc mise à jour si en C25 on a une valeur négative.
Bonjour BsAlv, j'ai essayé to code mais sa ne change rien quand mon classeur se met a jour le max se met a jour mais pas le min.
voici le code mis a jour,
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$C$25" Then
Dim newC25Value As Double
newC25Value = Range("C25").Value
' Mettre à jour C23 avec la valeur maximale entre sa valeur actuelle et la nouvelle valeur de C25
Range("C23").Value = WorksheetFunction.Max(newC25Value, Range("C23").Value)
Debug.Print "C25 a changé. Nouvelle valeur de C23 : " & Range("C23").Value
' Mettre à jour C24 avec la valeur minimale entre sa valeur actuelle et la nouvelle valeur de C25
Range("C24").Value = Application.Min(newC25Value, Range("C24").Value)
Debug.Print "C25 a changé. Nouvelle valeur de C24 : " & Range("C24").Value
End If
End Sub
Bonjour h2so4, je comprends pas ta réponse.
re, C24 change chaque fois que C25 change, mais c'est seulement au moment où C25 est < C24 qu'on voit la différence. Maintenant C24=0, donc seulement des valeurs négatives de C25 peuvent visuellement changer C24. Faites le teste et modifier C24 en par exemple 10 et puis changez C25 en 9 et C24 sera 9.
Pour éviter des changements inutiles, vous pouvez changer la macro en :
Private Sub Worksheet_Change(ByVal Target As Range)
With Target
If .Address <> "$C$25" Then Exit Sub
' Mettre à jour C23 avec la valeur maximale entre sa valeur actuelle et la nouvelle valeur de C25
If Range("C23").Value < .Value Then
Range("C23").Value = .Value
'Debug.Print "C25 a changé. Nouvelle valeur de C23 : " & Range("C23").Value
End If
' Mettre à jour C24 avec la valeur minimale entre sa valeur actuelle et la nouvelle valeur de C25
If Range("C24").Value > .Value Then
Range("C24").Value = .Value
'Debug.Print "C25 a changé. Nouvelle valeur de C24 : " & Range("C24").Value
End If
End With
End Sub
Bonjour, j'ai l'impression que le code ne fonctionne pas, quand j'actualise mon classeur rien ne change, il faut aussi tenir en compte que normalement dans la cellule C25 c'est le résultat de "=(C7-C8)+C20" quand le classeur s'actualise et que je ne saisi aucune donné manuellement, je vous envoi la dernière version du ficher avec le dernier code VBA.
re,
il faut plutôt choisir pour l'évent "Calculate" je suppose, parce que C7, C8, C20 et C25 sont des formules
dans module4 (pas nécessairement 4 ,les autres sont aussi okay)
Public Mon_C25 As Double
et dans la feuille "Dashboard"
Private Sub Worksheet_Calculate()
With Range("C25")
If .Value2 <> Mon_C25 Then
On Error GoTo ERR 'normallement je vois pas une possibilité d'erreurs
Mon_C25 = .Value2 '=Public variable déclaré dans Module 4 ****************************
Application.EnableEvents = False 'désactiver les events
' Mettre à jour C23 avec la valeur maximale entre sa valeur actuelle et la nouvelle valeur de C25
If Range("C23").Value2 < Mon_C25 Then
Range("C23").Value = Mon_C25 'C23 = la valeur max de C25
Debug.Print Format(Now, "hh:mm:ss"), "Nouvelle valeur de C23", Range("C23").Value
End If
' Mettre à jour C24 avec la valeur minimale entre sa valeur actuelle et la nouvelle valeur de C25
If Range("C24").Value > Mon_C25 Then
Range("C24").Value = Mon_C25
Debug.Print Format(Now, "hh:mm:ss"), "Nouvelle valeur de C24", Range("C24").Value
End If
GoTo FIN
ERR:
MsgBox "erreur"
FIN:
Application.EnableEvents = True
End If
End With
End Sub
PS. La macro désactive et active les évents, je ne connais pas assez la feuille, mais peut-être cela n'est pas nécessaire
re, votre ontime cause chaque heure des problèmes s'on l'arrête pas comme il faut.
dans "thisworkbook"
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Stop_Ontime
End Sub
dans le module2, déclarer cette variable dans la première ligne
Public dOnTime As Double 'ajouter cette ligne
Sub AltcoinSeasonIndex()
Dim url As String
Dim httpRequest As Object
.....
et puis au bout de ce module2
....
'Planifier la prochaine exécution
Stop_Ontime
dOnTime = Now + TimeValue("01:00:00")
Application.OnTime dOnTime, "AltcoinSeasonIndex"
End Sub
Sub Stop_Ontime()
On Error Resume Next
Application.OnTime dOnTime, "AltcoinSeasonIndex", , 0
On Error GoTo 0
End Sub