Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2019 Plusieurs conditions avec Sub Worksheet_Change (ByVal Target As Range)

pat66

XLDnaute Impliqué
Bonjour le forum,

Je reviens vers vous et sollicite votre expertise car j'ai du mal à combiner ces 2 macros, à savoir :

Si Worksheets("Feuil1").Range("F30") = "A" ou si Worksheets("Feuil1").Range ("F30") = "B" ou Worksheets("Feuil1").Range("F30") = "C" then
exit sub
else
Call reinitioption
end if
end sub

Si Worksheets("Feuil1").Range("G195") <> 0 Or Worksheets("Feuil2").Range("AM106") = 2 Or Worksheets("Feuil2").Range("Y151") = "Non" Then
Exit Sub
else
Call reinitioption
end if
end sub



PS : dans les 2 cas il suffit qu'une des 3 valeurs soit différente pour activer Call reinitioption

Un grand merci pour votre aide

Pat66
 
Dernière édition:
Solution
Avec trois feuilles, c'est peut être plus simple de passer par des "Set", ce qui évite plusieurs "With" :
VB:
Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Fin: If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, [F30]) Is Nothing Then
        Set F2 = Sheets("Feuil2")
        Set F3 = Sheets("Feuil3")
        If (Target = "A" Or Target = "B" Or Target = "C") Or _
            F2.[M6] = 1 Or F2.[K17] = "Oui" Or F3.[G5] = 0 Then
                Call Reinitioption
        End If
    End If
Fin:
End Sub
Sub Reinitioption() ' Pour test
    MsgBox "Exécution de Reinitioption."
End Sub

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Pat,
Utilisez donc la balise </> pour le code c'est plus lisible. ( à droite de l'icone GIF )
En PJ avec ce que j'ai compris :
VB:
Feuil1 :
Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Fin1: If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, [F30]) Is Nothing And (Target <> "A" And Target <> "B" And Target <> "C") Then
        Call Reinitioption
    End If
Fin1:
End Sub

Feuil2:
Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Fin2: If Target.Count > 1 Then Exit Sub
    If (Not Intersect(Target, [G195]) Is Nothing And Target <> 0) Or _
        (Not Intersect(Target, [AM106]) Is Nothing And Target = 2) Or _
        (Not Intersect(Target, [Y151]) Is Nothing And Target = "Non") Then
        Call Reinitioption
    End If
Fin2:
End Sub
 

Pièces jointes

  • Pat66.xlsm
    12 KB · Affichages: 1

pat66

XLDnaute Impliqué
Bonjour Sylvanu,
merci pour votre aide,

