[basic + Calc]Modifier liste déroulante

Bonjour

J'ai une liste déroulante nommée "Armure" dont la plage de cellules source est 'armes-armures'.I3:I10

J'aimerai en appuyant sur un bouton exécuter une macro qui puisse modifier cette liste. Mettre 'armes-armures'.I3:I11 par exemple.

Comment faire ?

Bonsoir,

Ce que j'ai compris : la liste change de taille et on veut pouvoir sélectionner la nouvelle taille et lui donner le nom voulu.. ? (c'est ce qui se ferait par Range("I3").currentregion.name ="Arme-armures" en VBA Excel)

Si oui,  ce genre de chose devrait convenir : https://forum.openoffice.org/fr/forum/viewtopic.php?f=8&t=31903 (l'avant dernier message)
Je n'ai pas tester mais, bon,  y'a pas de raison ..

Bon courage

Christian F

Je n'ai pas l'impression que c'est ça. Je ne vois pas du tout où ou accède à la liste déroulante dans le programme.

Voici mon fichier : http://troumad.org/OOo/Feuille_Chronique.ods

Mon but serait que si un utilisateur rajoute des lignes par exemple à la feuille profils que le choix supplémentaire arrive dans la liste déroulante "profil" de la page "recto".

Bonjour à toutes et tous

Par "Gérer les noms" on peut modifier la plage de cellule de la plage nommée, mais je ne sais pas faire par macro (jamais eu besoin).

Par contre j'ai utilisé par le passé un truc qui fonctionne très bien, simplement et qui peut se faire par macro.
Par contre je n'ai plus mon ancienne application, et je ne peux la passer pour voir le code.
Mais voici le principe, il s'agit de :
- sélectionner la dernière ligne de ton tableau "tab_armure";
- faire "Insérer" avec décalage vers le bas;
- remplir les nouvelles cellules vides avec les données souhaitées.

Tes deux plages de données "tab_armure" et "armure" font maintenant respectivement référence aux cellules "I3:L11" et "I3:I11".
Et tu retrouves les nouvelles données dans les listes déroulantes.

Je recherches si je retrouve une trace sur mes vieilles disquettes (je les ai conservées même si elle ne servent plus à rien - LOL ;-))

Bien cordialement,
Patrick.

LOO Version: 5.4.7.2 (x64)

Bonjour,

Normalement il y a un truc qui doit marcher sans macros : utiliser la fonction DECALER dans la définition de la zone. Je sais que dans les anciennes versions (en 5.x) ça ne marchait pas mais je ne sais pas depuis quand ça peut fonctionner. En tous cas en 6.2 ça marche.

Par exemple
Une zone nommée "liste", commençant en b2 et pouvant avoir 1000 lignes maxi (pour éviter de prendre toute la colonne)
On définit la zone en mettant la formule DECALER($B$2;0;0;NBVAL($B$2:$B$1000);1) au lieu de mettre des coordonnées de cellules

La fonction DECALER permet de définir une zone à partir d'un point de départ
on a
la cellule de départ (ici B2)
Le nombre de ligne de décalage (ici 0)
le nombre de colonne de décalage (ici 0)
le nombre de lignes de la zone (ici définit par la fonction NBVAL qui compte combien de cellule qui sont occupées)
Le nombre e colonnes de la zone (ici 1)

Christian F

Cette fonction me semble en effet intéressante. Mais, il faudrait que je
modifie plus de 30 cellules. En plus, pour éviter trop de calcul, j'ai
demandé la modification des zones que s'il faut leq changer : si je veux
remettre ce qui est dedans, je ne modifie rien. Ça évite un temps
d'attente quand j'ouvre la page.

J'aurais peur que la fonction génère un tel temps de latence.

Bonsoir,

Fondamentalement, un traitement par une fonction du tableur va toujours beaucoup plus vite qu'un traitement par une macro en Basic car elles sont programmées dans un langage beaucoup plus efficace et proche du langage machine. Mettre à jour une trentaine de zones nommées ne dépassera pas une fraction de seconde. Comparé à la macro de mise à jour de la liste que j'avais proposé il y a quelque temps il y a un facteur 100 à 1000 en faveur de l'utilisation de la fonction.
Ceci étant, créer/modifier des zones nommées peut être long et fastidieux surtout quand on n'en a pas l'habitude. Il faut voir si l'investissement en temps en vaut la peine.

Christian F

Voici un exemple pour remplacer une zone :
DECALER($voies.$A$1;0;0;6;NBVAL($voies.$A$1:$ZZ$1))

Mais, c'est dans cette expression :
RECHERCHEH(C$20;DECALER($voies.$A$1;0;0;6;NBVAL($voies.$A$1:$ZZ$1));2;0)

Ne serait-il alors pas plus efficace d'écrire :
RECHERCHEH(C$20;$voies.$A$1:$ZZ$6;2;0)

Et dans ce cas, si par hasard, on passe plus loin que ZZ... Le programme
ne marchera plus ! Il faudrait que je mette quoi alors ? C'est vraiment
pour ça que je me demande si une macro qui ne prend en compte aucun
maximum possible n'est pas une bonne idée finalement !

Bonsoir,

D'une façon ou d'une autre il y a un maximum : le nombre de lignes (1 048 576) et de colonnes (1 024) d'une feuille

le principe de Decaler avec Nbval permet de prévoir toute une ligne (avec ses 1 024 colonnes) ou toute une colonne Nbval déterminant au fur et à mesure l'étendue occupée.

La formule serait, dans ce cas

RECHERCHEH(C$20;DECALER($voies.$A$1;0;0;6;NBVAL($voies.$1:$1));2;0)
Le passage $1:$1 dans le Nbval signifiant que l'on compte sur l'ensemble de la ligne 1 (de la colonne A à la colonne AMJ)

à travail égal, une formule bien construite sera toujours plus rapide à donner un résultat (et à taper) qu'une macro.
Sans avoir exploré la totalité du classeur, il me semble que l'ensemble des calculs et mises à jours devrait pouvoir se faire sans macro.

Au passage la formule
RECHERCHEH(C$20;$voies.$A$1:$ZZ$6;2;0)
ne fait pas la même chose que
RECHERCHEH(C$20;DECALER($voies.$A$1;0;0;6;NBVAL($voies.$A$1:$ZZ$1));2;0)

La 1ere fait ses recherches toujours jusqu'à la colonne ZZ, même si les colonnes sont vides
la seconde fait ses recherches en fonction de la zone occupée (Nbval détermine le nombre de colonnes occupées). c'est pour ça que l'on peut se permettre de mettre des choses comme 1:1, ce n'est pas l'étendue du tableau de recherche, c'est juste le comptage des colonnes occupées

En espérant avoir été utile

Christian F

Bonjour

Finalement, j'ai préférer conserver la macro car on s'arrête à la
première case vide : ça permet de laisser une case vide si on veut
commencer à compléter sans que la fin soit déjà prise en compte. Ou si
on veut éliminer des choix possibles sans les supprimer de la feuille.

J'ai juste optimisé les appels à la macro en les faisant sur la sortie
de la feuille où on fait les modifications : en effet, c'est une feuille
où on ne doit pas passer en utilisation courante. Donc, la macro ne
devrait pratiquement jamais être appelée alors que les formules de
recherche sont faite assez régulièrement.