Microsoft 365 Worksheet_Change ou Worksheet_Calculate

  • Initiateur de la discussion Initiateur de la discussion juju91
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

juju91

XLDnaute Junior
Bonjour à tous,

j'ai besoin de votre aide.
Je souhaiterais que lorsqu'une cellule de la plage ("F9:F25") change une macro affiche ou non des Shapes.
Mais le problème est que les valeurs dans les cellules de la plage ("F9:F25") sont le résultats de formules.
Je ne peux pas utiliser les valeurs d'origines des formules comme Target dans la fonction Worksheet_Change pour déclencher la macro.

Le code ci-dessous ne fonctionne pas ...

Private Sub Worksheet_Calculate(ByVal Target As Range)
If Intersect(Target, Range("F8:F20")) Is Nothing Then Exit Sub
If Target.Value = "" Then
Me.Shapes("ZoneTexte 4").Visible = True
Me.Shapes("ZoneTexte 9").Visible = False
Else
Me.Shapes("ZoneTexte 4").Visible = False
Me.Shapes("ZoneTexte 9").Visible = True
End If
End If

End Sub


Auriez-vous une suggestion ?

Par avance merci.

Cdt
 
Bonjour.
Et vous ne pouvez pas tester le changement de contenu des antécédents de ces formules ?
Il serait possible d'écrire une fonction perso qui stocke sa cellule appelante dans une collection exploitée ensuite dans la Sub Worksheet_Calculate.
 
Dernière édition:
Même plus simple: la fonction perso peut directement agir sur la visibilité des formes :
VB:
Function XXX(ByVal Valeur)
   XXX = Valeur
   ActiveSheet.Shapes(1).Visible = Valeur <> ""
   ActiveSheet.Shapes(2).Visible = Not ActiveSheet.Shapes(1).Visible
   End Function
 
Bonjour et merci de passer du temps sur mon problème.
Désolé je ne maîtrise pas le VBA .
Que dois-je faire pour appliquer votre suggestion d'utiliser une fonction perso dans mon cas de figure sachant qu'il faudrait que la fonction se déclenche lors de la modification de n'importe quelle cellule de la plage ("F9:F25").

Et encore un grand merci pour votre aide.

Cdt
 
Bonjour juju91, Bernard,

J'ai testé, ceci fonctionne bien chez moi :
VB:
Private Sub Worksheet_Calculate()
Dim P As Range, mem, i
Set P = [F9:F25]
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Undo 'annule la modification
mem = P 'mémorise
Application.Undo 'rétablit la modification
For i = 1 To UBound(mem)
    If mem(i, 1) <> P(i) Then
        If P(i) = "" Then
            Me.Shapes("ZoneTexte 4").Visible = True
            Me.Shapes("ZoneTexte 9").Visible = False
        Else
            Me.Shapes("ZoneTexte 4").Visible = False
            Me.Shapes("ZoneTexte 9").Visible = True
        End If
        Exit For 'on s'arrête à la 1ère modification
    End If
Next
Application.EnableEvents = True
End Sub
A+
 
Un peu plus simple :
VB:
Private Sub Worksheet_Calculate()
Dim P As Range, mem, i
Set P = [F9:F25]
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Undo 'annule la modification
mem = P 'mémorise
Application.Undo 'rétablit la modification
Application.EnableEvents = True
For i = 1 To UBound(mem)
    If mem(i, 1) <> P(i) Then
        Me.Shapes("ZoneTexte 4").Visible = P(i) = ""
        Me.Shapes("ZoneTexte 9").Visible = P(i) <> ""
        Exit For 'on s'arrête à la 1ère modification
    End If
Next
End Sub
 
Si l'on crée une valeur d'erreur il y a bug donc utiliser :
VB:
Private Sub Worksheet_Calculate()
Dim P As Range, mem, i
Set P = [F9:F25]
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Undo 'annule la modification
mem = P 'mémorise
For i = 1 To UBound(mem): mem(i, 1) = CStr(P(i)): Next i
Application.Undo 'rétablit la modification
Application.EnableEvents = True
For i = 1 To UBound(mem)
    If mem(i, 1) <> CStr(P(i)) Then
        Me.Shapes("ZoneTexte 4").Visible = CStr(P(i)) = ""
        Me.Shapes("ZoneTexte 9").Visible = CStr(P(i)) <> ""
        Exit For 'on s'arrête à la 1ère modification
    End If
Next i
End Sub
 

Pièces jointes

Avec cette macro la plage P peut être un vecteur colonne ou un vecteur ligne :
VB:
Private Sub Worksheet_Calculate()
Dim P As Range, mem(), i
Set P = [F9:F25] '[L8:S8] 'vecteur colonne ou vecteur ligne
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Undo 'annule la modification
ReDim mem(1 To P.Count)
For i = 1 To UBound(mem): mem(i) = CStr(P(i)): Next i
Application.Undo 'rétablit la modification
Application.EnableEvents = True
For i = 1 To UBound(mem)
    If mem(i) <> CStr(P(i)) Then
        Me.Shapes("ZoneTexte 4").Visible = CStr(P(i)) = ""
        Me.Shapes("ZoneTexte 9").Visible = CStr(P(i)) <> ""
        Exit For 'on s'arrête à la 1ère modification
    End If
Next i
End Sub
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
479
Réponses
4
Affichages
223
  • Question Question
Microsoft 365 Probléme VBA
Réponses
8
Affichages
317
Retour