Créer une liste déroulante sur une case en fonction critère

bonjour,

j'ai une feuille de A1:P500 avec des cases remplies d'un texte au début (les 9 premiers caractères).

Je veux créer une liste de choix déroulante sur une autre feuille avec ce texte. en B39:B47

sachant aussi que ce texte peut se retrouver dans plusieurs autres cases entre A1:P500

qui peut m'aider en VBA.

merci

Bonhour Philippou, bonjour le forum,

Essaie comme ça (à adapter) :

Sub Macro1()
Dim OT As Worksheet 'déclare la variable OT (Onglet du Texte)
Dim OLV As Worksheet 'déclare la variable OLV (Onglet de la Liste de Validation)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incréement)
Dim J As Integer 'déclare la variable J (incréement)
Dim TMP As Variant 'déclare la variable TMP (tableau TeMPoraire)
Dim L As String 'déclare la variable L (Liste)

Set OT = Worksheets("Feuil1") 'définit l'onglet OT (à adapter à ton cas)
TV = OT.Range("A1:P500") 'définit le tableau des valeurs TV
Set OLV = Worksheets("Feuil2") 'définit l'onglet OLV (à adapter à ton cas)
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionanire D
For I = 1 To UBound(TV, 1) 'boucle 1 : sur toutes les lignes I du tableau des valeurs TV
    For J = 1 To UBound(TV, 2) 'boucle 2 : sur toutes les colonnes J du tableau des valeurs TV
        If TV(I, J) <> "" Then D(TV(I, J)) = "" 'si la donnée ligne I colonne J de TV n'est pas vide, alimente le dictionnaire D
    Next J 'prochaine colonne de la boucle 2
Next I 'prochaine ligne de la boucle 1
TMP = D.keys 'récupère dans le tableau temporaire TMP la liste des éléments du dictionanire D sans doublon
L = Join(TMP, ",") 'crée la liste L
With OLV.Range("B39:B47") 'prend en compte la plage B39:B47 de l'onglet OLV
    .Validation.Delete 'efface une éventuelle ancienne liste de validation de données
    .Validation.Add xlValidateList, Formula1:=L 'ajoute la liste L comme liste de validation de données
End With 'fin de la prise en compte de la plage B39:B47 de l'onglet OLV
End Sub

merci beaucoup, par contre sur tes lignes, où est le paramètre pour prendre en compte que les 9 premiers caractères de chaque case ?

Re,

Ha j'avais mal compris, je croyais que la plage A1:P500 ne comportait déjà que les 9 premiers caractères... Le code modifié :

Sub Macro1()
Dim OT As Worksheet 'déclare la variable OT (Onglet du Texte)
Dim OLV As Worksheet 'déclare la variable OLV (Onglet de la Liste de Validation)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incréement)
Dim J As Integer 'déclare la variable J (incréement)
Dim TMP As Variant 'déclare la variable TMP (tableau TeMPoraire)
Dim L As String 'déclare la variable L (Liste)

Set OT = Worksheets("Feuil1") 'définit l'onglet OT (à adapter à ton cas)
TV = OT.Range("A1:P500") 'définit le tableau des valeurs TV
Set OLV = Worksheets("Feuil2") 'définit l'onglet OLV (à adapter à ton cas)
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionanire D
For I = 1 To UBound(TV, 1) 'boucle 1 : sur toutes les lignes I du tableau des valeurs TV
    For J = 1 To UBound(TV, 2) 'boucle 2 : sur toutes les colonnes J du tableau des valeurs TV
        If TV(I, J) <> "" Then D(Left(TV(I, J),9)) = "" 'si la donnée ligne I colonne J de TV n'est pas vide, alimente le dictionnaire D avec les 9 premiers caractères
    Next J 'prochaine colonne de la boucle 2
Next I 'prochaine ligne de la boucle 1
TMP = D.keys 'récupère dans le tableau temporaire TMP la liste des éléments du dictionanire D sans doublon
L = Join(TMP, ",") 'crée la liste L
With OLV.Range("B39:B47") 'prend en compte la plage B39:B47 de l'onglet OLV
    .Validation.Delete 'efface une éventuelle ancienne liste de validation de données
    .Validation.Add xlValidateList, Formula1:=L 'ajoute la liste L comme liste de validation de données
End With 'fin de la prise en compte de la plage B39:B47 de l'onglet OLV
End Sub

ça marche bien , pour affiner le résultat j'ai plusieurs tableaux avec des lignes numérotés et des colonnes (a,b,c...) , comment faire simple pour pas en tenir compte dans le résultat ?

j'ai essayé de mettre ça TV = OT.Range("C6:N17;C24:N35;C42:N53;C60:N71;C78:N89;C96:N107") ... mais VBA n'a pas aimé !

pour les numéros de lignes en commançant colonne 6 c'est bon, mais il reste les lettres a, b, c...

Re,

Peut-être comme ça :

TV = Application.Union(OT.Range("C6:N17"), OT.Range("C24:N35"), OT.Range("C42:N53"), OT.Range("C60:N71"), OT.Range("C78:N89"), OT.Range("C96:N107"))

Génial, merci beaucoup !

Rechercher des sujets similaires à "creer liste deroulante case fonction critere"