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 :

Comportement Fonction avec Application.volatile [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    DSI
    Inscrit en
    Mars 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : DSI

    Informations forums :
    Inscription : Mars 2009
    Messages : 102
    Par défaut Comportement Fonction avec Application.volatile
    Bonjour,

    Soit un fichier Tester_Fonction.xlsm vierge.

    Dans Feuil1, je dispose d’un tableau (LISTOBJECT) nommé SEMAINE
    De A1 à A8 - - > Num_Jour ,1, 2, 3, 4, 5, 6, 7
    De B1 à B8 - - > Jour, Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi, Dimanche
    A1 et B1 sont les titres.

    J’ai créé une fonction utilisateur qui ramène le nom du jour en fonction du N° de jour passé en paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Function Jsem(Jour) As String
        On Error Resume Next
        Jsem = Application.WorksheetFunction.VLookup(Jour, Range("Semaine"), 2, False)
    End Function
    En G5, je saisis donc : =jsem(5) et c’est bien VENDREDI qui s’affiche.

    Si je modifie B6 (qui contient Vendredi) en saisissant Friday par exemple, rien en se passe. G5 reste à Vendredi. F9 et Maj+F9 n’ont aucun effet.

    J’ai googleisé mon soucis et j’ai trouvé la solution : Application.volatile.

    Je modifie ma fonction en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Function Jsem(Jour) As String
        Application.volatile
        On Error Resume Next
        Jsem = Application.WorksheetFunction.VLookup(Jour, Range("Semaine"), 2, False)
    End Function
    Le comportement de la fonction est OK. Quand je change une valeur dans mon tableau SEMAINE, le contenu de G5 est bien modifié. Je suis content.

    Là où ça pose problème, c’est quand, mon fichier tester_fonction étant ouvert, je crée par exemple un autre tableau (Fichier-Nouveau-Nouveau Classeur) et que j’en modifie une cellule.

    Quand je reviens sur TESTER_FONCTION, G5 est vide. Pour ré afficher, je dois faire F9.

    Le comportement est identique si j'ouvre un classeur déjà enregistré.

    Pouvez-vous m’aider à résoudre ce soucis ?

    Merci d'avance.

  2. #2
    Membre très actif Avatar de Nako_lito
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2008
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 793
    Par défaut
    tu utilise des références relatives, il faut que utilise des références absolues pour appeler tes classeurs, feuilles ou cellules

    par exemple, activeworkbook dépend de quel classeur est actif, si tu travaille sur plusieur fichiers en meme temps, ça peu etre très problématique

    A la place, il faut utiliser "thisworkbook" qui ciblera le classeur depuis lequel le code est appelé.

    Il en est de meme avec les range.
    Si tu appele la range "A1" par exemple, il va prendre celle qu'il a sur le classeur en cours d'utilisation sur la feuille en cours d'utilisation

    alors que si tu mets "thisworkbook.sheet(1).range ("A1"), il ne fera pas "d'erreur" de référencement.

  3. #3
    Expert éminent
    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
    Par défaut


    Bonjour.

    Citation Envoyé par Nako_lito Voir le message
    Il en est de meme avec les range.
    Si tu appele la range "A1" par exemple, il va prendre celle qu'il a sur le classeur en cours d'utilisation sur la feuille en cours d'utilisation
    Oui sauf si le code est situé dans le module d'une feuille de calculs : dans ce cas,
    ce n'est plus la feuille active par défaut mais la feuille de calculs dans laquelle se trouve le code,
    même si un autre classeur est actif …

  4. #4
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 564
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 564
    Par défaut
    Bonjour

    Si Nako-Lito et Marc_L ont raison, je pense que le problème vient de Range("Semaine") associé à la fonction VLOOKUP.


    Pas idéal pour une fonction personnalisée : il serait plus logique de gérer les 7 jours dans le code de la fonction que de se référer à une plage du classeur.

    Sinon préciser Thisworkbook.Range("Semaine") devrait améliorer mais sans garantie.

  5. #5
    Membre très actif Avatar de Nako_lito
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2008
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 793
    Par défaut
    exact,

    si il veut utiliser thisworkbook.range("semaine"), il doit s'assurer qu'elle existe avant de l'appeler, sinon excel va lui péter à la face

  6. #6
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 564
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 564
    Par défaut
    Re
    Citation Envoyé par Nako_lito Voir le message
    exact,

    si il veut utiliser thisworkbook.range("semaine"), il doit s'assurer qu'elle existe avant de l'appeler, sinon excel va lui péter à la face
    Oubli de ma part il faut préciser la feuille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThisWorkbook.Worksheets("NomFeuille").range("semaine")
    Le but, sauf erreur de ma part n'est pas d'appliquer la fonction à d'autre classeurs mais d'éviter la perte du résultat et thisworkbook limite au classeur qui contient le code ce qui est bien la question...

  7. #7
    Membre très actif Avatar de Nako_lito
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2008
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 793
    Par défaut
    tu peux aussi retrouver le classeur voulu avec :

    workbooks("leNomDeMonClasseur").sheets(1).Range("A1")

    ou

    workbooks(variable).sheets(x).Range(maRange)

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

Discussions similaires

  1. Problème avec Application.Volatile
    Par d0n32 dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 19/06/2018, 11h06
  2. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  3. Fonction avec comportement spécial
    Par philippe.pasquali dans le forum Requêtes
    Réponses: 0
    Dernier message: 14/10/2009, 16h15
  4. Comportement fonctions imbriquées avec appel à Xmlhttprequest
    Par eirmag dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 04/05/2006, 16h10
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39

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