En lisant votre solution, j'ai remarqué que votre macro considère si je ne m'abuse, If (Not Intersect(Target, [G195]) est sur la feuil2 et non sur la feuille 1, pouvez vous le rectifier svp, merci beaucoup

VB:
Feuil2:[/U][/COLOR]
Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Fin2: If Target.Count > 1 Then Exit Sub
   [B] If (Not Intersect(Target, [G195]) Is Nothing And Target <> 0) Or _   ' G195 est sur la feuil2 et non sur la feuil1[/B]
        (Not Intersect(Target, [AM106]) Is Nothing And Target = 2) Or _
        (Not Intersect(Target, [Y151]) Is Nothing And Target = "Non") Then
        Call Reinitioption
    End If
Fin2:
End Sub
 
Dernière édition:

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Exact. Mais pourquoi avoir mis une condition Feuil1 avec les conditions Feuil2 ?
Je n'ai pas fait attention. Sorry
En PJ :
Code:
Feuil1 :
Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Fin1: If Target.Count > 1 Then Exit Sub
    If (Not Intersect(Target, [F30]) Is Nothing And (Target <> "A" And Target <> "B" And Target <> "C")) Or _
        (Not Intersect(Target, [G195]) Is Nothing And Target <> 0) Then
        Call Reinitioption
    End If
Fin1:
End Sub

Feuil2 :
Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Fin2: If Target.Count > 1 Then Exit Sub
    If (Not Intersect(Target, [AM106]) Is Nothing And Target = 2) Or _
        (Not Intersect(Target, [Y151]) Is Nothing And Target = "Non") Then
        Call Reinitioption
    End If
Fin2:
End Sub
 

Pièces jointes

  • Pat66.xlsm
    12 KB · Affichages: 4

pat66

XLDnaute Impliqué
Bonjour le forum
bonjour Sylvanu,

est il possible de combiner les 2, c'est à dire que toutes ces cellules sont testées lorsque il y un changement dans F30 de la feuille1 ?, voir mon post1 que j'ai du mal rédigé, j'en suis désolé !

merci

bonne journée

Pat66
 

TooFatBoy

XLDnaute Barbatruc
Bonjour,

Une proposition :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
'
    With Worksheets("Feuil1")
        If .Range("F30") = "A" Or .Range("F30") = "B" Or .Range("F30") = "C" Or .Range("G195") <> 0 Then Exit Sub
    End With

    With Worksheets("Feuil2")
        If .Range("AM106") = 2 Or .Range("Y151") = "Non" Then Exit Sub
    End With

    Call reinitioption

End Sub


Ceci dit, pourquoi ne pas mettre les tests tout simplement au début de la macro reinitioption ?
 
Dernière édition:

pat66

XLDnaute Impliqué
bonjour TooFatBoy,

merci pour votre aide,
mais votre macro teste pas toutes ces cellule en même temps dès que modifie F30 de la feuil1 ?

pat66
 
Dernière édition:

pat66

XLDnaute Impliqué
re,

en fait, il me faudrait ce genre de test dans une seule macro :

' sur la Feuil1
Private Sub Worksheet_Change(ByVal Target As Range)
If .Range("F30") = "A" Or .Range("F30") = "B" Or .Range("F30") = "C" And .Range("G195") <> 0 And Worksheets("Feuil2").Range("AM106") = 2 And Worksheets("Feuil2").Range("Y151") = "Non" Then Exit Sub
else
Msgbox " Veuillez réinitialiser cette offre"
Call Reinitioption
end sub

merci d'avance
 

pat66

XLDnaute Impliqué
bonjour le forum,

je suis désolé, je dois mal formulé mon problème.
Pour faire simple, je voulais savoir si c'était possible qu'un changement sur la cellule F30 de la feuille 1 (uniquement) puisse tester plusieurs cellules de la feuille1 et de la feuille 2, et faire en sorte que si une de ces valeurs soient vrai, alors on déclenche une macro, sinon exit sub

merci quand même

bonne journée
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re ,
Alors cet essai avec :
VB:
Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Fin: If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, [F30]) Is Nothing Then
        With Sheets("Feuil2")
            If (Target <> "A" Or Target <> "B" Or Target <> "C") Or _
                .[G195] <> 0 Or .[AM106] = 2 Or .[Y151] = "Non" Then
                Call Reinitioption
            End If
        End With
    End If
Fin:
End Sub
Sub Reinitioption() ' Pour test
    MsgBox "Exécution de Reinitioption."
End Sub
La macro se déclenche que sur changement de la valeur en Feuil1 F30.
Reinitioption est exécutée si F30=A,B ou C, ou si en feuil2 G195<>0 ou AM106=2 ou Y151=Non
Il suffit qu'une de ces 6 conditions soient vrai pour exécuter Reinitioption.
 

Pièces jointes

  • Pat66 (1).xlsm
    13.9 KB · Affichages: 3

pat66

XLDnaute Impliqué
re,

C'est Nickel Sylvanu, j'ai simplement dû modifier les tests sur F30 en remplaçant les Or par des And, et je ne sais pas l'expliquer, mais cela fonctionne très bien

VB:
Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Fin: If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, [F30]) Is Nothing Then
        With Sheets("Feuil2")
            If (Target <> "A" [B]And[/B] Target <> "B" [B]And[/B] Target <> "C") Or _
                .[G5] = 0 Or .[M6] = 1 Or .[K17] = "Oui" Then
                Call Reinitioption
            End If
        End With
    End If
Fin:
End Sub
Sub Reinitioption() ' Pour test
    MsgBox "Exécution de Reinitioption."
End Sub

un grand merci pour ton aide et ta patience

Pat66
 

Discussions similaires

Réponses
3
Affichages
394
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…