XL 2016 3 conditions avec if

dindin

XLDnaute Occasionnel
Bonjour le forum,

j'ai 2 colonnes B et C
La A contient que des numéros (max 5 chiffres)
dans la colonne C j'ai une liste déroulante qui contient "Annulé" et "Reporté"
mon souhait est le suivant :
si l'utilisateur choisi dans la colonne C : "Annulé", on ajoute dans la colonne B : "A_" & chiffre existant de la colonne B ça donne "A_1923" par exemple
si l'utilisateur choisi dans la colonne C : "Reporté", on ajoute dans la colonne B : "R_" & chiffre existant de la colonne B ça donne "R_1922" par exemple
si l'utilisateur laisse la cellule de la colonne C vide, on garde que les chiffres existants de la colonne B ça donne "1923" par exemple

j'essaye ce code qui bug un peu car si on change de choix il continue a rajouter les A ou R:

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
'si la cellule contient le mot annulé

If Target.Column = 3 And ActiveCell.Value = "Annulé" Then
Cells(Target.Row, 2).Value = "A" & Cells(Target.Row, 2).Value

ElseIf Target.Column = 3 And ActiveCell.Value = "Reporté" Then
Cells(Target.Row, 2).Value = "R" & Cells(Target.Row, 2).Value

ElseIf Target.Column = 3 And ActiveCell.Value = "" Then

Set obj = CreateObject("vbscript.regexp")
  obj.Global = True
  obj.Pattern = "[a-z,A-Z]+"
  chaine = Cells(Target.Row, 2).Value
  chaine = obj.Replace(chaine, "")
  Cells(Target.Row, 2).Value = chaine

End If

End Sub

Mon souhait:

1639738239569.png

Merci d'avance pour votre aide
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Dindin, bonjour le forum,

Peut-être comme ça :

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 3 Then Exit Sub 'si le changement a lieu ailleurs qe dans la colonne 3 (= C), sort de la procédure
Select Case Target.Value 'agit en fonction de la cellule modifiée (la cible)
    Case "Annulé" 'cas "Annulé"
        Target.Offset(0, -1).Value = "A_" & Target.Offset(0, -1).Value 'rajoute "A_"dans la cellule en colonne B
    Case "Reporté" 'cas "Reporté"
        Target.Offset(0, -1).Value = "R_" & Target.Offset(0, -1).Value 'rajoute "R_"dans la cellule en colonne B
    Case "" 'Cas ou rien n'est inscrit ou si la cellule cible est effacée
        'si il exite au moins une fois le caractères "_" dans la cellule colonne B,
        'redéfinit le texte en partant du troisième caractère
        If UBound(Split(Target.Offset(0, -1), "_")) > 0 Then Target.Offset(0, -1).Value = Mid(Target.Offset(0, -1).Value, 3)
End Select 'fin de l'action en fonction de la cellule modifiée
End Sub
 

dindin

XLDnaute Occasionnel
Bonjour Dindin, bonjour le forum,

Peut-être comme ça :

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 3 Then Exit Sub 'si le changement a lieu ailleurs qe dans la colonne 3 (= C), sort de la procédure
Select Case Target.Value 'agit en fonction de la cellule modifiée (la cible)
    Case "Annulé" 'cas "Annulé"
        Target.Offset(0, -1).Value = "A_" & Target.Offset(0, -1).Value 'rajoute "A_"dans la cellule en colonne B
    Case "Reporté" 'cas "Reporté"
        Target.Offset(0, -1).Value = "R_" & Target.Offset(0, -1).Value 'rajoute "R_"dans la cellule en colonne B
    Case "" 'Cas ou rien n'est inscrit ou si la cellule cible est effacée
        'si il exite au moins une fois le caractères "_" dans la cellule colonne B,
        'redéfinit le texte en partant du troisième caractère
        If UBound(Split(Target.Offset(0, -1), "_")) > 0 Then Target.Offset(0, -1).Value = Mid(Target.Offset(0, -1).Value, 3)
End Select 'fin de l'action en fonction de la cellule modifiée
End Sub
Bonjour Robert, et merci
Je regarde ça.
 

Jacky67

XLDnaute Barbatruc
Bonjour le forum,

j'ai 2 colonnes B et C
La A contient que des numéros (max 5 chiffres)
dans la colonne C j'ai une liste déroulante qui contient "Annulé" et "Reporté"
mon souhait est le suivant :
si l'utilisateur choisi dans la colonne C : "Annulé", on ajoute dans la colonne B : "A_" & chiffre existant de la colonne B ça donne "A_1923" par exemple
si l'utilisateur choisi dans la colonne C : "Reporté", on ajoute dans la colonne B : "R_" & chiffre existant de la colonne B ça donne "R_1922" par exemple
si l'utilisateur laisse la cellule de la colonne C vide, on garde que les chiffres existants de la colonne B ça donne "1923" par exemple

j'essaye ce code qui bug un peu car si on change de choix il continue a rajouter les A ou R:

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
'si la cellule contient le mot annulé

If Target.Column = 3 And ActiveCell.Value = "Annulé" Then
Cells(Target.Row, 2).Value = "A" & Cells(Target.Row, 2).Value

ElseIf Target.Column = 3 And ActiveCell.Value = "Reporté" Then
Cells(Target.Row, 2).Value = "R" & Cells(Target.Row, 2).Value

