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

  1. #1
    Membre du Club
    Formule qui fait référence à une fonction dans un autre classeur
    Bonjour à tous,

    J'ai un classeur nommé "AutreClasseur.xlsm" avec une fonction nommée Age(DateNaissance).

    J'ai un autre classeur nommé "Procédure et Fonctions.xlsm".
    Je cherche à entrer une formule dans la cellule E2 de la feuille "Fonctions" qui calcule l'âge par rapport à la date de naissance renseignée en A1 de cette même feuille.

    La formule que j'emploie est:

    =AutreClasseur!Age(A1)

    Mais cela me renvoie une erreur #Valeur

    Quelqu'un peut-il m'aider SVP.

  2. #2
    Expert éminent sénior
    Déjà, le "!" est utilisé pour désigner un onglet et non un classeur.

    Normalement, si les deux classeurs sont ouverts, tu peux utiliser la fonction sans autres ajout.

    Si tu veux utiliser une fonction se trouvant dans un classeur fermé, je ne suis pas sûr que ce soit possible.
    Si ça l'est (ce qui n'est pas sûr), ça doit être une grosse galère à faire. Je te conseille donc plutôt de te simplifier la vie en copiant ta fonction personnalisée dans le classeur qui l'utilise.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  3. #3
    Membre expérimenté
    On ne voit bien ce que vous voulez faire; ça rappelle la fonction "Indirect", mais voici un exemple pour s'en inspirer:

  4. #4
    Responsable
    Office & Excel

    Salut

    Il faut ajouter le nom du classeur (et il faut qu'il soit ouvert).



    On comprend vite que cela limite les possibilités. Si l'on transfère un classeur, il faut également transférer le classeur qui contient la fonction et bien tenir compte du fait qu'il soit ouvert sinon BOUM lors du recalcul. Habituellement, on place ces fonctions dans le perso.xlsb, qui est ouvert par défaut à l'ouverture d'Excel.


    @Boulser

    [EDIT] il manque l'extension du fichier dans ta formule (voir mon illustration) [/EDIT]

    Pour calculer l'âge, il n'y a pas besoin d'une fonction perso. Tu peux utiliser la fonction DATEDIF(Debut;Fin;"y") (attention, fonction non documentée dans Excel, et qui pose problème pour des intervalles complexes)

    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Membre du Club
    Si la Fonction "Age(DateNaissance" est dans le même classeur, la formule

    =Age(A1)

    fonctionne à merveille. Normalement, une fonction est disponible dans d'autre classeur, me semble-t-il. Je cherche donc à l'employer pour ne pas devoir toujours la recopier. Si possible bien entendu.

  6. #6
    Membre du Club
    En fait, je cherche une formule qui peut faire appel à n'importe quelle fonction VBA qui se trouve dans un autre fichier excel sans devoir la recopier à chaque fois.

  7. #7
    Responsable
    Office & Excel

    J'ai édité mon post...

    =NomClasseur.extension!NomFonction(...)
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    Membre expérimenté
    @Pierre: si tu veux connaître l'âge de façon précise en années, mois et jours, je doute que DATEDIF("y";Debut;Fin) soit d'une grande aide !

    @Boulser: voir l'indication de Pierre "on place ces fonctions dans le perso.xlsb"

  9. #9
    Responsable
    Office & Excel

    Citation Envoyé par Zekraoui_Jakani Voir le message
    [...]je doute que DATEDIF("y";Debut;Fin) soit d'une grande aide ![...]



    Mais je n'ai vu nulle part que la demande initiale parlait d'exprimer l'âge en Année/mois/jours ^^


    Voir cette fiche de Microsoft pour certains problèmes rencontrés avec DateDif
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  10. #10
    Expert confirmé
    Bonjour le fil,

    Pour obtenir l'age (fractionnaire) on peut aussi utiliser FRACTION.ANNEE() :
    =FRACTION.ANNEE(Date_de_naissance;AUJOURDHUI())
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  11. #11
    Responsable
    Office & Excel

    Citation Envoyé par Patrice740 Voir le message
    [...]
    Chouette, vous avez 52,938... ans...

    Cela dit, attention au troisième paramètre, car c'est un peu déroutant

    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  12. #12
    Membre du Club
    OK, merci.
    Ma formule :

    Code formule :Sélectionner tout -Visualiser dans une fenêtre à part
    =AutreClasseur!Age(A1)


    est bonne.

    Maintenant, si le classeur "AutreClasseur" est ouvert, je n'ai plus d'erreur.
    Si ce classeur est fermé, l'erreur est #Nom#.

  13. #13
    Expert éminent sénior
    Citation Envoyé par Pierre Fauconnier Voir le message
    Il faut ajouter le nom du classeur (et il faut qu'il soit ouvert).
    Citation Envoyé par boulser Voir le message
    Ma formule : =AutreClasseur!Age(A1) est bonne.
    J'ai un classeur XLAM qui stocke des fonctions personnalisées et qui s'ouvre automatiquement quand j'ouvre Excel.
    Je n'ai pas besoin d'indiquer le nom du classeur source quand j'utilise ces fonctions.
    Elles apparaissent même dans l'autocompletion quand je tape les premiers caractères de cette formule.

    A mon avis, si le classeur contenant la macro est ouvert, la formule =Age(A1) devrait fonctionner dans n'importe quel autre classeur.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  14. #14
    Responsable
    Office & Excel

    Salut Menhir,


    Le demandeur parle d'un xslm dans sa demande initiale. Pour utiliser une fonction d'un xlsm, il faut qu'il soit ouvert et il faut préfixer la fonction du nom du classeur avec son extension.

    J'ai un classeur xslm avec une fonction perso dedans. Pour l'utiliser dans un autre classeur, je dois ouvrir le classeur qui contient la fonction et la préfixer du nom du classeur et je n'ai pas l'autocomplétion...
    Je n'ai pas l'autocomplétion dans ce classeur.

    La fonction dans son classeur avec l'autocomplétion





    La fonction dans un autre classeur xlsm: pas d'autocomplétion et l'obligation de préfixer







    Toi, tu parles d'un xlam, probablement stocké dans ton xlstart. C'est différent et dans ce cas, tu peux effectivement utiliser la fonction sans la préfixer. C'est aussi le cas si tu renseignes un xlAm dans les compléments Excel de ton classeur. Tu peux alors également utiliser la fonction sans la préfixer.


    Conclusions: il serait préférable de stocker les fonctions perso soit dans le xlsb, soit dans un xlAm. Cet xlAm pourrait être stocké dans le xlstart pour être ouvert dès l'ouverture d'Excel. Il pourrait aussi être stocké dans les Addins de l'utilisateur pour être référencé dans les compléments d'un classeur et pouvoir en utiliser les fonctions dans les préfixer. L'intérêt supplémentaire du xlam est qu'il est invisible pour l'utilisateur.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  15. #15
    Membre éprouvé
    Bonjour à tous,

    Bonne synthèse Pierre
    A laquelle j'ajouterais tout de même que si on envoie son classeur à quelqu'un n'ayant pas accès au XLSM, XLSB ou XLAM, la fonction ne marche plus, ce qui peut constituer une limite pour le moins gênante.

  16. #16
    Expert éminent sénior
    Citation Envoyé par Pierre Fauconnier Voir le message
    Le demandeur parle d'un xslm dans sa demande initiale. Pour utiliser une fonction d'un xlsm, il faut qu'il soit ouvert et il faut préfixer la fonction du nom du classeur avec son extension.
    Effectivement.
    Je pensais que les xlsm et xlam réagissaient de la même façon mais ce n'est pas le cas.
    Je viens de faire le test : avec un xlsm, la fonction n'est pas trouvée si on ne lui ajoute pas le nom de classeur alors qu'avec un xlam (enregistré au même endroit), elle est trouvée.

    On en apprend tous les jours.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  17. #17
    Responsable
    Office & Excel

    Citation Envoyé par Menhir Voir le message
    [...]

    On en apprend tous les jours.
    En effet. j'ai dû essayer quelques trucs pour arriver aux conclusions que j'ai exposées. C'est aussi un des intérêts du forum, ça nous oblige à chercher
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  18. #18
    Membre expérimenté
    Execution d'une procedure d'un classeur fermé
    Bonjour,
    La discussion est fermée, mais comme j'ai un certain gout pour le paradoxe et que les fêtes de fin d'année approchent, je vous demande d'être indulgents.

    En jouant peut-être un peu sur les mots il me semble que l'on peut exécuter une procédure d'un classeur fermé (en tout cas en ne l'ouvrant pas explicitement..)

    Comment : et bien par exemple en mettant en référence dans le classeur appelant (avec parcourir) le classeur appelé.
    Pour qu'Excel accepte pour référence le classeur appelé, il faut renommer VBAProject (dans l'exemple j'ai vite fait renommé les deux VBAProject mais en renommer un seul doit suffire)
    Comme beaucoup refusent d'ouvrir des classeurs les images ci-dessous devraient permettre à ceux qui seraient intéressés de tester.





    Les deux classeurs :

###raw>template_hook.ano_emploi###