OVH Cloud OVH Cloud

faire des tests sur des nom de variables vba

6 réponses
Avatar
Alfred Wallace
Bonjour,

je cherche à faire des comparaisons sur les noms de variables en vba.

Par exemple, je regarde si la variable porte le nom "Z_NOM_DE_VARIABLE"
et, si c'est le cas, je lui attribue une valeur.

Est-ce que c'est possible ?

puis je utiliser ActiveWorkBook.Names ?


voilou, merci de votre aide.


José

6 réponses

Avatar
Trirème
Bonjour José,
J'avoue ne pas avoir bien compris la question, mais...

Dans ton code VBA, puisque c'est toi qui l'écrit, tu dois savoir si le
nom testé à un endroit donné correspond à ton modèle ! Ou alors, puisque
tu sembles avoir plusieurs variables nommées sur ce modèle, ne peux tu
pas utiliser les listes (tableaux à une dimension) et leurs index ?

Sinon, pour utiliser les noms du classeur comme variable, les retrouver
et les modifier par VBA :

For Each n In ActiveWorkbook.Names
If UBound(Split(n.Name, "Z_NOM_DE_VARIABLE")) > 0 Then _
n.RefersTo = MaValeur
Next

J'espère ne pas être trop à côté de la plaque
Cordialement,
Trirème

Bonjour,

je cherche à faire des comparaisons sur les noms de variables en vba.

Par exemple, je regarde si la variable porte le nom "Z_NOM_DE_VARIABLE"
et, si c'est le cas, je lui attribue une valeur.

Est-ce que c'est possible ?

puis je utiliser ActiveWorkBook.Names ?


voilou, merci de votre aide.


José


Avatar
Alfred Wallace
Bonsoir Trirène,
Peux tu me dire ce que ton code fait ? en particuler :

If UBound(Split(n.Name, "Z_NOM_DE_VARIABLE")) > 0

Ubound ? kezako ? tu testes quoi avec cette instruction ?

Puis il y a cette ligne : n.RefersTo = MaValeur


est-ce que n.RefersTo "pointe" vers la zone nommée recherchée ?

désolé, je penseêtre un peu brouillon.


En fait, voilà, mon workbook contiend plusieur sheets. ok.
Dans une sheet en particulier il y a à des zones nommées.
mais, je ne les connais pas à l'avance. je sais simplement
que le nom de ces zones correspond aux noms d'autres zones
dans une autre sheet du même workbook.

exemple :
j'ai une sheet "base" avec les colonnes suivantes :
NOM, PRENOM, AGE et VILLE
les données sont en colonnes, et la zone NOM représente donc
la colonne "NOM"

Dans une autre sheet, j'ai des cellules nommées avec
le nom des zones de "base", mais, je ne connais pas à l'avance
les noms qui seront employés.


Donc, je dois pour toutes les lignes de base.NOM les affecter
à la zone NOM d'une autre feuille.



Voilà.

Merci encore pour ton aide.


José
















Bonjour José,
J'avoue ne pas avoir bien compris la question, mais...

Dans ton code VBA, puisque c'est toi qui l'écrit, tu dois savoir si le
nom testé à un endroit donné correspond à ton modèle ! Ou alors, puisque
tu sembles avoir plusieurs variables nommées sur ce modèle, ne peux tu
pas utiliser les listes (tableaux à une dimension) et leurs index ?

Sinon, pour utiliser les noms du classeur comme variable, les retrouver
et les modifier par VBA :

For Each n In ActiveWorkbook.Names
If UBound(Split(n.Name, "Z_NOM_DE_VARIABLE")) > 0 Then _
n.RefersTo = MaValeur
Next

J'espère ne pas être trop à côté de la plaque
Cordialement,
Trirème


Avatar
Trirème
Bonsoir José... ou Alfred

Depuis quelques jours je suis tes posts avec attention car j'ai eu ce
genre de demande.
Donc, avant de répondre à tes questions, je t'explique mon sujet et sa
résolution.
J'ai une feuille appelée formulaire destinée à rassembler plusieurs
indicateurs pour un même secteur. Tous les champs du formulaire sont mis
à jour manuellement ou par macro. La feuille 'formulaire' est soit
imprimée (papier, pdf) soit dupliquée et copiée en valeur. Ensuite je
passe à un autre secteur en rafraîchissant à nouveau tous les
indicateurs du formulaire. Je peux faire ainsi plus de 70 copies de ce
formulaire pour 70 secteurs.
Je crois que ton problème ressemble à ça :
http://cjoint.com/?cpb7xQp3Lc

Sur ce lien, un exemple très court et très simplifié pour montrer le
principe.
J'utilise la cellule liée d'une liste déroulante. La macro modifie la
valeur de cette cellule liée.
La macro finale (non fournie ici) copie en fait les onglets dans un
nouveau classeur, fait de la mise en forme, mise en page, fait des
contrôles, gèrent quelques erreurs...

Peux tu me dire ce que ton code fait ? en particuler :

If UBound(Split(n.Name, "Z_NOM_DE_VARIABLE")) > 0
Ubound ? kezako ? tu testes quoi avec cette instruction ?
La fonction Split est détournée pour connaître l'existence d'une

sous-chaîne à l'intérieur d'une chaîne (Je n'ai rien inventé).
La fonction Split découpe une haine de caractère d'après un séparateur
et met chaque élément découpé dans une liste.
Ici le séparateur est le nom que tu cherches ("Z_NOM_DE_VARIABLE"). S'il
est trouvé dans le Name, la liste contient au moins 1 élément, sinon la
liste est vide. UBound donne l'index max de la liste ainsi créée.
UBound()>0 signifie que le séparateur existe

exemple :
j'ai une sheet "base" avec les colonnes suivantes :
NOM, PRENOM, AGE et VILLE
les données sont en colonnes, et la zone NOM représente donc
la colonne "NOM"

Dans une autre sheet, j'ai des cellules nommées avec
le nom des zones de "base", mais, je ne connais pas à l'avance
les noms qui seront employés.
Même si tu connais le nom employé, tu ne connaîtras que la colonne de ta

"base" mais comment sauras tu à quelle ligne de la base il faudra faire
référence ?

Tu n'a pas qu'une ligne dans la base.
Donc, je dois pour toutes les lignes de base.NOM les affecter
à la zone NOM d'une autre feuille.



Cordialement
Trirème

Avatar
Alfred Wallace
Bonjour ;-)

je joint à mon tour un exemple de ce que je souhaite obtenir :

http://cjoint.com/?cpnsFsNdUW

dis moi ce que tu en penses.

José (heu, oui alfred, c'est un pseudo)






Bonsoir José... ou Alfred

Depuis quelques jours je suis tes posts avec attention car j'ai eu ce
genre de demande.
Donc, avant de répondre à tes questions, je t'explique mon sujet et sa
résolution.
J'ai une feuille appelée formulaire destinée à rassembler plusieurs
indicateurs pour un même secteur. Tous les champs du formulaire sont mis
à jour manuellement ou par macro. La feuille 'formulaire' est soit
imprimée (papier, pdf) soit dupliquée et copiée en valeur. Ensuite je
passe à un autre secteur en rafraîchissant à nouveau tous les
indicateurs du formulaire. Je peux faire ainsi plus de 70 copies de ce
formulaire pour 70 secteurs.
Je crois que ton problème ressemble à ça :
http://cjoint.com/?cpb7xQp3Lc

Sur ce lien, un exemple très court et très simplifié pour montrer le
principe.
J'utilise la cellule liée d'une liste déroulante. La macro modifie la
valeur de cette cellule liée.
La macro finale (non fournie ici) copie en fait les onglets dans un
nouveau classeur, fait de la mise en forme, mise en page, fait des
contrôles, gèrent quelques erreurs...

Peux tu me dire ce que ton code fait ? en particuler :

If UBound(Split(n.Name, "Z_NOM_DE_VARIABLE")) > 0

Ubound ? kezako ? tu testes quoi avec cette instruction ?
La fonction Split est détournée pour connaître l'existence d'une

sous-chaîne à l'intérieur d'une chaîne (Je n'ai rien inventé).
La fonction Split découpe une haine de caractère d'après un séparateur
et met chaque élément découpé dans une liste.
Ici le séparateur est le nom que tu cherches ("Z_NOM_DE_VARIABLE"). S'il
est trouvé dans le Name, la liste contient au moins 1 élément, sinon la
liste est vide. UBound donne l'index max de la liste ainsi créée.
UBound()>0 signifie que le séparateur existe


exemple :
j'ai une sheet "base" avec les colonnes suivantes :
NOM, PRENOM, AGE et VILLE
les données sont en colonnes, et la zone NOM représente donc
la colonne "NOM"

Dans une autre sheet, j'ai des cellules nommées avec
le nom des zones de "base", mais, je ne connais pas à l'avance
les noms qui seront employés.


Même si tu connais le nom employé, tu ne connaîtras que la colonne de ta
"base" mais comment sauras tu à quelle ligne de la base il faudra faire
référence ?

Tu n'a pas qu'une ligne dans la base.

Donc, je dois pour toutes les lignes de base.NOM les affecter
à la zone NOM d'une autre feuille.



Cordialement
Trirème



Avatar
Trirème
Bonjour José,
Ton cas est bien ce que je pensais.
Ce que j'ai envoyé fait ce que tu souhaites. Désolé de ne pas utiliser
la méthode que tu imaginais... en quelque sorte je t'impose ma solution.
L'as tu lue ?

Cette version légèrement modifiée apporte plus de souplesse pour faire
évoluer ton 'canevas' (c'est aussi la forme finale de mon propre projet).
ici : http://cjoint.com/?cpoRRTgKWa

Cordialement,
Trirème

Bonjour ;-)

je joint à mon tour un exemple de ce que je souhaite obtenir :

http://cjoint.com/?cpnsFsNdUW

dis moi ce que tu en penses.

José (heu, oui alfred, c'est un pseudo)



Avatar
Alfred Wallace
Merci encore, je n'ai pas pû me connecter cet après midi.

Donc je vais regarder ceci demain matin.

Mais en quoi ta méthode diffère ?


cordialement

José

Bonjour José,
Ton cas est bien ce que je pensais.
Ce que j'ai envoyé fait ce que tu souhaites. Désolé de ne pas utiliser
la méthode que tu imaginais... en quelque sorte je t'impose ma solution.
L'as tu lue ?

Cette version légèrement modifiée apporte plus de souplesse pour faire
évoluer ton 'canevas' (c'est aussi la forme finale de mon propre projet).
ici : http://cjoint.com/?cpoRRTgKWa

Cordialement,
Trirème


Bonjour ;-)

je joint à mon tour un exemple de ce que je souhaite obtenir :

http://cjoint.com/?cpnsFsNdUW

dis moi ce que tu en penses.

José (heu, oui alfred, c'est un pseudo)