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 :

Garder la valeur de application.caller d'une fonction à l'autre


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Divers
    Inscrit en
    Septembre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Divers

    Informations forums :
    Inscription : Septembre 2011
    Messages : 16
    Points : 12
    Points
    12
    Par défaut Garder la valeur de application.caller d'une fonction à l'autre
    Bonjour,

    Je débute avec les macros et j'ai créé une série de fonction. La fonction ci-dessous me permet de connaitre la hauteur d'une ligne donnée dans un classeur donné. La fonction fonctionne parfaitement, mais j'ai un certain nombre de fonction de ce type et pour toutes, je recopie le

    x =...

    feuille = ....

    N' y a-t-il pas moyen de mettre cela dans une autre macro qui serait appelée pour chaque fonction?

    En espérant avoir été clair (premier message sur le forum) et en vous remerciant grandement pour votre aide.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    function hauteurCor(numero)
    'renvoie la hauteur d'une ligne donnée
    'il faut donner le numéro de la ligne... 1 2 ou 48
     
    Application.Volatile
     
     
     
    x = Application.Caller.Parent.Name
    classeur = Range(x & "!D1")
     
     
    feuille = WorksheetFunction.Max(Range("A20:A" & Application.Caller.Row))
     
    hauteurCor = Workbooks(classeur).Worksheets(feuille).Rows((numero)).RowHeight
     
    End Function

  2. #2
    Membre expérimenté
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 747
    Points : 1 332
    Points
    1 332
    Par défaut
    Bonjour TheBeginner,

    Je dois avouer que je ne comprends pas à quoi servent les lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    classeur = Range(x & "!D1")
     
     
    feuille = WorksheetFunction.Max(Range("A20:A" & Application.Caller.Row))
    dans ta fonction...
    Je suppose Qu'en D1 tu mets le nom du classeur, et qu'en colonne A il y a une gestion du numéro de la feuille (pas très claire pour moi)...
    Ce que tu veux, c'est la hauteur de la ligne n° numero de la feuille où tu écris la fonction ?

    peut-être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function hauteurCor(numero)
    Dim Feuil As String, Clas As String
     
    Application.Volatile
    Feuil = Application.Caller.Parent.Name
    Clas = Application.Caller.Parent.Parent.Name
    hauteurCor = Workbooks(Clas).Worksheets(Feuil).Rows((numero)).RowHeight
     
    End Function

  3. #3
    Membre à l'essai
    Homme Profil pro
    Divers
    Inscrit en
    Septembre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Divers

    Informations forums :
    Inscription : Septembre 2011
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Bonjour Tototiti2008,

    Merci d'avoir tenté une réponse, j'avoue que la question n'était peut être pas tout à fait claire.

    Oui en D1 je mets le nom du classeur.

    Oui en colonne A il y a une gestion du no de feuille.

    Mon problème est de devoir les réécrire pour chaque fonction que je crée... La j'ai donné la hauteur de ligne, mais j'en ai une pour la largeur de colonne, savoir si la ligne est masquée etc....

    Est-il possible de créer une autre sub comme par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    sub test
     
    feuille = WorksheetFunction.Max(Range("A20:A" & Application.Caller.Row))
     
    hauteurCor = Workbooks(classeur).Worksheets(feuille).Rows((numero)).RowHeight
     
    adresse= Workbooks(classeur).Worksheets(feuille)
     
    end sub
    et la fonction deviendrait qqch comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    function hauteurCor(numero)
     
    call test
     
    hauteurCor = adresse.Rows((numero)).RowHeight
     
     
    End Function

    J'espère que c'est plus claire, je débute vraiment, pas évident de me faire comprendre un grand merci à vous. Mais il y a déjà du progrès j'arrive à faire apparaitre le code correctement...

  4. #4
    Membre expérimenté
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 747
    Points : 1 332
    Points
    1 332
    Par défaut
    Re,

    Oui, dans le principe c'est possible, mais comme je ne sais pas où tu veux utiliser ces fonctions, ni ta gestion des numéros de feuilles, j'ai un peu du mal à te donner une version toute faite...

  5. #5
    Membre à l'essai
    Homme Profil pro
    Divers
    Inscrit en
    Septembre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Divers

    Informations forums :
    Inscription : Septembre 2011
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Re bonjour

    La fonction proposée fonctionne. C'est pour la "séparer en deux" que je peine

    Dans la cellule D1 il y a le nom du fichier exemple.xls

    dans la colonne A il y a les numéros de feuille (chaque no n'apparait qu'une fois) et par ordre chronologique. en utilisant la fonction max par rapport à la ligne ou est tapée la fonction j'obtiens la bonne feuille (cela fonctionne)

    Ce qui est important est la ligne dans laquelle est tapée la fonction d'ou le application.caller.row qui permet ensuite de trouver le no de feuille.

    Est-ce possible de séparer cette fonction en deux éléments?

    Merci beaucoup

  6. #6
    Membre expérimenté
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 747
    Points : 1 332
    Points
    1 332
    Par défaut
    Re,

    Ah, il y a un truc auquel je n'avais pas pensé : tout ce qui fait appel à "Application.Caller" ne sera reconnu que dans la fonction, donc ça tu ne pourras pas le sortir (à moins de passer l'objet correspondant à ta Sub qui définit tes variables communes, ce qui fait un aller-retour pas forcément idéal)

    Pour la "séparation", je peux te proposer un truc comme ça, mais je ne suis pas sûr que ce soit plus simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub DefinitVar(ByVal Ligne As Long, ByVal NomFeuil As String, ByRef NumFeuil As Long, ByRef NomClasseur As String)
       NumFeuil = WorksheetFunction.Max(Sheets(NomFeuil).Range("A20:A" & Ligne))
       NomClasseur = Range("'" & NomFeuil & "'!D1").Value
    End Sub
     
    Function hauteurCor(numero)
    'renvoie la hauteur d'une ligne donnée
    'il faut donner le numéro de la ligne... 1 2 ou 48
    Dim NumFeuil As Long, NomFeuil As String, NomClasseur As String
        Application.Volatile
        Call DefinitVar(Application.Caller.Row, Application.Caller.Parent.Name, NumFeuil, NomClasseur)
        hauteurCor = Workbooks(NomClasseur).Worksheets(NumFeuil).Rows(numero).RowHeight
    End Function

  7. #7
    Membre à l'essai
    Homme Profil pro
    Divers
    Inscrit en
    Septembre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Divers

    Informations forums :
    Inscription : Septembre 2011
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Un grand merci à toi tototiti2008 pour avoir planché sur mon problème. J'aurais du voir que c'était le Application caller qui posait problème.

    Comme tu l'as bien dit, la solution proposée n'est pas forcément plus simple, je vais rester avec mes 2 lignes identiques dans chaque fonction.

    Bonne continuation.

    B.

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

Discussions similaires

  1. garder les valeurs d'un array pour une pagination
    Par berti dans le forum Langage
    Réponses: 4
    Dernier message: 08/07/2008, 19h04
  2. Réponses: 6
    Dernier message: 21/06/2007, 15h59
  3. [VB.net]Gérer un Application.Exit() dans une fonction
    Par arnolem dans le forum Windows Forms
    Réponses: 1
    Dernier message: 24/05/2006, 14h03
  4. Réponses: 4
    Dernier message: 19/05/2006, 10h26
  5. Valeur d'e variable d'une fct dans autre fonction
    Par Torpedox dans le forum Langage
    Réponses: 3
    Dernier message: 11/11/2005, 08h48

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