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 43 44 45 46
| 'Cette macro se déclenche quand on entre une valeur dans une cellule
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Sh As Worksheet, C As Range, Ligne As Long, Col As Integer, Ctr As Integer
'si la cellule modifiée ne fait pas partie de la plage B4:H4, on arrête la macro.
If Intersect(Target, [B4:H4]) Is Nothing Then Exit Sub
'Effacement de la plage A8:H10000
[A8:H10000].ClearContents
If Application.CountA([B4:H4]) = 0 Then Exit Sub
'La variable "Ligne" va servir à déterminer où écrire le résultat
Ligne = 7
'Boucle les feuilles
For Each Sh In Worksheets
'... sauf sur la feuille MENU
If Sh.Name <> "MENU" Then
'tout ce qui commence par un point se réfère à "Sh"
With Sh
'pour chaque cellule de la plage des cellules noon vides de la colonne A
For Each C In .Range(.[A2], .Cells(.Rows.Count, 1).End(xlUp))
'"Ctr" sert à compter les égalités ligne en cours - cellules de recherche
Ctr = 0
'comparaison des 5 cellules; on incrémente Ctr en cas d'égalité
'ou si la cellule de la zone de recherche est vide
For Col = 1 To 5
If InStr(1, .Cells(C.Row, Col), Cells(Target.Row, Col + 1)) > 0 Or _
Cells(Target.Row, Col + 1) = "" Then
Ctr = Ctr + 1
End If
Next Col
'si on n'a que des égalités
If Ctr = 5 Then
'on incrémente le n° de ligne où on va écrire le résultat
Ligne = Ligne + 1
'cette ligne évite de redéclencher la macro puisqu'on va écrire sur la feuille
Application.EnableEvents = False
'éccriture du résultat
.Cells(C.Row, 1).Resize(, 7).Copy Sheets("MENU").Cells(Ligne, 2)
'cette ligne permet le redéclenchement de la macro quand on réécrira sur la feuille
Application.EnableEvents = True
End If
'traitement de la cellule suivante
Next C
End With
End If
'traitement de la feuille suivante
Next Sh
End Sub |
Partager