Bonjour,
L'idée est d'associer à chaque feuille(Feuil2 et Feuil3) une procédure évènementielle en ayant soin avant de déclarer deux variables booléennes destinées à empécher
les deux procédures évènementielles de se déclencher inéfiniment l'une à la suite de l'autre.
- Insérer un module dans l'éditeur VBE et dans ce module déclarer deux vaiables booléennes de statut Public.
Public Var1 As Boolean, Var2 As Boolean
- Ecrire, dans l’espace de travail associé à Feuil2 dans le VBE, le code suivant :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| Private Sub Worksheet_Change(ByVal Target As Range)
If Var1 = True Then Exit Sub
' empèche la procédure de démarrer si la procédure évènementielle sur l'autre feuille est en cours
If Target.Count > 1 Then Exit Sub
' permet de sortir de la procédure si plus d'une cellule est sélectionnée
' (sinon la suite de la macro renvoie un message d'erreur)
If Target.Column < 13 Or Target.Column > 14 Then Exit Sub
' permet de sortir de la procédure si la cellule changeant de valeur
' n'est pas dans l'une des colonnes M ou N
If Target.Value <> "x" And Target.Value <> "X" And Target.Value <> "" Then Exit Sub
' permet de sortir de la procédure si l'on n'a ni effacé la cellule changeant de valeur
' ni écrit un x (ou X) dans cette cellule.
Var2 = True
' neutralise la procédure évènementielle sur l'autre feuille
' Détermination du client, de l'action pointée et du montant correspondant
client = Cells(Target.Row, 2).Value
actionclient = Cells(3, Target.Column).Value
montant = Target.Offset(0, -3 + 2 * (Target.Column = 13))
' Mise à jour de l'autre feuille
Sheets("Feuil3").Activate
With ActiveSheet
precell = .Range("B1").End(xlDown).Row
dercell = .Range("B65536").End(xlUp).Row
For i = precell To dercell
If .Cells(i, 2).Value = client And .Cells(i, 7).Value = montant And .Cells(i, 14).Value = actionclient Then
.Cells(i, 13) = Target
End If
Next i
.[A1].Select
End With
Var2 = False
End Sub |
- Ecrire dans l’espace de travail associé à Feuil3 dans le VBE le code suivant :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| Private Sub Worksheet_Change(ByVal Target As Range)
If Var2 = True Then Exit Sub
' empèche la procédure de démarrer si la procédure évènementielle sur l'autre feuille est en cours
If Target.Count > 1 Then Exit Sub
' permet de sortir de la procédure si plus d'une cellule est sélectionnée
' (sinon la suite de la macro renvoie un message d'erreur)
If Target.Column <> 13 Then Exit Sub
' permet de sortir de la procédure si la cellule changeant de valeur
' n'est pas dans la colonne M
If Target.Value <> "x" And Target.Value <> "X" And Target.Value <> "" Then Exit Sub
' permet de sortir de la procédure si l'on n'a ni effacé la cellule changeant de valeur
' ni écrit un x (ou X) dans cette cellule.
Var1 = True
' neutralise la procédure évènementielle sur l'autre feuille
' Détermination du client, de l'action pointée et du montant correspondant
client = Cells(Target.Row, 2).Value
montant = Cells(Target.Row, 7).Value
colaction = 11 + 3 * (Cells(Target.Row, 14).Value = "acpt")
colpointage = colaction + 3 - 2 * (Cells(Target.Row, 14).Value = "acpt")
If client = "" Or montant = "" Then Exit Sub
' permet de sortir de la procédure si la cellule cochée est dans la colonne M mais dans une ligne "vide"
' Mise à jour de l'autre feuille
Sheets("Feuil2").Activate
With ActiveSheet
precell = .Range("B1").End(xlDown).Row
dercell = .Range("B65536").End(xlUp).Row
For i = precell To dercell
If .Cells(i, 2).Value = client And .Cells(i, colaction).Value = montant Then .Cells(i, colpointage) = Target
Next i
.[A1].Select
End With
Var1 = False
End Sub |
Ces deux procédures sont mises en oeuvre dans le classeur joint.
Ce classeur répond aussi à la dernière interrogation. Pour envoyer un classeur au format .xslm sur le site, il faut d'abord le compresser.
Cordialement
Claude
Partager