Gestionnaire nom à longueur variable

Bonjour,

dans le gestionnaire de noms j'ai défini une zone:

=Feuil1!$B$3:$E$12

Cependant quand je vais ajouté de ligne ça ne serai plus 12 mais 25, 50....

Comment modifier pour prendre en compte une longueur variable de la colonne

merci par avance

Bonsoir,

c'est ce que l'on nomme "une plage dynamique"

Pour cela au lieu de : Feuil1!$a1:$a25 il faut écrire la formule :

=DECALER($A$1;;;NBVAL($A:$A);)

en supposant qu'il n'y a pas d'entête à la colonne.

Explications :

DECALER(CELLULE DE REFERENCE ; DECALAGE LIGNE PREMIERE CELLULE DE LA PLAGE . DECALAGE COLONNE PREMIERE CELLULE DE LA PLAGE ; DECALAGE LIGNE DERNIERE CELLULE DE LA PLAGE ; DECALAGE COLONNE DERNIERE CELLULE DE LA PLAGE)

Si on a pas d'entête de colonne, on prend en référence la cellule A1

le décalage de ligne pour la première cellule de la plage est donc de 0, on ne l'inscrit pas

le décalage de colonne pour la première cellule de la plage est donc de 0 car on reste sur la colonne A, on ne l'inscrit pas

le décalage de ligne pour la dernière cellule de la plage est égal au nombre de valeur de la colonne donc NBVAL($A:$A)

le décalage de colonne pour la dernière cellule de la plage est donc de 0 car là encore on reste sur la colonne A, on ne l'inscrit pas

Dans le cas où il y a une entête de colonne :

=DECALER($A1;1;;NBVAL($A:$A)-1;)

Vu qu'il y a une entête de colonne, sur le nombre de valeur de la colonne on soustrait 1 pour ne pas la prendre en compte...

@ bientôt

LouReeD


Oups !

pour finir dans votre cas il y a décalage de colonne !!!

Donc de B pour aller à E on décale de 3 colonnes !

Donc :

=DECALER($B$3;;;NBVAL($B:$B);3)

en supposant qu'en colonne B il n'y a pas d'autre valeur en ligne 1 et 2 et que pour chaque ligne il y a bien une valeur en colonne B

@ bientôt

LouReeD

Bonsoir,

merci pour la réponse,

j'ai ajouté mon fichier en PJ, j'ai mis la ligne de code dans 'champ2' en adaptant la ligne mais ça ne marche pas...

PS: c'est un code que j'ai trouvé sur internet et que je tente d'adapter


L'idée s'est que le champ2 peut évoluer en nombre de ligne

Bonjour,

à moins qu'il faut aussi changer les colonnes dans le gestionnaire de noms...

Bref je suis dans l'impasse!!!! Merci d'avance pour ceux qui me viendront en aide!!

Bonne journée

Bonjour,

Lorsque tu nommes une plage de façon dynamique, cela impose qu'il n'y ait rien en-dessous, du moins pour la colonne servant au dimensionnement, sans quoi l'évaluation sera fausse !

Le site de Boisgontier est une mine d'or... mais l'utilisation correcte de ses propositions implique un bonne connaissance des rudiments, voire parfois de rudiments avancés... !

Cordialement.

Bonjour,

merci pour le retour,

c'est vrai que c'est pointu, il me manque de l'expérience...

Cependant j'ai retravaillé le code, il est en PJ.

Je n'arrive pas à bien régler le champ2 dans le gestionnaire de noms.

Il m'affiche une bulle d'aide partout, j'ai fait un patch...

Qu'ne pensez vous?

Tu définis un Champ2 à partir de B3 sur 3 colonnes et un nombre de lignes correspondant au nombre de valeurs en B...

Ta zone orange commence à B1, elle occupe 10 colonnes !

B ne contient rien, donc Champ2 n'est pas défini du tout, et déclenchera une erreur là où il apparaît dans le code !

S'il n'en déclenche pas, c'est que dans la condition de SelectionChange tu écris Champ2 qui ne désigne alors plus une plage mais est interprétée comme variable de type Variant vide, ce qui conduit à ce que la condition soit toujours vérifiée et que la Shape apparaît quelle que soit la cellule de toute la feuille sélectionnée !!!

Il faut écrire [Champ2] (entre crochets pour que cela réfère à un nom de plage)

Et ta formule pour définir la zone orange comme Champ2 doit être :

=DECALER(Feuil1!$B$1;;;NBVAL(Feuil1!$A:$A);10)

Cordialement.

Bonjour,

c'est super ça marche!!!! merci beaucoup

Par contre j'ai tenté de rentre ce code dans un module pour faire plus propre et rajouter d'autre fonction par la suite.

Il me trouve une erreur sans buger, est ce normal?

merci

Bonsoir,

ma forme n'étant pas celle que j'aimerais avoir, je dis merci à MFerrand du relais...

Toujours jamais bien loin !

@ bientôt

LouReeD

Loureed,

je ne comprends pas bien ton message. Je suis conscient que mon problème est peut être insignifiant mais je n'ai pas réussi à le résoudre tout seul...

petit coucou à MFerrand, c'est tout, rien de bien méchant ne vous inquiétez pas !

@ bientôt

LouReeD

Salut LouReed !

pas de soucis

Je ne veux pas que vous pensiez que je pose des questions pour faire perdre du temps. Je rame réellement!!!!!

J'avais déjà tenté de mettre du code donné comme ça dans un modules mais ça ne fonctionnait pas!!!!!

Bon ! J'ai ouvert ton fichier ! Cela m'étonnerait que tu es trouvé ce code tel quel, car il n'a aucune chance de fonctionner...

Pour mémoire, je te prie de noter que je m'insurge toujours quand je vois des bouts de code avec des Range ou Cells qui apparaissent ainsi sans référence à l'objet parent !

Tu ne dois jamais perdre de vue que lorsque tu veux renvoyer un objet Range, tu invoques la propriété Range, ou Cells, ou Rows... d'un objet Worksheet (lequel est renvoyé par la propriété Worksheets d'un objet Workbook, etc.) On remonte toujours ainsi juqu'à l'objet Application renvoyée par sa propriété Application. C'est à dire que l'on renvoie toujours des objets par l'intermédiaire de propriétés ou méthodes situées à un niveau supérieur dans la hiérarchie des objets Excel.

Dans beaucoup d'expression, on peut omettre Application, qui est implicite. Comme on travaille en général avec une seule application Excel, ça roule (il peut y avoir quelques problèmes si l'on entreprend de travailler avec plusieurs Excel...), et le plus souvent on travaille avec un seul classeur, pas de perte donc en omettant Application.Workbooks(xx) (si l'on travaille avec plusieurs, il sera judicieux de s'en soucier...). Par contre dès lors qu'on arrive au niveau feuille on en a toujours potentiellement plusieurs, et il convient de ne pas l'ignorer, et ne pas considérer qu'il est bon de se référer implicitement à la feuille active.

C'est ce que l'on appelle qualifier ses expressions, ou les doter de qualificateur d'objet.

Ainsi il convient toujours mieux d'écrire Worksheets(1).Range("A1"), voire même ActiveSheet.Range("A1") (si la feuille active est nécessairement toujours celle que l'on souhaite durant le déroulement de la procédure), plutôt que Range("A1"), expression non qualifiée. Le code est plus précis, et il sera aussi plus rapide à l'exécution. Et si l'on a à se référer plusieurs fois à un objet, on le met sous bloc With, cela améliorera encore.

Après ce préambule, venons-en à ton problème concret : si VBA ne renâcle pas devant un Range ou Cells sans rien devant, et qu'il va aller lui-même chercher quelle la feuille active du classeur actif de l'application dans laquelle il se trouve pour pouvoir y rattacher le Range invoqué, il n'en va pas de même pour tous les objets !

En rencontrant un Shapes tout seul, VBA refusera obstinément d'aller plus loin (et Excel aussi). Cette vaste collection ne peut être rattachée qu'à une feuille, et si on ne lui indique pas quelle feuille, rien ne va plus !

Tu dois en avoir une bonne dizaine dans ton code qui se baladent ainsi.... tu vois donc ce qui te reste à faire !

Merci d'avoir pris le temps de répondre!!!!!

Je vais bien examiner ta réponse. Certains passage mérite une analyse approfondie de ma part

Merci MFerrand,

j'ai mis ActiveSheet.Shape à la place de Shape et tout marche.!!!

Comme tu l'as compris je code en amateur il me manque des bases

C'est juste pour le plaisir et pour mon travail perso

bonne journée

Bonne continuation

Rechercher des sujets similaires à "gestionnaire nom longueur variable"