Dans ce cas, il faut utiliser la solution de @job75 qui parcourt toute la plage de donnée :serait-il possible d'avoir la solution dans un module (à la suite d'un VBA déjà existant j'ai 30 feuilles identique) et non dans la feuille pour que cette action se lance en dernier
Sub ContrôleSaisie(sh As Worksheet)
Dim tablo, i&, x
With sh.Range("A1", sh.UsedRange).Resize(, 11)
tablo = .Value 'matrice, plus rapide
For i = 1 To UBound(tablo)
x = tablo(i, 3)
tablo(i, 11) = IIf(tablo(i, 1) = "X" And tablo(i, 2) = "MAISON" And (x = "AA" Or x = "BB" Or x = "CC"), "X", "")
Next
Application.EnableEvents = False
.Columns(11) =...
Private Sub Worksheet_Change(ByVal Target As Range)
Dim lgn As Long
If Target.Count = 1 And InStr("-1-2-3-11-", "-" & Target.Column & "-") <> 0 Then
Application.EnableEvents = False
lgn = Target.Row
If UCase(Me.Cells(lgn, 1)) = "X" And UCase(Me.Cells(lgn, 2)) = "MAISON" And InStr("-AA-BB-CC-", "-" & UCase(Me.Cells(lgn, 3)) & "-") <> 0 _
Then
Me.Cells(lgn, 11) = "X"
Else
Me.Cells(lgn, 11).ClearContents
End If
Application.EnableEvents = True
End If
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim tablo, i&, x
With Range("A1", UsedRange).Resize(, 11)
tablo = .Value 'matrice, plus rapide
For i = 1 To UBound(tablo)
x = tablo(i, 3)
tablo(i, 11) = IIf(tablo(i, 1) = "X" And tablo(i, 2) = "MAISON" And (x = "AA" Or x = "BB" Or x = "CC"), "X", "")
Next
Application.EnableEvents = False
.Columns(11) = Application.Index(tablo, , 11)
Application.EnableEvents = True
End With
End Sub
Bonsoir @ced91300
Bon, sur mon pc ça fonctionne :
Regarde la pièce jointe 1197118
Le code est-il au bon endroit :
Regarde la pièce jointe 1197119
Les événements ne sont-ils pas bloqués ?
Si c'est le cas la macro ne peut pas se dérouler, réactive les avec cette petite macro :
Sub ActiveEvents()
Application.EnableEvents=TrueEnd Sub
Sinon je ne vois pas ...
Je joins de nouveau le fichier que je viens de tester.
A bientôt
EDIT : Orthographe !!!
bonsoir, oui merci effectivement cela fonctionne impeccablement.Bonsoir @ced91300
Bon, sur mon pc ça fonctionne :
Regarde la pièce jointe 1197118
Le code est-il au bon endroit :
Regarde la pièce jointe 1197119
Les événements ne sont-ils pas bloqués ?
Si c'est le cas la macro ne peut pas se dérouler, réactive les avec cette petite macro :
Sub ActiveEvents()
Application.EnableEvents=TrueEnd Sub
Sinon je ne vois pas ...
Je joins de nouveau le fichier que je viens de tester.
A bientôt
EDIT : Orthographe !!!
Merci job75Bonjour ced91300, AtTheOne,
Une autre solution avec cette macro dans le code de la feuille :
Elle se déclenche quand on modifie ou valide une cellule quelconque.VB:Private Sub Worksheet_Change(ByVal Target As Range) Dim tablo, i&, x With Range("A1", UsedRange).Resize(, 11) tablo = .Value 'matrice, plus rapide For i = 1 To UBound(tablo) x = tablo(i, 3) tablo(i, 11) = IIf(tablo(i, 1) = "X" And tablo(i, 2) = "MAISON" And (x = "AA" Or x = "BB" Or x = "CC"), "X", "") Next Application.EnableEvents = False .Columns(11) = Application.Index(tablo, , 11) Application.EnableEvents = True End With End Sub
Elle est très rapide car elle utilise un tableau VBA.
Nota : la casse est respectée.
A+
Dans ce cas, il faut utiliser la solution de @job75 qui parcourt toute la plage de donnée :serait-il possible d'avoir la solution dans un module (à la suite d'un VBA déjà existant j'ai 30 feuilles identique) et non dans la feuille pour que cette action se lance en dernier
Sub ContrôleSaisie(sh As Worksheet)
Dim tablo, i&, x
With sh.Range("A1", sh.UsedRange).Resize(, 11)
tablo = .Value 'matrice, plus rapide
For i = 1 To UBound(tablo)
x = tablo(i, 3)
tablo(i, 11) = IIf(tablo(i, 1) = "X" And tablo(i, 2) = "MAISON" And (x = "AA" Or x = "BB" Or x = "CC"), "X", "")
Next
Application.EnableEvents = False
.Columns(11) = Application.Index(tablo, , 11)
Application.EnableEvents = True
End With
End Sub
Sub Appel()
Dim sh As Worksheet
For Each sh In ThisWorkbook.Worksheets
'Placer un test ici si toutes les feuilles ne sont pas a traiter par ex
If sh.Name Like "Tst_##" Then
ContrôleSaisie sh
Else
End If
Next
End Sub