Conditions If dans une macro

mikael2403

XLDnaute Junior
Bonsoir le Forum,

Je bute sur une méthode If dans une macro. ça ne doit pas être très compliquée mais la macro ne fonctionne pas correctement.

Voici mon code :
Code:
If Target.Address = "$A$31" And (IsEmpty(Range("A27")) And IsEmpty(Range("A28"))) _
Or Sheets("Accueil").Range("U30").Value = "TEST" Then UserForm3.Show: Range("A31:C31").ClearContents

Pour traduire, je voudrais interdire la saisie dans la cellule A31 si les cellules A27 et A28 sont vides ou si la valeur de la cellule U30 de la feuille accueil est égale à "TEST".

Le code ci-dessus me lance le UserForm3 a chaque fois que j'entre du texte dans la cellule A31 même si les conditions ne sont pas respectées.

Ai-je fais une erreur dans ma saisie ?

Je vous remercie pour votre aide.

Mikael.
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Conditions If dans une macro

Bonsoir Mikael, bonsoir le forum,

Essaie comme ça :

Code:
If Target.Address <> "$A$31" Then Exit Sub
If Range("A27") = "" And Range("A28") = "" Then
    If Sheets("Accueil").Range("U30").Value = "TEST" Then
        UserForm3.Show
        Range("A31:C31").ClearContents
    End If
End If
 

mikael2403

XLDnaute Junior
Re : Conditions If dans une macro

Bonsoir Robert,

Je te remercie pour ta réponse rapide.
ça ne fonctionne pas.

Si j'entre du texte dans la cellule A31 et que la valeur de la cellule U30 de la feuille accueil est égale à TEST, je n'ai pas le UserForm3 qui s'affiche.
De même que si j'entre du texte dans A31 alors qu'A27 et A28 sont vides, le texte est autorisé. Ce que je ne veux pas.

Merci.:p
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Conditions If dans une macro

Bonsoir Mikael, bonsoir le forum

Pour que l'UserForm3 s'affiche il faut que les trois conditions soient réunies :
A27 vide
A28 vide
U30 (onglet accueil) ="TEST" (Attention à la casse (Majuscule/Minuscule))

Donc si tu édites dans A31 et que U30="TEST", cela n'est pas suffisant pour lancer l'Userform3... Il faut aussi que A27 et A28 soient vides.

Ensuite, j'aimerais savoir à quelle macro événementielle tu appliques ce code. À Change ou à SelectionChange ?

Car si tu l'appliques à Change, tu n'empêches pas l'édition en A31 puisque la macro ne se déclenche qu'une fois A31 validé... Il faudrait rajouter à ton code un Target.ClearContents si les conditions ne sont pas respéctées...

Je verrais les chose plutôt comme ça :
Code:
Private test As Boolean 'déclare la variable test au nveau du composant Sheet
Private Sub Worksheet_Change(ByVal Target As Range)
 
'ce test evite la boucle du Change puisque des cellules sont effaçées
If test = True Then 'condition : si test est vrai
    test = False 'test devient faux
    Exit Sub 'sort de la procédure
End If 'fin de la contition
'Condition : si l'édition se fait ailleurs qu'en A3, sort de la procédure
If Target.Address <> "$A$31" Then Exit Sub
If Range("A27") = "" And Range("A28") = "" Then 'condition 1 : sil A27 et A28 sont vides
    If Sheets("Accueil").Range("U30").Value = "TEST" Then 'condition 2 : si U30="TEST"
        UserForm3.Show 'affiche l'UserForm3
        Range("A31:C31").ClearContents 'efface le contenu de A31:C31 (la le code repart au début...)
    End If 'fin de la condition 2
End If 'fin de la condition 2
test = True 'définit la variable test
Target.ClearContents 'supprime l'édition faite en A31 (la le code repart au début aussi...)
End Sub

J'ai testé ça fonctionne bien...
 
Dernière édition:

Discussions similaires

Réponses
1
Affichages
168

Statistiques des forums

Discussions
312 237
Messages
2 086 489
Membres
103 234
dernier inscrit
matteo75654548