Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/09/2011, 12h42   #1
Invité de passage
 
Homme
Divers
Inscription : 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 : 4
Points : 4
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 :
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
Thebeginner est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 12h57   #2
Membre éclairé
 
Avatar de tototiti2008
 
Inscription : octobre 2008
Messages : 327
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 327
Points : 320
Points : 320
Bonjour TheBeginner,

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

Code :
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 :
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
__________________
tototiti2008 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 13h15   #3
Invité de passage
 
Homme
Divers
Inscription : 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 : 4
Points : 4
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 :
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 :
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...
Thebeginner est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 13h42   #4
Membre éclairé
 
Avatar de tototiti2008
 
Inscription : octobre 2008
Messages : 327
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 327
Points : 320
Points : 320
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...
__________________
tototiti2008 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 14h05   #5
Invité de passage
 
Homme
Divers
Inscription : 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 : 4
Points : 4
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
Thebeginner est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 17h11   #6
Membre éclairé
 
Avatar de tototiti2008
 
Inscription : octobre 2008
Messages : 327
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 327
Points : 320
Points : 320
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 :
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
__________________
tototiti2008 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2011, 14h49   #7
Invité de passage
 
Homme
Divers
Inscription : 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 : 4
Points : 4
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.
Thebeginner est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h19.


 
 
 
 
Partenaires

Hébergement Web