OVH Cloud OVH Cloud

Des fois ça marche des fois pas

7 réponses
Avatar
Sabian
Salut...

J'ai un code pour remplir une liste d=E9roulante de mani=E8re=20
dynamique.
A savoir

Dans un module:
Public gstrRangeListe as string
-----------------------------------------
Public Sub RemplirListe(ByRef frm as UserForm, sh as=20
String, rge as String, cbo as String)
Worksheets(sh).Activate
frm.Controls(cbo).RowSource =3D Worksheets(sh).Range
(rge).Address


et sur mon Userform_Activate le code suivant:
Range("A1").Activate
gstrRangeListe =3D "A1:A" & Selection.End(xlDown).Row
Call RemplirListe (frmNewContact, "data",=20
gstrRangeListe, "cboTitre")
Me.cboTitre.ListIndex =3D0

Sur mes cellules, j'ai respectivement Mademoiselle, Madame=20
Monsieur en A1,A2,A3...

Excel cependant prend en consid=E9ration les liges jusqu'=E0 l=20
a ligne 65536...

???????? tout essayer, je deviend fou...

Merci de votre aide... (m=EAme un autre code, pourvu^'il=20
puisse =EAtre dynamique si je rajoute quelque chose dans la=20
liste d=E9roulant

Merci de votre aide
er merci d'avance

7 réponses

Avatar
Misange
Bonjour,
Pour rendre ton code *dynamique*, nul besoin d'une macro compliquée :

Dans le userform_initialize (ou ailleurs suivant tes besoins), tu écris

maliste.rowsource=("mafeuille!maliste")

Dans excel (pas VBA) tu écris les données servant de source à ta liste
dans la feuille mafeuille, par exemple dans la colonne A, les unes en
dessous des autres et sans vides.
Tu sélectionnes ces données
menu insertion/nom.définir
dans la case en haut tu tapes "maliste" et dans la case du bas, là ou
est écrit un truc genre "A1:A23", tu effaces ce qui est inscrit et à la
place tu tapes
Þcaler($A$1;;;nbval($A:$A)) et tu cliques sur ajouter. Sans quitter
cette fenêtre tu vérifies que tu as bien fait comme il faut simplement
en recliquant dans la formule. Tu dois voir un pointillé entourer les
valeurs de ta colonne A.
Maintenant, c'est magique, grace à la formule décaler, si tu ajoutes un
nom dans cette liste, il va automatiquement être pris en compte dans le
nom "maliste" et ajouté sans rien faire dans ta liste sur ton userform.

Essaie, tu verras c'est vraiment ce qu'il y a une plus simple une fois
qu'on a cessé d'avoir peur d'une tite formule décaler :-)

Misange migrateuse http://www.excelabo.net
mail : http://cerbermail.com/?k5Q8Dh2mta


le 03/11/2003 17:42:
Salut...

J'ai un code pour remplir une liste déroulante de manière
dynamique.
A savoir

Dans un module:
Public gstrRangeListe as string
-----------------------------------------
Public Sub RemplirListe(ByRef frm as UserForm, sh as
String, rge as String, cbo as String)
Worksheets(sh).Activate
frm.Controls(cbo).RowSource = Worksheets(sh).Range
(rge).Address


et sur mon Userform_Activate le code suivant:
Range("A1").Activate
gstrRangeListe = "A1:A" & Selection.End(xlDown).Row
Call RemplirListe (frmNewContact, "data",
gstrRangeListe, "cboTitre")
Me.cboTitre.ListIndex =0

Sur mes cellules, j'ai respectivement Mademoiselle, Madame
Monsieur en A1,A2,A3...

Excel cependant prend en considération les liges jusqu'à l
a ligne 65536...

???????? tout essayer, je deviend fou...

Merci de votre aide... (même un autre code, pourvu^'il
puisse être dynamique si je rajoute quelque chose dans la
liste déroulant

Merci de votre aide
er merci d'avance





Avatar
Bourby
bonjour,

je trouve vraiment pratique de pouvoir
rendre ainsi "dynamique" une plage nommée.

Mais j'ai plusieurs questions:

1- quand je mets en pratique l'exemple,
Excel ne propose pas "maliste" dans la
"zone de nom" en haut, à gauche de la barre de formules.

2- j'ai eu besoin de faire la même manip,
mais en bas d'une feuille, sachant qu'il y avait
d'autres valeurs sans intérêt en haut de la colonne A;
maliste était alors:
Þcaler($A$353;;;nbval($A353:$A10000)).
Mais là, ça ne marche plus du tout:
si je sélectionne une cellule plus "basse" (ligne 360 p.ex.),
puis ctrl+F3 pour vérifier la définition de "maliste", ....
elle a changé: du genre
Þcaler($A$353;;;nbval($A360:$A10000))
et si je me mets ligne 361, ça change de nouveau.
????
Ai-je tout fait de travers, ou outrepassé les possibilités
d'Excel?

Merci de vos lumières.

Bourby



"Misange" a écrit dans le message news:
OqOS#
Bonjour,
Pour rendre ton code *dynamique*, nul besoin d'une macro compliquée :

Dans le userform_initialize (ou ailleurs suivant tes besoins), tu écris

maliste.rowsource=("mafeuille!maliste")

Dans excel (pas VBA) tu écris les données servant de source à ta liste
dans la feuille mafeuille, par exemple dans la colonne A, les unes en
dessous des autres et sans vides.
Tu sélectionnes ces données
menu insertion/nom.définir
dans la case en haut tu tapes "maliste" et dans la case du bas, là ou
est écrit un truc genre "A1:A23", tu effaces ce qui est inscrit et à la
place tu tapes
Þcaler($A$1;;;nbval($A:$A)) et tu cliques sur ajouter. Sans quitter
cette fenêtre tu vérifies que tu as bien fait comme il faut simplement
en recliquant dans la formule. Tu dois voir un pointillé entourer les
valeurs de ta colonne A.
Maintenant, c'est magique, grace à la formule décaler, si tu ajoutes un
nom dans cette liste, il va automatiquement être pris en compte dans le
nom "maliste" et ajouté sans rien faire dans ta liste sur ton userform.

Essaie, tu verras c'est vraiment ce qu'il y a une plus simple une fois
qu'on a cessé d'avoir peur d'une tite formule décaler :-)

Misange migrateuse http://www.excelabo.net
mail : http://cerbermail.com/?k5Q8Dh2mta


le 03/11/2003 17:42:
Salut...

J'ai un code pour remplir une liste déroulante de manière
dynamique.
A savoir

Dans un module:
Public gstrRangeListe as string
-----------------------------------------
Public Sub RemplirListe(ByRef frm as UserForm, sh as
String, rge as String, cbo as String)
Worksheets(sh).Activate
frm.Controls(cbo).RowSource = Worksheets(sh).Range
(rge).Address


et sur mon Userform_Activate le code suivant:
Range("A1").Activate
gstrRangeListe = "A1:A" & Selection.End(xlDown).Row
Call RemplirListe (frmNewContact, "data",
gstrRangeListe, "cboTitre")
Me.cboTitre.ListIndex =0

Sur mes cellules, j'ai respectivement Mademoiselle, Madame
Monsieur en A1,A2,A3...

Excel cependant prend en considération les liges jusqu'à l
a ligne 65536...

???????? tout essayer, je deviend fou...

Merci de votre aide... (même un autre code, pourvu^'il
puisse être dynamique si je rajoute quelque chose dans la
liste déroulant

Merci de votre aide
er merci d'avance








Avatar
AV
1- quand je mets en pratique l'exemple,
Excel ne propose pas "maliste" dans la

"zone de nom" en haut, à gauche de la barre de formules.


Normal ... C'est comme ça avec les plages définies par la fonction (volatile)
DECALER

2- j'ai eu besoin de faire la même manip,
mais en bas d'une feuille, sachant qu'il y avait
d'autres valeurs sans intérêt en haut de la colonne A;


C'est l'inconvénient (boff...) de la fonction : elle n'accepte pas les cellules
vides !

AV


Avatar
Sabian
Merci la méthode DECALER je connaissais pas, mais
nickel....

encore merci
Sabian

-----Message d'origine-----
Bonjour,
Pour rendre ton code *dynamique*, nul besoin d'une macro
compliquée :


Dans le userform_initialize (ou ailleurs suivant tes
besoins), tu écris


maliste.rowsource=("mafeuille!maliste")

Dans excel (pas VBA) tu écris les données servant de
source à ta liste

dans la feuille mafeuille, par exemple dans la colonne A,
les unes en

dessous des autres et sans vides.
Tu sélectionnes ces données
menu insertion/nom.définir
dans la case en haut tu tapes "maliste" et dans la case
du bas, là ou

est écrit un truc genre "A1:A23", tu effaces ce qui est
inscrit et à la

place tu tapes
Þcaler($A$1;;;nbval($A:$A)) et tu cliques sur ajouter.
Sans quitter

cette fenêtre tu vérifies que tu as bien fait comme il
faut simplement

en recliquant dans la formule. Tu dois voir un pointillé
entourer les

valeurs de ta colonne A.
Maintenant, c'est magique, grace à la formule décaler, si
tu ajoutes un

nom dans cette liste, il va automatiquement être pris en
compte dans le

nom "maliste" et ajouté sans rien faire dans ta liste sur
ton userform.


Essaie, tu verras c'est vraiment ce qu'il y a une plus
simple une fois

qu'on a cessé d'avoir peur d'une tite formule décaler :-)

Misange migrateuse http://www.excelabo.net
mail : http://cerbermail.com/?k5Q8Dh2mta


le 03/11/2003 17:42:
Salut...

J'ai un code pour remplir une liste déroulante de
manière


dynamique.
A savoir

Dans un module:
Public gstrRangeListe as string
-----------------------------------------
Public Sub RemplirListe(ByRef frm as UserForm, sh as
String, rge as String, cbo as String)
Worksheets(sh).Activate
frm.Controls(cbo).RowSource = Worksheets(sh).Range
(rge).Address


et sur mon Userform_Activate le code suivant:
Range("A1").Activate
gstrRangeListe = "A1:A" & Selection.End(xlDown).Row
Call RemplirListe (frmNewContact, "data",
gstrRangeListe, "cboTitre")
Me.cboTitre.ListIndex =0

Sur mes cellules, j'ai respectivement Mademoiselle,
Madame


Monsieur en A1,A2,A3...

Excel cependant prend en considération les liges
jusqu'à l


a ligne 65536...

???????? tout essayer, je deviend fou...

Merci de votre aide... (même un autre code, pourvu^'il
puisse être dynamique si je rajoute quelque chose dans
la


liste déroulant

Merci de votre aide
er merci d'avance





.




Avatar
Misange
Bonjour
Comme te le dit Alain et comme je l'avais précisé, il ne faut aucune
cellule vide dans la zone nommée avec décaler. Ce qui veut dire que si
tu dois effacer une valeur dans une liste d'ailleurs, il faut supprimer
la cellule (décaler vers le haut) et non pas seuement en effacer la valeur.
La seconde contrainte c'est que toutes les valeurs écrites dans la
colonne prise en ref (ici $A:$A) seront comptées par la formule
nbval($a:$a). Si tu mets une étiquette en haut de colonne, il faut alors
modifier la formule pour tenir compte de cela :
Þcaler($a$2;;;(nbval($a:$a)-1)
Si tu avais 6 lignes inutiles en haut, tu ajusterais de même la cellule
de départ (A7) et le nb de valeurs à prendre : nbval($a:$a)-6. Mais il
faut faire très attention à ne pas ajouter de trucs ailleurs dans cette
colonne. Une habitude que j'ai prise est de réserver une page (toujours
nommée "codes" chez moi comme ça je m'y retrouve...) dans laquelle je
n'écris qu'une série de choses par colonne. Cette page (qui peut être
masquée suivant l'usage du classeur) me sert de lieu de stockage pour
mes listes et de brouillon pour noter ce que je ne dois pas oublier de
corriger par exemple.

Quant au fait que le nom maliste n'apparaisse pas dans la zone de nom,
c'est normal, dès que tu nommes une plage, le nom n'apparait pas si tu
ne cliques dans une seule cellule (qui peut très bien appartenir à
plusieurs plages nommées...)

Misange migrateuse http://www.excelabo.net
mail : http://cerbermail.com/?k5Q8Dh2mta


le 03/11/2003 23:28:
bonjour,

je trouve vraiment pratique de pouvoir
rendre ainsi "dynamique" une plage nommée.

Mais j'ai plusieurs questions:

1- quand je mets en pratique l'exemple,
Excel ne propose pas "maliste" dans la
"zone de nom" en haut, à gauche de la barre de formules.

2- j'ai eu besoin de faire la même manip,
mais en bas d'une feuille, sachant qu'il y avait
d'autres valeurs sans intérêt en haut de la colonne A;
maliste était alors:
Þcaler($A$353;;;nbval($A353:$A10000)).
Mais là, ça ne marche plus du tout:
si je sélectionne une cellule plus "basse" (ligne 360 p.ex.),
puis ctrl+F3 pour vérifier la définition de "maliste", ....
elle a changé: du genre
Þcaler($A$353;;;nbval($A360:$A10000))
et si je me mets ligne 361, ça change de nouveau.
????
Ai-je tout fait de travers, ou outrepassé les possibilités
d'Excel?

Merci de vos lumières.

Bourby



"Misange" a écrit dans le message news:
OqOS#

Bonjour,
Pour rendre ton code *dynamique*, nul besoin d'une macro compliquée :

Dans le userform_initialize (ou ailleurs suivant tes besoins), tu écris

maliste.rowsource=("mafeuille!maliste")

Dans excel (pas VBA) tu écris les données servant de source à ta liste
dans la feuille mafeuille, par exemple dans la colonne A, les unes en
dessous des autres et sans vides.
Tu sélectionnes ces données
menu insertion/nom.définir
dans la case en haut tu tapes "maliste" et dans la case du bas, là ou
est écrit un truc genre "A1:A23", tu effaces ce qui est inscrit et à la
place tu tapes
Þcaler($A$1;;;nbval($A:$A)) et tu cliques sur ajouter. Sans quitter
cette fenêtre tu vérifies que tu as bien fait comme il faut simplement
en recliquant dans la formule. Tu dois voir un pointillé entourer les
valeurs de ta colonne A.
Maintenant, c'est magique, grace à la formule décaler, si tu ajoutes un
nom dans cette liste, il va automatiquement être pris en compte dans le
nom "maliste" et ajouté sans rien faire dans ta liste sur ton userform.

Essaie, tu verras c'est vraiment ce qu'il y a une plus simple une fois
qu'on a cessé d'avoir peur d'une tite formule décaler :-)

Misange migrateuse http://www.excelabo.net
mail : http://cerbermail.com/?k5Q8Dh2mta


le 03/11/2003 17:42:

Salut...

J'ai un code pour remplir une liste déroulante de manière
dynamique.
A savoir

Dans un module:
Public gstrRangeListe as string
-----------------------------------------
Public Sub RemplirListe(ByRef frm as UserForm, sh as
String, rge as String, cbo as String)
Worksheets(sh).Activate
frm.Controls(cbo).RowSource = Worksheets(sh).Range
(rge).Address


et sur mon Userform_Activate le code suivant:
Range("A1").Activate
gstrRangeListe = "A1:A" & Selection.End(xlDown).Row
Call RemplirListe (frmNewContact, "data",
gstrRangeListe, "cboTitre")
Me.cboTitre.ListIndex =0

Sur mes cellules, j'ai respectivement Mademoiselle, Madame
Monsieur en A1,A2,A3...

Excel cependant prend en considération les liges jusqu'à l
a ligne 65536...

???????? tout essayer, je deviend fou...

Merci de votre aide... (même un autre code, pourvu^'il
puisse être dynamique si je rajoute quelque chose dans la
liste déroulant

Merci de votre aide
er merci d'avance












Avatar
Bourby
bonjour,

et merci pour les explications.

Bourby


"AV" a écrit dans le message news:
bo7bn9$oek$
1- quand je mets en pratique l'exemple,
Excel ne propose pas "maliste" dans la

"zone de nom" en haut, à gauche de la barre de formules.


Normal ... C'est comme ça avec les plages définies par la fonction
(volatile)

DECALER

2- j'ai eu besoin de faire la même manip,
mais en bas d'une feuille, sachant qu'il y avait
d'autres valeurs sans intérêt en haut de la colonne A;


C'est l'inconvénient (boff...) de la fonction : elle n'accepte pas les
cellules

vides !

AV






Avatar
Bourby
bonjour Misange,

merci de ces explications circonstanciées.
Je retiens l'idée de l'onglet "codes".

Si ça peut servir à d'autres: pour obtenir la même facilité
(= insérer des cellules supplémentaires en bas d'une plage verticale
nommée),
il m'arrive d'inclure une cellule vide en bas de ma plage
lorsque je la nomme. Ensuite, lorsque j'insère une ligne ou une cellule
au dessus de cette cellule vide, Excel "rallonge" automatiquement
la plage nommée. Pour mieux m'y retrouver, je colorie ou j'encadre
la plage (y compris la cellule vide).
La même approche est encore plus naturelle quand on veut "rallonger"
la plage par en haut, ce que je préfère lorsque les listes sont longues:
on évite alors de naviguer dans la page pour ajouter des données,
(ou lire un total).

(Remarque: Pour le fait que le nom n'aparaisse pas,
je voulais dire: lorsqu'on active le bouton de liste déroulante;
Dans ce cas là, je crois que la réponse m'a été donnée par Alain.)

Encore merci pour ton aide.

Bourby


"Misange" a écrit dans le message news:

Bonjour
Comme te le dit Alain et comme je l'avais précisé, il ne faut aucune
cellule vide dans la zone nommée avec décaler. Ce qui veut dire que si
tu dois effacer une valeur dans une liste d'ailleurs, il faut supprimer
la cellule (décaler vers le haut) et non pas seuement en effacer la
valeur.

La seconde contrainte c'est que toutes les valeurs écrites dans la
colonne prise en ref (ici $A:$A) seront comptées par la formule
nbval($a:$a). Si tu mets une étiquette en haut de colonne, il faut alors
modifier la formule pour tenir compte de cela :
Þcaler($a$2;;;(nbval($a:$a)-1)
Si tu avais 6 lignes inutiles en haut, tu ajusterais de même la cellule
de départ (A7) et le nb de valeurs à prendre : nbval($a:$a)-6. Mais il
faut faire très attention à ne pas ajouter de trucs ailleurs dans cette
colonne. Une habitude que j'ai prise est de réserver une page (toujours
nommée "codes" chez moi comme ça je m'y retrouve...) dans laquelle je
n'écris qu'une série de choses par colonne. Cette page (qui peut être
masquée suivant l'usage du classeur) me sert de lieu de stockage pour
mes listes et de brouillon pour noter ce que je ne dois pas oublier de
corriger par exemple.

Quant au fait que le nom maliste n'apparaisse pas dans la zone de nom,
c'est normal, dès que tu nommes une plage, le nom n'apparait pas si tu
ne cliques dans une seule cellule (qui peut très bien appartenir à
plusieurs plages nommées...)

Misange migrateuse http://www.excelabo.net
mail : http://cerbermail.com/?k5Q8Dh2mta


le 03/11/2003 23:28:
bonjour,

je trouve vraiment pratique de pouvoir
rendre ainsi "dynamique" une plage nommée.

Mais j'ai plusieurs questions:

1- quand je mets en pratique l'exemple,
Excel ne propose pas "maliste" dans la
"zone de nom" en haut, à gauche de la barre de formules.

2- j'ai eu besoin de faire la même manip,
mais en bas d'une feuille, sachant qu'il y avait
d'autres valeurs sans intérêt en haut de la colonne A;
maliste était alors:
Þcaler($A$353;;;nbval($A353:$A10000)).
Mais là, ça ne marche plus du tout:
si je sélectionne une cellule plus "basse" (ligne 360 p.ex.),
puis ctrl+F3 pour vérifier la définition de "maliste", ....
elle a changé: du genre
Þcaler($A$353;;;nbval($A360:$A10000))
et si je me mets ligne 361, ça change de nouveau.
????
Ai-je tout fait de travers, ou outrepassé les possibilités
d'Excel?

Merci de vos lumières.

Bourby



"Misange" a écrit dans le message news:
OqOS#

Bonjour,
Pour rendre ton code *dynamique*, nul besoin d'une macro compliquée :

Dans le userform_initialize (ou ailleurs suivant tes besoins), tu écris

maliste.rowsource=("mafeuille!maliste")

Dans excel (pas VBA) tu écris les données servant de source à ta liste
dans la feuille mafeuille, par exemple dans la colonne A, les unes en
dessous des autres et sans vides.
Tu sélectionnes ces données
menu insertion/nom.définir
dans la case en haut tu tapes "maliste" et dans la case du bas, là ou
est écrit un truc genre "A1:A23", tu effaces ce qui est inscrit et à la
place tu tapes
Þcaler($A$1;;;nbval($A:$A)) et tu cliques sur ajouter. Sans quitter
cette fenêtre tu vérifies que tu as bien fait comme il faut simplement
en recliquant dans la formule. Tu dois voir un pointillé entourer les
valeurs de ta colonne A.
Maintenant, c'est magique, grace à la formule décaler, si tu ajoutes un
nom dans cette liste, il va automatiquement être pris en compte dans le
nom "maliste" et ajouté sans rien faire dans ta liste sur ton userform.

Essaie, tu verras c'est vraiment ce qu'il y a une plus simple une fois
qu'on a cessé d'avoir peur d'une tite formule décaler :-)

Misange migrateuse http://www.excelabo.net
mail : http://cerbermail.com/?k5Q8Dh2mta


le 03/11/2003 17:42:

Salut...

J'ai un code pour remplir une liste déroulante de manière
dynamique.
A savoir

Dans un module:
Public gstrRangeListe as string
-----------------------------------------
Public Sub RemplirListe(ByRef frm as UserForm, sh as
String, rge as String, cbo as String)
Worksheets(sh).Activate
frm.Controls(cbo).RowSource = Worksheets(sh).Range
(rge).Address


et sur mon Userform_Activate le code suivant:
Range("A1").Activate
gstrRangeListe = "A1:A" & Selection.End(xlDown).Row
Call RemplirListe (frmNewContact, "data",
gstrRangeListe, "cboTitre")
Me.cboTitre.ListIndex =0

Sur mes cellules, j'ai respectivement Mademoiselle, Madame
Monsieur en A1,A2,A3...

Excel cependant prend en considération les liges jusqu'à l
a ligne 65536...

???????? tout essayer, je deviend fou...

Merci de votre aide... (même un autre code, pourvu^'il
puisse être dynamique si je rajoute quelque chose dans la
liste déroulant

Merci de votre aide
er merci d'avance