Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Créer une liste contenant les données qui contiennent une chaîne de caractères

14 réponses
Avatar
Archibald
Bonjour,

J'ai la liste des 36000 communes de France (ainsi que leurs codes postaux)
et je souhaite que l'utilisateur en choisisse une, sans qu'il ait la liste
sous les yeux :
je souhaite qu'il tape dans une cellule "VilleSaisie" une partie du nom de
la ville avec un ou des caractères joker (étoile et/ou point
d'interrogation), puis qu'il puisse choisir dans une liste déroulante
contenant la liste des villes possibles avec leurs codes postaux (afin de
différencier les homonymes)
Avec NB.SI(ListeVilles;VilleSaisie) je sais trouver le nombre de villes
possibles, mais je ne sais pas comment créer un tableau contenant ces villes
possibles, pour ensuite leurs associer leur codes postaux (via Recherchev ou
index(equiv), puis Ville&Code postal) puis les visualiser dans une liste de
choix (via Données Validation liste)

Suis-je sur une mauvaise piste ?
Pouvez-vous m'aider ?
Si possible sans macro.

Je vous remercie à l'avance

Archibald

10 réponses

1 2
Avatar
michdenis
Bonjour Archibald,

Un petit exemple là : http://cjoint.com/?kFgibSExfr


Salutations!


"Archibald" a écrit dans le message de news: %23R7Ux$
Bonjour,

J'ai la liste des 36000 communes de France (ainsi que leurs codes postaux)
et je souhaite que l'utilisateur en choisisse une, sans qu'il ait la liste
sous les yeux :
je souhaite qu'il tape dans une cellule "VilleSaisie" une partie du nom de
la ville avec un ou des caractères joker (étoile et/ou point
d'interrogation), puis qu'il puisse choisir dans une liste déroulante
contenant la liste des villes possibles avec leurs codes postaux (afin de
différencier les homonymes)
Avec NB.SI(ListeVilles;VilleSaisie) je sais trouver le nombre de villes
possibles, mais je ne sais pas comment créer un tableau contenant ces villes
possibles, pour ensuite leurs associer leur codes postaux (via Recherchev ou
index(equiv), puis Ville&Code postal) puis les visualiser dans une liste de
choix (via Données Validation liste)

Suis-je sur une mauvaise piste ?
Pouvez-vous m'aider ?
Si possible sans macro.

Je vous remercie à l'avance

Archibald
Avatar
jb
A B C D E F
G H I
1 Ville CodePostal Ville Ville
CodePostal ChoixVille
2 Monigny 78180 M Montigny
78000 Montigny
3 Magny 78900 Magny
78900
4 Paris 75000
5 Parly 78600

En utilisant le filtre élaboré:
Critère : D1:D2
Destination:F1:G1

En D2, construire un menu avec Données/validation/Liste/ A;B;C;...
En I2: Construire un menu avec Données/Validation/Liste :ò:F3

Dans l'événement Change() de la feuille:

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Target.Address = "$D$2" Then
Range("A1:B10000").AdvancedFilter Action:=xlFilterCopy,
CriteriaRange:=Range( _
"D1:D2"), CopyToRange:=Range("F1:G1"), Unique:úlse
Range("I2").ClearContents
If Range("F2") <> "" Then
Range("I2").Validation.Modify xlValidateList, , , "ò:F" &
Range("F1").End(xlDown).Row
(xlDown).Row
End If
End If
Application.EnableEvents = True
End Sub

JB
Avatar
jb
Solution matricielle:

-On suppose que le champ des villes est nommé VILLE et la première
lettre des villes cherchées est en D2
-Qu'il y a 6 villes maxi
-Sélectionner 6 cellules:

=SI(ESTTEXTE(INDEX(Ville;GRANDE.VALEUR(SI(ESTNUM(CHERCHE(D2;Ville));EQUIV (Ville;Ville;0);"");{1;2;3;4;5;6})));INDEX(Ville;GRANDE.VALEUR(SI(ESTNUM(CH ERCHE(D2;Ville));EQUIV(Ville;Ville;0);"");{1;2;3;4;5;6}));"")

Valider avec Maj+Ctrl+Enrée

Le code postal peut ensuite s'obtenir avec la fonction Recherchev() ou
Equiv()/Index()

Pour obtenir une liste dynamique avec Données/Validation/Liste:

-Créer un champ dynamique 'ListeVille' avec Insertion/Nom/Définir:
I8:I13 est le champ contenant la liste des villes.

ÞCALER(Bd!$I$8;0;0;NB.SI(Bd!$I$8:$I$13;Bd!$D$2&"*");)

Dans la liste de Données/Validation/Liste , placer =ListeVille

JB
Avatar
Archibald
Merci beaucoup Michdenis

Archibald


"michdenis" a écrit dans le message de news:

Bonjour Archibald,

Un petit exemple là : http://cjoint.com/?kFgibSExfr


Salutations!


"Archibald" a écrit dans le message de news:
%23R7Ux$
Bonjour,

J'ai la liste des 36000 communes de France (ainsi que leurs codes postaux)
et je souhaite que l'utilisateur en choisisse une, sans qu'il ait la liste
sous les yeux :
je souhaite qu'il tape dans une cellule "VilleSaisie" une partie du nom de
la ville avec un ou des caractères joker (étoile et/ou point
d'interrogation), puis qu'il puisse choisir dans une liste déroulante
contenant la liste des villes possibles avec leurs codes postaux (afin de
différencier les homonymes)
Avec NB.SI(ListeVilles;VilleSaisie) je sais trouver le nombre de villes
possibles, mais je ne sais pas comment créer un tableau contenant ces
villes
possibles, pour ensuite leurs associer leur codes postaux (via Recherchev
ou
index(equiv), puis Ville&Code postal) puis les visualiser dans une liste
de
choix (via Données Validation liste)

Suis-je sur une mauvaise piste ?
Pouvez-vous m'aider ?
Si possible sans macro.

Je vous remercie à l'avance

Archibald





Avatar
Archibald
Merci beaucoup jg.

Archibald

"jb" a écrit dans le message de news:

Solution matricielle:

-On suppose que le champ des villes est nommé VILLE et la première
lettre des villes cherchées est en D2
-Qu'il y a 6 villes maxi
-Sélectionner 6 cellules:

=SI(ESTTEXTE(INDEX(Ville;GRANDE.VALEUR(SI(ESTNUM(CHERCHE(D2;Ville));EQUIV(Ville;Ville;0);"");{1;2;3;4;5;6})));INDEX(Ville;GRANDE.VALEUR(SI(ESTNUM(CHERCHE(D2;Ville));EQUIV(Ville;Ville;0);"");{1;2;3;4;5;6}));"")

Valider avec Maj+Ctrl+Enrée

Le code postal peut ensuite s'obtenir avec la fonction Recherchev() ou
Equiv()/Index()

Pour obtenir une liste dynamique avec Données/Validation/Liste:

-Créer un champ dynamique 'ListeVille' avec Insertion/Nom/Définir:
I8:I13 est le champ contenant la liste des villes.

ÞCALER(Bd!$I$8;0;0;NB.SI(Bd!$I$8:$I$13;Bd!$D$2&"*");)

Dans la liste de Données/Validation/Liste , placer =ListeVille

JB
Avatar
jb
Voici un lien vers le fichier source:

http://cjoint.com/?kFnDhJcIiR

JB
Avatar
jb
Voici le fichier source:

http://cjoint.com/?kFnDhJcIiR

JB
Avatar
Archibald
Bonjour Michdenis,

Je débute complètement en VBA et j'ai beaucoup de mal à adapter cette macro,
qui convient très bien pour ce que je veux faire, et dont je te remercie.

Peux-tu m'aider STP ?

Voici mon cas particulier :

- Je cherche toutes les valeurs contenant ce qui est dans la case
B2, et non pas seulement celles qui commencent par cela. J'ai réussi à
modifier le code pour cela : Range("D2") = "*" & .Range("B2") & "*"

- la liste des noms origine est une plage nommée « CITY_List » et
qui est dans une autre feuille (« Cities ») du classeur. J'imagine qu'il
faut remplacer
Set Rg = .Range("A1:A" & .Range("A65536").End(xlUp).Row)
par quelque chose comme Set Rg= Cities ! CITY_List
mais je ne trouve pas la bonne syntaxe

- pourquoi la cellule F1 doit-elle contenir la même chose que A1 ?

- pourquoi la case D1 est-elle nécessaire ?

- Quelle est la syntaxe pour mettre la case H1 dans une autre
feuille ?

- Ainsi que la case B2 tant qu'à faire



Merci beaucoup !!!



Archibald





"Archibald" a écrit dans le message de news:
%
Merci beaucoup Michdenis

Archibald


"michdenis" a écrit dans le message de news:

Bonjour Archibald,

Un petit exemple là : http://cjoint.com/?kFgibSExfr


Salutations!


"Archibald" a écrit dans le message de news:
%23R7Ux$
Bonjour,

J'ai la liste des 36000 communes de France (ainsi que leurs codes
postaux)
et je souhaite que l'utilisateur en choisisse une, sans qu'il ait la
liste
sous les yeux :
je souhaite qu'il tape dans une cellule "VilleSaisie" une partie du nom
de
la ville avec un ou des caractères joker (étoile et/ou point
d'interrogation), puis qu'il puisse choisir dans une liste déroulante
contenant la liste des villes possibles avec leurs codes postaux (afin de
différencier les homonymes)
Avec NB.SI(ListeVilles;VilleSaisie) je sais trouver le nombre de villes
possibles, mais je ne sais pas comment créer un tableau contenant ces
villes
possibles, pour ensuite leurs associer leur codes postaux (via Recherchev
ou
index(equiv), puis Ville&Code postal) puis les visualiser dans une liste
de
choix (via Données Validation liste)

Suis-je sur une mauvaise piste ?
Pouvez-vous m'aider ?
Si possible sans macro.

Je vous remercie à l'avance

Archibald









Avatar
michdenis
Bonjour Archibald,

Le principe derrière mon exemple est l'exploitation d'un filtre élaboré (barre des menus / données / filtre / filtre élaboré.

Cependant, au lieu d'appeler cette commande via le menu, la macro est actionnée par le changement de valeur de la cellule B2 de la
feuille. Le code de cette macro est un exemple de filtre élaboré.

A ) La plage de cellules sur lequel le filtre élaboré doit prendre place doit OBLIGATOIREMENT avoir des étiquettes de colonnes.

B ) D1:D2 représente la zone de critère du filtre élaboré. J'aurais pu à la fin de la macro faire disparaître le contenu de ces
cellules mais je voulais que tu vois leur contenu au moment où s'exécute le filtre élaboré.

C ) Dans ce cas précis, D1 est essentielle car il renseigne excel sur quelle colonne le critère de la cellue D2 doit s'appliquer.
Cependant, si j'avais utiliser une formule, il aurait fallu soit laisser D1 totalement vide ou lui donner un nom que l'on ne
retrouve pas dans la ligne d'étiquettes de ta plage de données source.

Pour suivre ton exemple :

Suppose que tes données, ta zone de critère, sont dans la feuille "cities", et que tu veuilles modifier ta zone de liste de
validation dans la cellule H1 d'un autre feuille ( "Feuil1") simplement en entrant une donnée dans la cellule B2 de la feuil1

Voici comment modifier le code de l'exemple donné :

DAns le module feuille "Feuil1", tu copies ceci :
'-------------------------
Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("B2")) Is Nothing Then
Application.EnableEvents = False
Lister
Application.EnableEvents = True
End If

End Sub
'-------------------------

Et dans un module Standard, copie cela :
'-----------------------------------
Sub Lister()

Dim Ligne As Long
With Worksheets("Cities")
.Range("D1") = .Range("A1")
.Range("D2") = "*" & Worksheets("Feuil1").Range("B2") & "*"
.Range("CITY_List").AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=.Range("D1:D2"), CopyToRange:=.Range("F1"), _
Unique:úlse
Ligne = .Range("F65536").End(xlUp).Row

If Ligne < 2 Then Ligne = 2
.Range("F2:F" & Ligne).Name = "MaListe"
End With
With Worksheets("Feuil1")
.Range("H1").Validation.Delete
.Range("H1").Validation.Add xlValidateList, , _
, "=MaListe"
End With

End Sub
'-----------------------------------


Salutations!



"Archibald" a écrit dans le message de news: %
Bonjour Michdenis,

Je débute complètement en VBA et j'ai beaucoup de mal à adapter cette macro,
qui convient très bien pour ce que je veux faire, et dont je te remercie.

Peux-tu m'aider STP ?

Voici mon cas particulier :

- Je cherche toutes les valeurs contenant ce qui est dans la case
B2, et non pas seulement celles qui commencent par cela. J'ai réussi à
modifier le code pour cela : Range("D2") = "*" & .Range("B2") & "*"

- la liste des noms origine est une plage nommée « CITY_List » et
qui est dans une autre feuille (« Cities ») du classeur. J'imagine qu'il
faut remplacer
Set Rg = .Range("A1:A" & .Range("A65536").End(xlUp).Row)
par quelque chose comme Set Rg= Cities ! CITY_List
mais je ne trouve pas la bonne syntaxe

- pourquoi la cellule F1 doit-elle contenir la même chose que A1 ?

- pourquoi la case D1 est-elle nécessaire ?

- Quelle est la syntaxe pour mettre la case H1 dans une autre
feuille ?

- Ainsi que la case B2 tant qu'à faire



Merci beaucoup !!!



Archibald





"Archibald" a écrit dans le message de news:
%
Merci beaucoup Michdenis

Archibald


"michdenis" a écrit dans le message de news:

Bonjour Archibald,

Un petit exemple là : http://cjoint.com/?kFgibSExfr


Salutations!


"Archibald" a écrit dans le message de news:
%23R7Ux$
Bonjour,

J'ai la liste des 36000 communes de France (ainsi que leurs codes
postaux)
et je souhaite que l'utilisateur en choisisse une, sans qu'il ait la
liste
sous les yeux :
je souhaite qu'il tape dans une cellule "VilleSaisie" une partie du nom
de
la ville avec un ou des caractères joker (étoile et/ou point
d'interrogation), puis qu'il puisse choisir dans une liste déroulante
contenant la liste des villes possibles avec leurs codes postaux (afin de
différencier les homonymes)
Avec NB.SI(ListeVilles;VilleSaisie) je sais trouver le nombre de villes
possibles, mais je ne sais pas comment créer un tableau contenant ces
villes
possibles, pour ensuite leurs associer leur codes postaux (via Recherchev
ou
index(equiv), puis Ville&Code postal) puis les visualiser dans une liste
de
choix (via Données Validation liste)

Suis-je sur une mauvaise piste ?
Pouvez-vous m'aider ?
Si possible sans macro.

Je vous remercie à l'avance

Archibald









Avatar
Archibald
Michdenis,

Je te remercie infiniment pour ton aide et tes explications.
C'est pour un gros outil excel qui va être utilisé par plusieurs personnes
dans ma boîte, et je vais passer pour un dieu !
Je t'enverrai un post dans la journée ou demain pour te confirmer que cela
marche.

Je vais me plonger dans le VBA car j'ai beaucoup à apprendre, je le sens.
Jusqu'ici j'avais développé plein d'outils sans VBA mais là je séchais.
Aurait-il été possible de faire cela sans VBA, avec un filtre élaboré ?

Cordialement,
Archibald


"michdenis" a écrit dans le message de news:
%
Bonjour Archibald,

Le principe derrière mon exemple est l'exploitation d'un filtre élaboré
(barre des menus / données / filtre / filtre élaboré.

Cependant, au lieu d'appeler cette commande via le menu, la macro est
actionnée par le changement de valeur de la cellule B2 de la
feuille. Le code de cette macro est un exemple de filtre élaboré.

A ) La plage de cellules sur lequel le filtre élaboré doit prendre place
doit OBLIGATOIREMENT avoir des étiquettes de colonnes.

B ) D1:D2 représente la zone de critère du filtre élaboré. J'aurais pu à
la fin de la macro faire disparaître le contenu de ces
cellules mais je voulais que tu vois leur contenu au moment où s'exécute
le filtre élaboré.

C ) Dans ce cas précis, D1 est essentielle car il renseigne excel sur
quelle colonne le critère de la cellue D2 doit s'appliquer.
Cependant, si j'avais utiliser une formule, il aurait fallu soit laisser
D1 totalement vide ou lui donner un nom que l'on ne
retrouve pas dans la ligne d'étiquettes de ta plage de données source.

Pour suivre ton exemple :

Suppose que tes données, ta zone de critère, sont dans la feuille
"cities", et que tu veuilles modifier ta zone de liste de
validation dans la cellule H1 d'un autre feuille ( "Feuil1") simplement en
entrant une donnée dans la cellule B2 de la feuil1

Voici comment modifier le code de l'exemple donné :

DAns le module feuille "Feuil1", tu copies ceci :
'-------------------------
Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("B2")) Is Nothing Then
Application.EnableEvents = False
Lister
Application.EnableEvents = True
End If

End Sub
'-------------------------

Et dans un module Standard, copie cela :
'-----------------------------------
Sub Lister()

Dim Ligne As Long
With Worksheets("Cities")
.Range("D1") = .Range("A1")
.Range("D2") = "*" & Worksheets("Feuil1").Range("B2") & "*"
.Range("CITY_List").AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=.Range("D1:D2"), CopyToRange:=.Range("F1"), _
Unique:úlse
Ligne = .Range("F65536").End(xlUp).Row

