OVH Cloud OVH Cloud

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

4 réponses

1 2
Avatar
michdenis
Bonjour Archibald,

| Aurait-il été possible de faire cela sans VBA, avec un filtre élaboré ?

Oui, la commande : barre des menus / données / filtre / filtre élaboré.

Sauf que si tu n'utilises pas une procédure en VBA, tu devras constamment refaire la manipulation à chaque modification de la valeur
saisi dans la cellule. En conséquence, la tâche serait à ce point lourd qu'elle serait non opérationnelle.


Salutations!




"Archibald" a écrit dans le message de news: %23x%
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














Avatar
Archibald
Michdenis,


Merci pour ta réponse ci-dessous.



Dans mon classeur, j'ai trois feuilles dans lesquelles l'utilisateur est
susceptible de choisir une ville, et je ne veux pas que le choix sur l'une
écrase le choix sur l'autre, donc il faut dupliquer les filtres élaborés.
Aussi, j'ai réintégré la routine Lister entre Application.EnableEvents =
False et Application.EnableEvents = True, et je compte mettre le tout dans
chacun des modules correspondant aux trois feuilles.

Les seules choses qui changeront, ce sont la cellule de saisie initiale B2,
et la cellule H1 où l'utilisateur aura un choix de villes (dans le cas où
NB.SI(CITY_List;B2)>1, sinon soit il a tapé une ville exacte soit il a mis n'importe
quoi)



J'ai remplacé D1 :D2 par J1 :J2, et la colonne F par la colonne K

De plus, comme la liste de villes CITY_List commence en C4 dans la feuille
Cities, j'ai mis Cities!C3 dans J1



Après ces adaptations, voici ce qu'il y a dans le module Worksheet de la
feuille concernée:





Private Sub Worksheet_Change(ByVal Target As Range)



If Not Intersect(Target, Range("B2")) Is Nothing Then

Application.EnableEvents = False



Dim Ligne As Long



.Range("J1") = Worksheets("Cities").Range("C3")

.Range("J2") = "*" & .Range("B2") & "*"

.Range("CITY_List").AdvancedFilter Action:=xlFilterCopy, _

CriteriaRange:=.Range("J1:J2"), CopyToRange:=.Range("K1"), _

Unique:úlse

Ligne = .Range("K65536").End(xlUp).Row



If Ligne < 2 Then Ligne = 2

.Range("K2:K" & Ligne).Name = "ChoiceList"



.Range("H1").Validation.Delete

.Range("H1").Validation.Add xlValidateList, , _

, "=ChoiceList"



Application.EnableEvents = True

End If



End Sub





. et cela ne marche pas, tu t'en doutes bien, sinon j'aurais été plus bref !

Pas même un message d'erreur !



Sans abuser de ton temps, puis-je te demander de me corriger ?

Est-ce que j'ai utilisé le bon module ?

Est-ce que CITY_List doit comprendre la cellule C3 ?





Question subsidiaire : les cellules H1 et B2 peuvent-elles être identiques ?



Archibald


------------------------------

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

Bonjour Archibald,

| Aurait-il été possible de faire cela sans VBA, avec un filtre élaboré ?

Oui, la commande : barre des menus / données / filtre / filtre élaboré.

Sauf que si tu n'utilises pas une procédure en VBA, tu devras constamment
refaire la manipulation à chaque modification de la valeur
saisi dans la cellule. En conséquence, la tâche serait à ce point lourd
qu'elle serait non opérationnelle.


Salutations!




"Archibald" a écrit dans le message de news:
%23x%
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



















Avatar
michdenis
Bonjour Archibald,

Si tu le désires, tu peux m'envoyer ton classeur dans ma Bal. J'y regarderai de plus près ce soir.


Salutations!



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


Merci pour ta réponse ci-dessous.



Dans mon classeur, j'ai trois feuilles dans lesquelles l'utilisateur est
susceptible de choisir une ville, et je ne veux pas que le choix sur l'une
écrase le choix sur l'autre, donc il faut dupliquer les filtres élaborés.
Aussi, j'ai réintégré la routine Lister entre Application.EnableEvents False et Application.EnableEvents = True, et je compte mettre le tout dans
chacun des modules correspondant aux trois feuilles.

Les seules choses qui changeront, ce sont la cellule de saisie initiale B2,
et la cellule H1 où l'utilisateur aura un choix de villes (dans le cas où
NB.SI(CITY_List;B2)>1, sinon soit il a tapé une ville exacte soit il a mis n'importe
quoi)



J'ai remplacé D1 :D2 par J1 :J2, et la colonne F par la colonne K

De plus, comme la liste de villes CITY_List commence en C4 dans la feuille
Cities, j'ai mis Cities!C3 dans J1



Après ces adaptations, voici ce qu'il y a dans le module Worksheet de la
feuille concernée:





Private Sub Worksheet_Change(ByVal Target As Range)



If Not Intersect(Target, Range("B2")) Is Nothing Then

Application.EnableEvents = False



Dim Ligne As Long



.Range("J1") = Worksheets("Cities").Range("C3")

.Range("J2") = "*" & .Range("B2") & "*"

.Range("CITY_List").AdvancedFilter Action:=xlFilterCopy, _

CriteriaRange:=.Range("J1:J2"), CopyToRange:=.Range("K1"), _

Unique:úlse

Ligne = .Range("K65536").End(xlUp).Row



If Ligne < 2 Then Ligne = 2

.Range("K2:K" & Ligne).Name = "ChoiceList"



.Range("H1").Validation.Delete

.Range("H1").Validation.Add xlValidateList, , _

, "=ChoiceList"



Application.EnableEvents = True

End If



End Sub





. et cela ne marche pas, tu t'en doutes bien, sinon j'aurais été plus bref !

Pas même un message d'erreur !



Sans abuser de ton temps, puis-je te demander de me corriger ?

Est-ce que j'ai utilisé le bon module ?

Est-ce que CITY_List doit comprendre la cellule C3 ?





Question subsidiaire : les cellules H1 et B2 peuvent-elles être identiques ?



Archibald


------------------------------

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

Bonjour Archibald,

| Aurait-il été possible de faire cela sans VBA, avec un filtre élaboré ?

Oui, la commande : barre des menus / données / filtre / filtre élaboré.

Sauf que si tu n'utilises pas une procédure en VBA, tu devras constamment
refaire la manipulation à chaque modification de la valeur
saisi dans la cellule. En conséquence, la tâche serait à ce point lourd
qu'elle serait non opérationnelle.


Salutations!




"Archibald" a écrit dans le message de news:
%23x%
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



















Avatar
michdenis
Bonjour Archibald,

Un fichier exemple ici.
http://cjoint.com/?lcv4ljYbro

P.S. Attention, lorsque dans une procédure, on utilise ceci : Application.EnableEvents = False, il faut être sûr que la procédure
remettra à True cette même ligne de code sinon les procédures événementielles seront désactivées et il ne se passera plus rien lors
de la modification d'une cellule par exemple. Ce type de situation se rencontre souvent lorsqu'une macro "plante" et qu'elle ne
termine pas son cycle.


Salutations!




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


Merci pour ta réponse ci-dessous.



Dans mon classeur, j'ai trois feuilles dans lesquelles l'utilisateur est
susceptible de choisir une ville, et je ne veux pas que le choix sur l'une
écrase le choix sur l'autre, donc il faut dupliquer les filtres élaborés.
Aussi, j'ai réintégré la routine Lister entre Application.EnableEvents False et Application.EnableEvents = True, et je compte mettre le tout dans
chacun des modules correspondant aux trois feuilles.

Les seules choses qui changeront, ce sont la cellule de saisie initiale B2,
et la cellule H1 où l'utilisateur aura un choix de villes (dans le cas où
NB.SI(CITY_List;B2)>1, sinon soit il a tapé une ville exacte soit il a mis n'importe
quoi)



J'ai remplacé D1 :D2 par J1 :J2, et la colonne F par la colonne K

De plus, comme la liste de villes CITY_List commence en C4 dans la feuille
Cities, j'ai mis Cities!C3 dans J1



Après ces adaptations, voici ce qu'il y a dans le module Worksheet de la
feuille concernée:





Private Sub Worksheet_Change(ByVal Target As Range)



If Not Intersect(Target, Range("B2")) Is Nothing Then

Application.EnableEvents = False



Dim Ligne As Long



.Range("J1") = Worksheets("Cities").Range("C3")

.Range("J2") = "*" & .Range("B2") & "*"

.Range("CITY_List").AdvancedFilter Action:=xlFilterCopy, _

CriteriaRange:=.Range("J1:J2"), CopyToRange:=.Range("K1"), _

Unique:úlse

Ligne = .Range("K65536").End(xlUp).Row



If Ligne < 2 Then Ligne = 2

.Range("K2:K" & Ligne).Name = "ChoiceList"



.Range("H1").Validation.Delete

.Range("H1").Validation.Add xlValidateList, , _

, "=ChoiceList"



Application.EnableEvents = True

End If



End Sub





. et cela ne marche pas, tu t'en doutes bien, sinon j'aurais été plus bref !

Pas même un message d'erreur !



Sans abuser de ton temps, puis-je te demander de me corriger ?

Est-ce que j'ai utilisé le bon module ?

Est-ce que CITY_List doit comprendre la cellule C3 ?





Question subsidiaire : les cellules H1 et B2 peuvent-elles être identiques ?



Archibald


------------------------------

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

Bonjour Archibald,

| Aurait-il été possible de faire cela sans VBA, avec un filtre élaboré ?

Oui, la commande : barre des menus / données / filtre / filtre élaboré.

Sauf que si tu n'utilises pas une procédure en VBA, tu devras constamment
refaire la manipulation à chaque modification de la valeur
saisi dans la cellule. En conséquence, la tâche serait à ce point lourd
qu'elle serait non opérationnelle.


Salutations!




"Archibald" a écrit dans le message de news:
%23x%
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