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 :

appeler le contenu d'un range nommé sur un classeur donné


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 94
    Billets dans le blog
    1
    Par défaut appeler le contenu d'un range nommé sur un classeur donné
    Bonjour

    J'ai une application vba sur excel qui m'affiche un userform. Pour le remplissage je fais appel à des range nommés. Tout se passe bien mais...
    lorsque je suis amené à ouvrir un autre classeur, le userform ne comprend plus les range nommé puisqu'il se réfèrre au dernier classeur ouvert.

    Comment puis-je mémoriser le classeur source de mon appli pour que mes range nommés se réfèrent systématiquement à ce classeur et non pas au dernier classeur ouvert ?

    ce que j'ai jusque maintenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    range("macellule").value 'ceci renvoi le contenu de la cellule nommée macellule
    mais la cellule 'macellule' n'existe bien évidemment pas dans le classeur que je peux ouvrir entre temps.

    Une solution ?

  2. #2
    Membre émérite
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Par défaut
    bonsoir
    essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ThisWorkbook.Sheets(3).Range("macellule").Value
    remplace le 3 par ton nom (ou index) de feuille

    @+
    fred65200

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 94
    Billets dans le blog
    1
    Par défaut
    Salut et merci

    Le problème c'est que je perd l'intérêt des cellules nommées si je dois indiquer la feuille dans laquelle elles se trouvent...

    J'aimerais bien mémorisé mon classeur pour appelé la cellule nommé de tel classeur. Un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dim monclasseur as workbook
    set monclasseur = activeworkbook
     
    msgbox monclasseur.range("macellule")
    Mais bien entendu cela ne fonctionne pas puisque l'objet range ne se réfère pas à un classeur mais à une feuille (et pourtant ca fonctionne sans nommé la feuille lorsque le seul classeur concerné est ouvert)
    Alors, est-ce que je nage en pleine science-fiction ou y'a t'il une solution ?

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Ardèche (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 652
    Par défaut
    Bonsoir

    Sans ouvrir le classeur source (+ rapide), macro dite de Walkenbach:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    chemin = ThisWorkbook.Path
    tavariable= ExecuteExcel4Macro("'" & chemin & "\[source.xls]Feuil1'!R1C1")
    valeur de "chemin" à adapter à ton cas; "tavariable" renvoie la valeur inscrite dans la cellule A1 (R1C1)de la feuille1 du classeur "source.xls"

    bonne fin de soirée

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 94
    Billets dans le blog
    1
    Par défaut
    Merci Michel_M mais ce n'est pas ce que j'ai voulu expliquer. fred65200 est tout à fait dans le juste mais la solution ne me convient pas et j'en suis à me demander si il existe une autre solution (voir mon post précédent)

  6. #6
    Membre émérite
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Par défaut
    re:

    peux tu, avant d'ouvrir ton second classeur faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    maVar = range("maCellule").Value
    et dans le second classeur utiliser maVar?

    @+
    fred65200

  7. #7
    Membre émérite
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Par défaut
    re

    ou encore ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ThisWorkbook.Names("macellule").RefersToRange.Value
    @+
    fred65200

  8. #8
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 94
    Billets dans le blog
    1
    Par défaut
    Oui je peux faire tout ca, mais je vais préciser quand même certains points.

    Le second classeur est ouvert non pas par mon application, mais parce que l'utilisateur a ouvert pour d'autres raisons un autre classeur qui est donc devenu actif (et qui ne contient à priori pas les cellules nommées dont j'ai besoin)

    Donc, comme le suggère tes pistes on pourrait imaginer mémoriser toutes les références des cellules nommées avant de faire quoique ca soit mais je trouve ca très lourd non ?
    Tu m'as également donné une idée. Si je ne peux mémoriser le classeur pour m'en re-servir ultérieurement pour mes range nommés, et puisque je n'ai besoin de ces cellules nommées que lors de la manipulation de mon formulaire, alors j'ai tenté de forcer l'activation du classeur support de l'application à chaques fois que j'ai besoin d'y trouver les cellules nommées

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public WB as workbook
    'dans l'initialisation du userform :
    set WB = activeworkbook
    'et dans tous les évènements ou sub dont j'ai besoin d'un range("macellule"),
    ' je commence par activer le classeur de l'application en faisant
    WB.Activate
    Cela semble me convenir mais j'ai encore cette maudite impression qu'il y a une meilleur facon de faire. Je ne mettrais donc pas résolu tout de suite, histoire de voir si on trouve une meilleur idée

  9. #9
    Membre émérite
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Par défaut
    re
    Affaire à suivre donc..

    Tu peux écrire directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    thisworkbook.activate
    @+
    fred65200

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 491
    Par défaut
    bonjour

    J'aimerais bien mémorisé mon classeur pour appelé la cellule nommé de tel classeur. Un truc du genre :


    Code :
    dim monclasseur as workbook
    set monclasseur = activeworkbook

    msgbox monclasseur.range("macellule")Mais bien entendu cela ne fonctionne pas puisque l'objet range ne se réfère pas à un classeur mais à une feuille (et pourtant ca fonctionne sans nommé la feuille lorsque le seul classeur concerné est ouvert)
    Alors, est-ce que je nage en pleine science-fiction ou y'a t'il une solution ?

    et si tu memorise aussi ta feuille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    dim wb as workbook
    dim ws as worksheet
    dim rg as range
    set wb = workbooks("nom classeur")
    set ws = wb.worksheets("nom feuil")
    set rg = wb.wb. ..............

  11. #11
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 94
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fred65200 Voir le message
    Tu peux écrire directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    thisworkbook.activate
    Cela ne va t'il pas prendre le classeur actif ?

    Citation Envoyé par patbou Voir le message
    et si tu memorise aussi ta feuille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    dim wb as workbook
    dim ws as worksheet
    dim rg as range
    set wb = workbooks("nom classeur")
    set ws = wb.worksheets("nom feuil")
    set rg = wb.wb. ..............
    non, l'inconvénient c'est que j'ai pas mal de range nommés et je me vois pas trop mémorisé la feuille qui correspond à chacun des range...

  12. #12
    Membre émérite
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Par défaut
    bonjour à tous

    ThisWorkbook (touche F1)
    Cette propriété renvoie un objet Workbook qui représente le classeur dans lequel s'exécute le code de la macro active. Propriété en lecture seule.

    Donc ThisWorkbook.Activate active le classeur où est écrite la macro.
    ----------------------------
    As tu essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ThisWorkbook.Names("macellule").RefersToRange.Value
    @+

  13. #13
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 94
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fred65200 Voir le message
    bonjour à tous

    ThisWorkbook (touche F1)
    Cette propriété renvoie un objet Workbook qui représente le classeur dans lequel s'exécute le code de la macro active. Propriété en lecture seule.

    Donc ThisWorkbook.Activate active le classeur où est écrite la macro.
    effectivement ca va m'éviter la déclaration de variable public.
    Citation Envoyé par fred65200 Voir le message
    As tu essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ThisWorkbook.Names("macellule").RefersToRange.Value
    @+
    Non, effectivement.

    Ca me renvoi le nom du classeur actif, mais je vois pas ce que je peux en faire pour mes range puisqu'ils ne se réfèrent pas au classeur mais à une feuille ??

  14. #14
    Membre émérite
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Par défaut
    bonsoir alexsolex, le fil
    il est surprenant que tu obtiennes le nom du classeur actif avec le code que je t'ai donné.
    Teste le fichier joint, normalement, tu devrais lire le contenu de la cellule A1
    en utilisant la ligne de code donnée hier; que le classeur qui contient la cellule nommée "maCellule" soit actif ou non.

    tiens nous au courant.

    cordialement
    Fichiers attachés Fichiers attachés

  15. #15
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 94
    Billets dans le blog
    1
    Par défaut
    Merci de ton intéret pour mon problème.

    Alors je tiens à te présenter mes plus plates excuses ! Je suis un boulet j'essaye de l'admettre.

    Ton exemple fonctionne parfaitement !

    En fait, hier, le test que j'ai fait, j'ai pris un range nommé qui contenait le nom de mon classeur donc forcément j'obtenais le nom du classeur mais pas parce que ca me renvoyait le nom du classeur mais parce que ca me renvoyait le contenu de la cellule qui elle contenait le nom du classeur...

    Bref ta solution me semble parfaite !

    Si je comprend bien :
    ThisWorkbook.Names("macellule").RefersToRange
    est équivalent à :
    range("macellule")

    en mieux puisqu'il se réferrera toujours à ThisWorkbook qui est le classeur depuis lequel est lancé la macro

    Je test ca tout de suite et je vous tient au courant

  16. #16
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 94
    Billets dans le blog
    1
    Par défaut solution parfaite, résumé
    bon ben voilà cela fonctionne, Merci bien Fred

    Alors je résume (je vais tenté de le faire) :
    Si vous avez besoin de faire référence à une cellule nommée de votre classeur d'où est exécuté la macro, et que vous voulez être sur de récupérer la cellule nommée même si un autre classeur est ouvert et actif, alors utiliser la commande suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ThisWorkbook.Names("macellule").RefersToRange.Value
    elle équivaut à la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    range("macellule").value
    à la différence qu'elle fait systématiquement référence au classeur "père" de la macro

    Si on décortique :
    ThisWorkbook : renvoi le classeur d'où est lancé la macro
    Names("macellule") : renvoi l'objet dont le texte "macellule" est le nom
    RefersToRange : renvoi un objet range de l'objet Name

    Merci pour tout

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Appeler une fois de plus une fonction() sur un temps donné
    Par Tendhor57 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/01/2013, 09h58
  2. Copier tout le contenu d'une BD MYSQL sur un autre PC
    Par condor_01 dans le forum Outils
    Réponses: 4
    Dernier message: 06/09/2006, 23h53
  3. Réponses: 3
    Dernier message: 20/06/2006, 07h06
  4. [VBA-E] Modifier le contenu d'un range sans boucle
    Par MatMeuh dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 25/04/2006, 11h19
  5. Réponses: 5
    Dernier message: 07/03/2006, 12h09

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