If Ligne < 2 Then Ligne = 2
.Range("F2:F" & Ligne).Name = "MaListe"
End With
With Worksheets("Feuil1")
.Range("H1").Validation.Delete
.Range("H1").Validation.Add xlValidateList, , _
, "=MaListe"
End With

End Sub
'-----------------------------------


Salutations!



"Archibald" a écrit dans le message de news:
%
Bonjour Michdenis,

Je débute complètement en VBA et j'ai beaucoup de mal à adapter cette
macro,
qui convient très bien pour ce que je veux faire, et dont je te remercie.

Peux-tu m'aider STP ?

Voici mon cas particulier :

- Je cherche toutes les valeurs contenant ce qui est dans la case
B2, et non pas seulement celles qui commencent par cela. J'ai réussi à
modifier le code pour cela : Range("D2") = "*" & .Range("B2") & "*"

- la liste des noms origine est une plage nommée « CITY_List » et
qui est dans une autre feuille (« Cities ») du classeur. J'imagine qu'il
faut remplacer
Set Rg = .Range("A1:A" & .Range("A65536").End(xlUp).Row)
par quelque chose comme Set Rg= Cities ! CITY_List
mais je ne trouve pas la bonne syntaxe

- pourquoi la cellule F1 doit-elle contenir la même chose que A1 ?

- pourquoi la case D1 est-elle nécessaire ?

- Quelle est la syntaxe pour mettre la case H1 dans une autre
feuille ?

- Ainsi que la case B2 tant qu'à faire



Merci beaucoup !!!



Archibald





"Archibald" a écrit dans le message de news:
%
Merci beaucoup Michdenis

Archibald


"michdenis" a écrit dans le message de news:

Bonjour Archibald,

Un petit exemple là : http://cjoint.com/?kFgibSExfr


Salutations!


"Archibald" a écrit dans le message de news:
%23R7Ux$
Bonjour,

J'ai la liste des 36000 communes de France (ainsi que leurs codes
postaux)
et je souhaite que l'utilisateur en choisisse une, sans qu'il ait la
liste
sous les yeux :
je souhaite qu'il tape dans une cellule "VilleSaisie" une partie du nom
de
la ville avec un ou des caractères joker (étoile et/ou point
d'interrogation), puis qu'il puisse choisir dans une liste déroulante
contenant la liste des villes possibles avec leurs codes postaux (afin
de
différencier les homonymes)
Avec NB.SI(ListeVilles;VilleSaisie) je sais trouver le nombre de villes
possibles, mais je ne sais pas comment créer un tableau contenant ces
villes
possibles, pour ensuite leurs associer leur codes postaux (via
Recherchev
ou
index(equiv), puis Ville&Code postal) puis les visualiser dans une liste
de
choix (via Données Validation liste)

Suis-je sur une mauvaise piste ?
Pouvez-vous m'aider ?
Si possible sans macro.

Je vous remercie à l'avance

Archibald














1 2