XL 2019 Mettre un "X" automatiquement dans une cellule selon critères valeurs sur la même ligne

  • Initiateur de la discussion Initiateur de la discussion ced91300
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

ced91300

XLDnaute Occasionnel
Bonjour à tous,

j'aurai besoin via (Macro) à ce que que dans une colonne s'affiche automatiquement "X" selon plusieurs critères des valeurs se trouvant sur la même ligne.

merci de votre aide.

Cordialement

Cédric
 

Pièces jointes

Solution
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
Dans ce cas, il faut utiliser la solution de @job75 qui parcourt toute la plage de donnée :
Code
VB:
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) =...
Bonjour à toutes & à tous, bonjour @ced91300
Je re propose une solution par formule et non vba :
En K3
=SI(($A3="X")*($B3="MAISON")*(($C3="AA")+($C3="BB")+($C3="CC"));"X";"")
Je suis sur mon téléphone, je ne peux pas écrire de macro ...
Voir pièce jointe
À bientôt
 

Pièces jointes

Re,
J'ai récuoéré mon PC, voici une version via macro :
le code dans le code de la feuil1 :
VB:
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

voir le fichier joint
 

Pièces jointes

Bonsoir @ced91300
Bon, sur mon pc ça fonctionne :
1716047018442.gif


Le code est-il au bon endroit :
1716047066007.jpeg


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=True​
End Sub

Sinon je ne vois pas ...
Je joins de nouveau le fichier que je viens de tester.

A bientôt
EDIT : Orthographe !!!
 

Pièces jointes

Dernière édition:
Bonjour ced91300, AtTheOne,

Une autre solution avec cette macro dans le code de la feuille :
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 se déclenche quand on modifie ou valide une cellule quelconque.

Elle est très rapide car elle utilise un tableau VBA.

Nota : la casse est respectée.

A+
 

Pièces jointes

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=True​
End Sub

Sinon je ne vois pas ...
Je joins de nouveau le fichier que je viens de tester.

A bientôt
EDIT : Orthographe !!!
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=True​
End 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.

En revanche, je souhaite l'avoir à la suite d'un vba déjà existant dans module et non dans la feuille (j'ai 30 feuilles identique) et quand je lance le vba cela m'efface certains résultats donnés par ta solution.

Merci
 
Bonjour ced91300, AtTheOne,

Une autre solution avec cette macro dans le code de la feuille :
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 se déclenche quand on modifie ou valide une cellule quelconque.

Elle est très rapide car elle utilise un tableau VBA.

Nota : la casse est respectée.

A+
Merci job75

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

Merci
 
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
Dans ce cas, il faut utiliser la solution de @job75 qui parcourt toute la plage de donnée :
Code
VB:
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

Voir fichier joint
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour