IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Gestionnaire de nom et VBA


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    ingénieur métrologie
    Inscrit en
    Janvier 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur métrologie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Gestionnaire de nom et VBA
    Bonjour,
    Je suis devant un petit casse tête et je souhaiterai savoir si il est résoluble.
    J'ai un classeur excel avec deux feuilles.via par exemple le gestionnaire de nom, j'ai défini un nom ("toto") dans la feuille 1 et "tata" dans la feuille 2.
    Quand j'utilise un sub dans un module, je peut aussi bien faire référence à toto qu'à tata via Range("toto") ou [toto].
    Par contre quand j'utilise un sub mais rattaché à une feuille cela ne fonctionne qu'avec [toto] et [tata].
    Vous me direz, il est ou le problème. Déjà j'aimerai savoir pourquoi Range("toto") ne marche plus. Ensuite, comme j'ai beaucoup de nom, j'incrémente, je compose, du genre toto1, toto2,... . Du coup si je veux par exemple faire une sub dans la feuille de tata (feuil2), les totoi ayant été déclaré dans la feuille 1 :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    sub titi()
    Dim num as integer
    for num = 1 to 5
         cells(1,num).value=[toto & num]
    'ou cells(1,num).value =range("toto" & num)
    next num
     
    end sub
    ca ne fontionne pas.
    Vous avez une solution?
    Merci

  2. #2
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Bonjour,

    un exemple : Cells(1, num).Value = Feuil1.Range("toto" & num).Value

    __________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  3. #3
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Bonjour rundish; Marc;

    Pour que ca fonctionne à partir de tous les modules de feuilles, le nom doit être défini avec l'étendue Classeur. (section Zone dans Définir un nom)


    Voir cet échange
    http://www.developpez.net/forums/d82...ible-classeur/

    L'avantage de définir un nom au niveau feuille, c'est que tu peux définir un nom dans les autres feuilles en utilisant toujours le même nom. Ce qui ne semble pas ce que tu veux faire pour l'instant.
    Cordialement

    Docmarti.

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    ingénieur métrologie
    Inscrit en
    Janvier 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur métrologie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonjour à vous et merci pour vos réponses

    Citation Envoyé par Docmarti Voir le message
    Bonjour rundish; Marc;

    Pour que ca fonctionne à partir de tous les modules de feuilles, le nom doit être défini avec l'étendue Classeur. (section Zone dans Définir un nom)

    Tout mes noms sont définis au niveau classeur justement. C'est pour ça que je ne comprend.
    Ce que je sais c'est que pour une macro dans un module associé au classeur tout se passe bien, alors que pour une macro directement dans une feuille (via bouton) ca ne marche plus...


    Citation Envoyé par Marc-L

    Bonjour,

    un exemple : Cells(1, num).Value = Feuil1.Range("toto" & num).Value …

    Je vais essayer. On verra bien.

    Merci

    Bonne journée

  5. #5
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Citation Envoyé par rundish Voir le message

    Tout mes noms sont définis au niveau classeur justement. C'est pour ça que je ne comprend.
    Ce que je sais c'est que pour une macro dans un module associé au classeur tout se passe bien, alors que pour une macro directement dans une feuille (via bouton) ca ne marche plus...
    Tu as raison. Il semble que les noms définis avec une étendue classeur se comportent comme les variables définies Public dans un module feuille.
    C'est-à-dire qu'il faut spécifier l'objet feuille pour s'y référer à partir de l'extérieur de la feuille:

    Une différence cependant. À partir d'un module standard, on peut se référer à un nom défini avec étendue classeur sans spécifier l'objet feuille.

    Dans un module standard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub titi()
    Dim num As Integer
    For num = 1 To 5
      Cells(1, num).Value = Range("toto" & num).Value
    Next num
    End Sub
    Dans un autre module feuille:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub titi()
    Dim num As Integer
    For num = 1 To 5
      Cells(1, num).Value = Feuil2.Range("toto" & num).Value
    Next num
     
    End Sub
    Cordialement

    Docmarti.

  6. #6
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Si par exemple un nom est défini sur une cellule de la feuille 1 avec la portée classeur, à partir du module de la feuille 2
    en version 2003 & 2007 je n'ai pas besoin de préciser la feuille avec l'écriture directe entre crochets …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  7. #7
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Bonjour Marc.

    Merci de l'info. C'est intéressant. Ca m'a conduit à une autre découverte qui fonctionne aussi : Evaluate.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub titi()
    Dim num As Integer
    For num = 1 To 5
     
      Cells(1, num).Value = Evaluate("toto" & num).Value
     
    Next num
     
    End Sub
    Cordialement

    Docmarti.

  8. #8
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 802
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 802
    Points : 28 690
    Points
    28 690
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Il y a une autre option c'est d'utiliser l'objet ThisWorkBook où une procédure utilisant Range("nom") fonctionne parfaitement.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  9. #9
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    Citation Envoyé par Docmarti Voir le message
    Ca m'a conduit à une autre découverte qui fonctionne aussi : Evaluate.
    En fait les crochets représentent la notation abrégée d'Evaluate.
    Mais parfois pour certaines formules les crochets ne passent pas alors que c'est sans souci via Evaluate
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    ingénieur métrologie
    Inscrit en
    Janvier 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur métrologie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonsoir.
    Merci à vous pour votre aide, remarques et suggestions.
    L'écriture directe entre crochet est effectivement très pratique. Le truc c'est que ca ne marche pas quand on "reconstruit" le nom.
    J'ai donc fait ce que vous avez dit avec la référence à la feuille. Je vais tester avec evaluate, cela peut simplifier la lecture de la macro.
    Je vous remercie donc encore. Mes macros fonctionnent.
    Je ne sais toujours pas pourquoi :

    Citation Envoyé par Docmarti Voir le message
    Il semble que les noms définis avec une étendue classeur se comportent comme les variables définies Public dans un module feuille.
    C'est un mystère de microsoft!!!

    Si quelqu'un a la réponse, je suis preneur, sinon, le sujet peut être clos.
    Encore merci

  11. #11
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 696
    Points
    6 696
    Par défaut
    Bonjour,

    Tu as raison. Il semble que les noms définis avec une étendue classeur se comportent comme les variables définies Public dans un module feuille.
    Attention !
    Une variable Public en VBA doit toujours et uniquement être déclarée dans le haut (zone de déclaration) d’un module standard !
    Les modules de feuilles, de classeur ou de UserForm sont des pseudos modules de classe et se comportent du coup pareils à ce niveau, y déclarer une variable Public revient en fait à définir une propriété dans cette classe… c’est pourquoi, pour avoir un résultat tu dois ajouter devant le nom de l’objet concerné, suivi du point et de nom de la propriété que tu as ainsi accidentellement définie.

    C'est un mystère de microsoft!!!
    Non, pas vraiment, c’est plus relatif à la compréhension du modèle Objet du VBA Excel. On en revient donc à ce qui vient d’être dit ci-dessus, les modules de feuilles et de classeurs ne sont pas des modules ordinaires, mais des pseudos modules de Classe.

    Dans un classeur de base à 3 feuilles avec la 1 active, si tu lances le code suivant dans un module standard ou le module de feuille1:


    Dans la même configuration, tu lances ce code dans le module de la feuille 2 ou 3 => Erreur 1004 !

    Eh oui, c’est le danger du pouvoir d’interprétation du VBA et de la notation implicite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Range("B5").Select  'revient à écrire en mode explicite
     
    Application.ActiveWorkbook.ActiveSheet.Range("B5").Select
    Si tu lances ce dernier code à partir de n’importe quel module de feuille, ce sera OK.

    Que se passe-t-il ? Pas de mystère, mais une logique dans un module Standard, il n’y a pas d’objet parent, le VBA applique ses règles tels que décrites dans l’aide (cf la propriété ActiveSheet de l’objet Application).
    Par contre les modules objets ont eux un objet parent ((«Aide VBA : Référence à l'instance en cours d'un objet : Utilisez le mot clé Me pour faire référence à l'instance en cours de l'objet où le code est exécuté. »)
    Et dans les notations vues plus haut, c’est à cet objet parent du module en cours que l’instruction se réfère, si tu lances un dans un module de feuille, il te retournera le nom de la feuille concernée par ce module.
    Dans notre contexte Si tu es dans le module de la feuille3 et que tu invoque la propriété Range("B5"), tu invoques en fait : Me.Range("B5"), si la feuille active n’est pas celle-ci => Select = plantage.

    Au niveau des noms, en schématisant, on a le même phénomène, nous n’avons que des noms d’étendue classeur dans le cas présent.

    Quand tu es dans un module Standard, le système de code implicite remonte au classeur et pas de souci.
    Quand tu es dans un module de feuille, le système de code implicite remonte au niveau feuille, si le nom (d’étendue classeur, on est d’accord) fait référence à cette feuille, il trouve ses petits et c’est bon, si ce n’est pas le cas, il ne trouve pas dans son objet container de cellule sur laquelle pointer et il plante.
    A partir du moment où tu deviens explicite et que tu lui dis sur quelle feuille pointer, plus de souci.
    Pour ce qui est du Thisworkbook, du coup ça coule de source, un Debug.Print Me.Name chez lui te retourneras le nom du classeur comme objet parent, le classeur est lui-même l’objet parent des toutes les feuilles, il retrouve ce qu’on lui demande sans soucis.

    D’où l’avantage d’être explicite pour savoir où l’on est et où l’on vise… Surtout qu’on pourrait s’amuser à se placer dans un cas où l’on ait le même nom en 4 exemplaires (1 portée classeur et 3 portées feuilles)

    cordialement,

    Didier
    Didier Gonard

    Dernier tutoriel :
    Le VBA qu'est ce que c'est ?
    Tutoriels : Voir la liste de mes tutoriels Excel & VBA et mon site pro sur ma Page DVP
    Cours et tutoriels pour apprendre Excel
    N'oubliez pas de mettre : ..quand c'est le cas !

Discussions similaires

  1. [XL-2007] comment trouver une colonne dans une BD par son nom via VBA
    Par chikitin dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/06/2010, 08h52
  2. [XL-2003] Définir un nom sous VBA
    Par alainb dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/06/2010, 20h32
  3. comme mettre son nom en vba sous access une fois pour toute ?
    Par alucard_xs dans le forum VBA Access
    Réponses: 14
    Dernier message: 25/01/2010, 12h01
  4. [XL-2007] cellules grisées dans gestionnaire de noms
    Par croky23 dans le forum Excel
    Réponses: 6
    Dernier message: 26/04/2009, 19h04
  5. Réponses: 2
    Dernier message: 23/03/2007, 15h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo