Sélection multiple liste déroulante avec abréviations

Bonjour à tous,

Pouvez-vous svp m'aider à trouver une solution pour le problème suivant ? :

En Feuil1 : J'ai une colonne avec une liste déroulante de sélection de pays, une autre colonne avec l'abréviation correspondante au pays sélectionné (code pays) qui s'affiche via la formule INDEX, EQUIV me permettant de rechercher la correspondance dans un tableau présent dans un autre feuillet (en Feuil2).

Exemple : J'ai sélectionné "France" dans la liste déroulante de la 1ère colonne et le code pays associé "FR" s'affiche dans la 2ème colonne. Je ne peux ici sélectionner qu'un seul pays et n'afficher qu'un code pays.

2024 12 04 selectionmultiple xlsm excel

En Feuil2 : J'ai le tableau de correspondance des Pays et Codes Pays.

2024 12 04 selectionmultiple xlsm excel

En Feuil3 : J'ai la même chose qu'en Feuil1 à la différence que j'ai une sélection multiple possible via la macro ci-dessous (à noter que si je sélectionne un pays déjà sélectionné, celui-ci est retiré de la sélection). Je peux donc sélectionner plusieurs pays qui s'affichent en étant séparés par un tiret "-" et je souhaiterais que la correspondance s'affiche avec les codes pays dans la colonne d'à côté.

Exemple : Je sélectionne en B2 les pays France-Allemagne-Italie-Japon. Je souhaiterais que les codes pays associés s'affichent en C2 de cette manière : "FR-DE-IT-JP". Je souhaiterais donc une formule qui aille rechercher les correspondances dans le tableau présent en Feuil2 pour afficher la sélection multiple des pays sous forme de codes pays séparés par un tiret "-".

En effet, INDEX, EQUIV ne fonctionne plus ici puisqu'il y a une sélection multiple et non pas une correspondance exacte. Il faudrait une formule qui aille scanner les pays sélectionnés en B2 et affiche en C2, selon le tableau de correspondance en Feuil2, les codes pays des pays sélectionnés.

2024 12 04 selectionmultiple xlsm excel

Macro pour Feuil3 :

Private Sub Worksheet_Change(ByVal Target As Range)
    'Updated by Extendoffice 20240118
    Dim xRngDV As Range
    Dim TargetRange As Range
    Dim oldValue As String
    Dim newValue As String
    Dim delimiter As String
    Dim allValues As Variant
    Dim valueExists As Boolean
    Dim i As Long
    Dim cleanedValue As String

    Set TargetRange = Me.UsedRange ' Set your specific range here
    delimiter = "-" ' Set your desired delimiter here

    If Target.CountLarge > 1 Then Exit Sub

    ' Check if the change is within the specific range
    If Intersect(Target, TargetRange) Is Nothing Then Exit Sub

    On Error Resume Next
    Set xRngDV = Target.SpecialCells(xlCellTypeAllValidation)
    If xRngDV Is Nothing Or Target.Value = "" Then
        ' Skip if there's no data validation or if the cell is cleared
        Application.EnableEvents = True
        Exit Sub
    End If
    On Error GoTo 0

    If Not Intersect(Target, xRngDV) Is Nothing Then
        Application.EnableEvents = False
        newValue = Target.Value
        Application.Undo
        oldValue = Target.Value
        Target.Value = newValue

        ' Split the old value by delimiter and check if new value already exists
        allValues = Split(oldValue, delimiter)
        valueExists = False
        For i = LBound(allValues) To UBound(allValues)
            If Trim(allValues(i)) = newValue Then
                valueExists = True
                Exit For
            End If
        Next i

        ' Add or remove value based on its existence
        If valueExists Then
            ' Remove the value
            cleanedValue = ""
            For i = LBound(allValues) To UBound(allValues)
                If Trim(allValues(i)) <> newValue Then
                    If cleanedValue <> "" Then cleanedValue = cleanedValue & delimiter
                    cleanedValue = cleanedValue & Trim(allValues(i))
                End If
            Next i
            Target.Value = cleanedValue
        Else
            ' Add the value
            If oldValue <> "" Then
                Target.Value = oldValue & delimiter & newValue
            Else
                Target.Value = newValue
            End If
        End If

        Application.EnableEvents = True
    End If
End Sub

Je mets le fichier en PJ et vous remercie par avance pour votre aide.

Bonjour à tous !

Une proposition type "formule" (désolé mais pas de VBA...) en C2 :

=JOINDRE.TEXTE("-";;RECHERCHEX(FRACTIONNER.TEXTE(B2;;"-");Tableau2[Pays];Tableau2[Pays_Abreviation]))

Bonjour JFL,

Ça fonctionne parfaitement. Merci à toi ! Tu es vraiment le GOAT d'Excel.

Ça semble si simple pour toi de trouver des solutions à mes problèmes d'Excel.

Bon après-midi.

Bonjour à tous de nouveau !

Bien....

Je vous remercie de ce retour.

Bonjour Crapule, JFL,

Pour respecter ta condition.

à noter que si je sélectionne un pays déjà sélectionné, celui-ci est retiré de la sélection).

Ne pas oublier d'insérer la formule UNIQUE avant RECHERCHEX et une ) au final pour fermer l'ensemble. Donc trois parenthèses finales au lieu de deux.

Rechercher des sujets similaires à "selection multiple liste deroulante abreviations"