XL 2019 Conditions dans Worksheet_Change(ByVal Target As Range)

pat66

XLDnaute Impliqué
Bonsoir le forum, la macro ci dessous répond à mes besoins, même si c'est certain elle n'est bien écrite
, mais j'ai besoin d'ajouter une autre condition, pourriez vous m'aidez svp

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
  On Error Resume Next
   If Range("D11") = "" Then
   ActiveSheet.Shapes("Rectangle 26").Visible = False
   Else
   ActiveSheet.Shapes("Rectangle 26").Visible = True
  End If
     If Range("U29") < Range("V29") Then
   ActiveSheet.Shapes("Groupe 38").Visible = False
  End If
  On Error GoTo 0
 If Target.Count > 1 Then Exit Sub
 If Target.Address <> "$H$21" Then Exit Sub
   If Target.Value = "" Then Exit Sub
    If Not Intersect(Target, Range("H21")) Is Nothing Then
        Me.Cells(21, "D").Value = Me.Cells(50, "D").Value
    End If
end sub
condition à ajouter :
If Range("U29") < Range("V29") Then
activeSheet.Range("D11") = ""
mais cela engendre un bug car incompatible avec la dernière condition ou on demande de remplir D21 avec D50 si on modifie H21 et je suis incapable de combiner les 2 conditions

un grand merci et bonne soirée
 
Dernière édition:
Solution
Bonsoir Pat,
Le problème est que si vous modifiez D11 vous exécuter la macro.
Macro où vous modifiez D11, donc vous exécuter la macro ... ect ect
Généralement ça se termine mal. On appelle ça de la ré entrance.
Pour éviter ça, vous pouvez inhiber tout nouveau événement avec Application.EnableEvents = False
et à la fin vous remettez tout correct avec Application.EnableEvents = True.
Ne pas oublier de mettre un On error goto pour être sur qu'en cas de pn inopiné le flag True sera remis, car sinon cette macro resterait à inactive.
Essayez comme ça pour voir :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo Fin
    Application.EnableEvents = False
    On Error Resume Next
    If Range("D11") = "" Then...

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir Pat,
Le problème est que si vous modifiez D11 vous exécuter la macro.
Macro où vous modifiez D11, donc vous exécuter la macro ... ect ect
Généralement ça se termine mal. On appelle ça de la ré entrance.
Pour éviter ça, vous pouvez inhiber tout nouveau événement avec Application.EnableEvents = False
et à la fin vous remettez tout correct avec Application.EnableEvents = True.
Ne pas oublier de mettre un On error goto pour être sur qu'en cas de pn inopiné le flag True sera remis, car sinon cette macro resterait à inactive.
Essayez comme ça pour voir :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo Fin
    Application.EnableEvents = False
    On Error Resume Next
    If Range("D11") = "" Then
        ActiveSheet.Shapes("Rectangle 26").Visible = False
    Else
        ActiveSheet.Shapes("Rectangle 26").Visible = True
    End If
    If Range("U29") < Range("V29") Then
        ActiveSheet.Shapes("Groupe 38").Visible = False
        Range("D11") = ""
    End If
    On Error GoTo 0
    If Target.Count = 1 And Target.Address = "$H$21" And Target.Value <> "" Then
        If Not Intersect(Target, Range("H21")) Is Nothing Then
            Me.Cells(21, "D").Value = Me.Cells(50, "D").Value
        End If
    End If
Fin:
    Application.EnableEvents = True
End Sub
Mais pour être sur de passer sur la Ligne Fin il faut éviter les exit sub, sinon le flag resterait à False, donc j'utilise un AND qui valide la suite.

Par contre, au prochain changement de valeur dans une cellule alors comme D11 et vide ...
A voir si c'est bien ce que vous vouliez, sinon il y a une erreur de raisonnement au départ.
 
Dernière édition:

pat66

XLDnaute Impliqué
Bonjour Sylvanu,

merci pour votre aide, mais en relisant ce fil et en testant votre solution, je me suis rendu compte que je vous ai induit en erreur, en effet ce n'est pas :
If Range("U29") < Range("V29") Then
activeSheet.Range("D11") = ""
mais
If Range("U29") < Range("V29") Then
activeSheet.Range("D21") = ""

Alors j'ai testé votre solution en remplaçant
If Range("U29") < Range("V29") Then
activeSheet.Range("D11") = ""
par

If Range("U29") < Range("V29") Then
activeSheet.Range("D21") = ""
et ça à l'air de fonctionner également qu'en pensez vous ?

merci beaucoup

Pat66
 

pat66

XLDnaute Impliqué
bonjour,

oui bien sur, je retape toujours à la main car je souhaite essayer de comprendre ce que vous avez la gentillesse de nous aider à solutionner.
J'ai donc pris votre solution en remplaçant activeSheet.Range("D11") = "" par activeSheet.Range("D21") = "", et après plusieurs tests, votre solution fonctionne bien

un grand merci

Pat66
 

Discussions similaires

Statistiques des forums

Discussions
312 961
Messages
2 093 961
Membres
105 900
dernier inscrit
Mahjoub BE