Problème de conception - VB/VBA/VBS - Programmation
Marsh Posté le 09-04-2005 à 07:16:34
bonjour,
perso je gère ce genre de problème dans des tables cachées... dans d'autres classeurs (à feuilles uniques et qui n'ont pas l'extension .xls)
L'accès est rapide, transparent pour les utilisateurs et ça ne crée aucun problème de maintenance.
Nota : ma réponse est aussi vague que ta question est ambigue.
si on part du principe
Citation : Je voudrais créer dans une autre feuille... |
alors bien sur pas besoin de classeur intermédiaire, et bien sur VBA doit faire la mise à jour à chaque saisie dans la base de Données.
Et dans ce cas je ne vois pourquoi :
Citation : utilise une plage dans une table cachée |
Je comprend donc que tu souhaites créer un référentiel sans doublons pas forcément visible des utilisateurs.
Pour la dernière question : A ma connaissance, il n'est pas possible de nourrir un liste de validation à partir d'une autre feuille que la feuille active.
Donc à partir d'un référentiel externe, tu ne peux que contrôler la validité des données via VBA
A+
Marsh Posté le 09-04-2005 à 13:25:04
Salut galopin et merci pour ta réponse !!
En fait, pour nourrir une liste de validation à partir d'une autre feuille excel, il faut nommer la plage de données à utiliser (par exemple "pla" ) puis dans la plage source à définir dans la liste de validation, il faut rentrer "=pla".
Ensuite, pour que pla soit à la taille de l
Marsh Posté le 09-04-2005 à 13:34:40
Suite...
Pour que "pla" s'ajuste à la bonne taille lorsqu'on rajoute une donnée, il suffit de définir la source de la plage nommée pla avec une formule du style DECALER(...).
En fait, l'idéal pour moi serait d'avoir une liste de validation qui propose une liste des modalités de mon critère sans les doublons sans faire appel à vba ou à des colonnes intermédiaires (dans une plage cachés par ex...)
En fait, je souhaiterais avoir une présentation style tableau dynamique croisé (pour la liste de choix sauf que la liste serait une liste de validation ou au pire une liste de choix classique qui se met à jour rapidement)
Nota: Je ne peut pas utiliser les tableaux dyn croisés pour mon appli pour plusieurs raisons(mise à jour auto de la taille des tableaux dyn croisés,...)
Marsh Posté le 09-04-2005 à 16:37:45
Bonjour,
Ben... je suis à la fois perplexe et dubitatif !
Citation : En fait, pour nourrir une liste de validation à partir d'une autre feuille |
Au risque de me répéter, à ma connaissance il n'est pas possible de nourrir un liste de validation du type "Données->Validation->Liste" à partir d'une autre feuille que la feuille active.
Nous parlons donc bien d'un référentiel via VBA ou une interface de saisie...
Dans ce cas puisque tu es déjà dans un contexte VBA, je ne vois aucun avantage à avoir des listes avec des critères pré calculés. (sauf à maintenir à jour en permanence ces listes au prix de nombreux recalculs la plupart du temps inutiles.)
Dans le cas contraire, (faire une liste de validation dans la base de donnée elle-même) : A priori comme ça, ça me parait très contre indiqué dans une base de donnée de cette importance. Quoique, ça puisse se discuter (en fonction du poids de ta base de données, nombre de colonnes, nombre de formules, nombres de format...) et de la musculation de ta station de travail... mais si tu es encore sous 97, c'est que tu dois pas en avoir beaucoup sous le pied... aussi je ne suis sûrement pas loin de la vérité.
Ma philosophie personnelle est : quand on a une base de donnée sous Excel surtout de cette taille, mieux vaut que ça reste une base de donnée si on veut éviter les ennuis. Ou alors prévoir des sauvegardes !
Pour conclure si tu tiens vraiment à une liste de validation, tri, filtrage, critères... intégrée à la base de donnée (donc dans la même feuille) tu peux la masquer à condition de créer un base de donnée parallèle (séparée par une colonne vide de ta base de donnée actuelle) En tout état de cause ça ne me semble envisageable qu'avec VBA et j'éviterai soigneusement toute formule du type DECALER ou autre.
VBA est très capable de modifier lui-même l'adresse exacte de la zone nommée qu'il va modifier.
Mais bon... comme c'est la période des cloches, il faudrait peut-être entendre d'autres sons !
Tu pourrais essayer : ici
A+
Marsh Posté le 09-04-2005 à 17:56:03
Re slt
Voici un texte que j'ai trouvé en cherchant sur le net:
J'ai une liste dont les données sources sont dans une colonne. Comment faire pour que tout
ajout dans cette colonne se répercute dans ma liste ?
Il faut que tu nommes ta plage de données sources avec la fonction décaler (tu trouveras
de l'aide sur cette fonction dans le lexique et sur la page formules).
Si par exemple tes données sont sur la page "codes" dans la colonne A avec en A1 le titre
de ta liste (qui ne doit pas apparaitre dans les éléments de ta liste), et les différents éléments
à inclure en A2:A20, sélectionne A2, puis menu Insertion/nom/définir. Choisis un nom pour ta
liste, disons "maliste" et dans la zone en bas tu écris :
=decaler($A2;;;nbval($A:$A)-1) puis tu cliques sur ajouter. Si tu recliques dans la formule en bas,
tu verras que dans ton classeur toutes les données entre A2 et A20 sont entourées d'un pointillé.
Tu vas maintenant utiliser le nom "maliste" comme source de données.
Tu peux par exemple dans une une liste de validation (menu données/validation), mettre comme source de
données "=maliste" (sans les guillemets). Toutes les données que tu ajouteras sur la page codes
en dessous des valeurs précédentes seront automatiquement ajoutées à ta liste de choix.
De même tu peux utiliser cette astuce dans un formulaire (userform) pour alimenter une listbox.
Dans le userform_initialize (ou ailleurs suivant tes besoins), tu écris
malistbox.rowsource=("codes!maliste" )
(respecte la ponctuation)
L'intérêt c'est qu'une fois ceci défini, tu n'as plus à modifier ton code si tu ajoutes des éléments.
Là encore tout ajout de données (ou supression d'une cellule) se répercute tout seul dans ton userform.
Attention ! il ne faut absolument pas :
- Avoir de trous dans ta liste (donc pas d'effecement de valeurs, il faut supprimer et décaler
les cellules vers le haut)
- Ajouter d'autres choses dans la colonne A. Ou alors il faut ajuster la formule de décaler en
enlevant le nombre de cellules à ne pas prendre en compte.
En tous cas merci pour le lien que tu m'a donné !!
J'ai trouvé un classeur à télécharger ou il y a une démo de quelqu'un qui selectionne grâce à du code vb les éléments à insérer dans la liste de validation et les intègre sous la forme {.,...,.}. Exactement ce que je cherchais !!
Reste à écrire une méthode la plus rapide possible pour supprimer les doublons.
Je suis en train de réfléchir à une solution sous access pour stocker la base de données... Mais j'ai besoin après l'extraction des données d'effectuer des calculs qui sont grandement simplifiés pas excel. A voir si la liaison entre les deux logiciel est rapide simple pour l'utilisateur...
Marsh Posté le 09-04-2005 à 18:07:23
Pour avoir un exemple de liste de validation nourrie à partir d'une autre feuille de calcul (du même classeur) va à l'adresse suivante:
http://www.excelabo.net/moteurs/recherche.php
Comme mot clé tapes "liste de validation" puis tu télécharge le classeur "st-selectionner.xls" de starwing
La liste box est nourrie par un nom (qui fait référence à une plage d'une autre page)
Par contre, il est vrai qu'il est impossible de nourrir directement une liste de validation en indiquant les cellules d'une autre plage. Il faut d'abord nommer les cellules puis les référencer par leur nom dans la source de la liste de validation.
Marsh Posté le 09-04-2005 à 19:09:30
Pour ceux que ça intéresse, voici le code vba qui permet de nourrir une liste box depuis vba:
With ActiveCell.Validation
.Delete
.Add Type:=xlValidateList, _
Operator:=xlBetween, _
AlertStyle:=xlValidAlertStop, _
Formula1:="1,2,3,4"
End With
Il faut définir avant la validation de la cellule sur la feuille
Marsh Posté le 09-04-2005 à 19:15:43
Heu pardon pas une listeBox mais une liste de validation... Et bien sur il n'est pas nécessaire de définir avant la validation depuis la feuille. C'est l'instruction .add qui s'en charge
Marsh Posté le 08-04-2005 à 22:40:23
Bonjour à tous !!!
J'ai un problème de conception dans une application type "Base de donnée" sous excel 97.
J'ai une colonne dans ma base de donnée qui s'appelle critere 1.
Dans cette colonne, il y a de nombreux enregistrements qui ont la même valeur (doublons)
Je voudrais créer dans une autre feuille une liste Box avec toutes les modalités prises dans la colonne "critère".
Exemple:
BaseDeDonnées
Cle Critère ListBox
1 A A
2 A F
3 F R
4 F
5 F
6 R
7 R
Je souhaiterais aussi que lorsque je rajoute un enregistrement dans la base de données, la listBox se mette à jour automatiquement s'il y a de nouvelles modalités pour le critère 1.
J'hésite entre deux solutions:
1 - ListBox mise à jour par vba à chaque clique sur la listBox (mais cette procédure est longue et lourde car
la base contient plus de 40000 lignes et les utilisateurs souhaitent minimiser le vba dans l'appli)
2 - Une liste de validation qui utilise une plage dans une table cachée qui est mise à jour à chaque modif de la
base de données (grâce à une fonction perso qui crée une nouvelle colonne sans les doublons).
Problème: on introduit une page cachée ce qui complique l'application et la prise en main
et la maintenance les utilisateurs
Laquelle de ces deux solutions trouvez vous la meilleurs ?
Est il possible de gérer une liste de type "Données->Validation->Liste" via vba ?
Avez vous une autre solution pour ce problème ?
Merci de votre aide !!!!