ElseIf Target.Column = 3 And ActiveCell.Value = "" Then

Set obj = CreateObject("vbscript.regexp")
  obj.Global = True
  obj.Pattern = "[a-z,A-Z]+"
  chaine = Cells(Target.Row, 2).Value
  chaine = obj.Replace(chaine, "")
  Cells(Target.Row, 2).Value = chaine

End If

End Sub

Mon souhait:

Regarde la pièce jointe 1124963
Merci d'avance pour votre aide
Bonjour à tous
Essaye comme ceci
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column <> 3 Then Exit Sub
    Application.EnableEvents = False
    If Left(Cells(Target.Row, 2), 2) = "R_" Or Left(Cells(Target.Row, 2), 2) = "A_" Then Cells(Target.Row, 2) = Mid(Cells(Target.Row, 2), 3, 9 ^ 9)
    If ActiveCell.Value = "Annulé" Then Cells(Target.Row, 2) = "A_" & Cells(Target.Row, 2).Value
    If ActiveCell.Value = "Reporté" Then Cells(Target.Row, 2) = "R_" & Cells(Target.Row, 2).Value
    Application.EnableEvents = True
End Sub
 

Pièces jointes

  • Annu_Rep.xlsm
    15.1 KB · Affichages: 8
Dernière édition:

patricktoulon

XLDnaute Barbatruc
Bonjour
je ne vois pas l’intérêt du VBA la dedans
tu a une liste déroulante(liste de validation je suppose) avec 2 mots

en colonne C ta liste de validation "Annuler;Reporté"
en colonne "B" la formule à étendre à souhait
=SI(A1<>"";SI(C1<>"";GAUCHE(C1;1)&"_" &A1;A1);"")

résultat
demo.gif


et puis même en vba !!!

pourriez vous me dire a quoi ça sert d'aller recouper l’éventuel préfixe précédemment choisi EN B alors que tu a la donnée saine en A????🤔🤔🤔🤯
 
Dernière édition:

Jacky67

XLDnaute Barbatruc
Bonjour
je ne vois pas l’intérêt du VBA la dedans
tu a une liste déroulante(liste de validation je suppose) avec 2 mots

en colonne C ta liste de validation "Annuler;Reporté"
en colonne "B" la formule à étendre à souhait
=SI(A1<>"";SI(C1<>"";GAUCHE(C1;1)&"_" &A1;A1);"")



et puis même en vba !!!

pourriez vous me dire a quoi ça sert d'aller recouper l’éventuel préfixe précédemment choisi EN B alors que tu a la donnée saine en A????🤔🤔🤔🤯

Bonjour
je ne vois pas l’intérêt du VBA la dedans
tu a une liste déroulante(liste de validation je suppose) avec 2 mots

en colonne C ta liste de validation "Annuler;Reporté"
en colonne "B" la formule à étendre à souhait
=SI(A1<>"";SI(C1<>"";GAUCHE(C1;1)&"_" &A1;A1);"")

résultat


et puis même en vba !!!

pourriez vous me dire a quoi ça sert d'aller recouper l’éventuel préfixe précédemment choisi EN B alors que tu a la donnée saine en A????🤔🤔🤔🤯
Hello Patrick,
Je ne pense pas que dans l'exemple du code présenté il soit question de la colonne A 😇;)
 

dindin

XLDnaute Occasionnel
Bonjour
je ne vois pas l’intérêt du VBA la dedans
tu a une liste déroulante(liste de validation je suppose) avec 2 mots

en colonne C ta liste de validation "Annuler;Reporté"
en colonne "B" la formule à étendre à souhait
=SI(A1<>"";SI(C1<>"";GAUCHE(C1;1)&"_" &A1;A1);"")

résultat
Regarde la pièce jointe 1124970

et puis même en vba !!!

pourriez vous me dire a quoi ça sert d'aller recouper l’éventuel préfixe précédemment choisi EN B alors que tu a la donnée saine en A????🤔🤔🤔🤯
Bonjour Patrick,
une solution VBA va permettre d'éviter les doublons en colonne B en rajoutant un préfixe A ou R, car dans un autre onglet j'utilise la formule RechercheV pour remplir un formulaire suivant le N° inscrit précédemment en B.
je ne vois aussi l'intérêt de rajouter une nouvelle colonne.
 

dindin

XLDnaute Occasionnel
Bonjour à tous
Essaye comme ceci
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column <> 3 Then Exit Sub
    Application.EnableEvents = False
    If Left(Cells(Target.Row, 2), 2) = "R_" Or Left(Cells(Target.Row, 2), 2) = "A_" Then Cells(Target.Row, 2) = Mid(Cells(Target.Row, 2), 3, 9 ^ 9)
    If ActiveCell.Value = "Annulé" Then Cells(Target.Row, 2) = "A_" & Cells(Target.Row, 2).Value
    If ActiveCell.Value = "Reporté" Then Cells(Target.Row, 2) = "R_" & Cells(Target.Row, 2).Value
    Application.EnableEvents = True
End Sub
un grand merci à Jacky ainsi qu'à Robert pour leurs propositions
 

Discussions similaires

Statistiques des forums

Discussions
312 094
Messages
2 085 240
Membres
102 832
dernier inscrit
kirale