Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
Bonjour
Peut-être un trou ? , mais ou faut-il placer une fonction qui peut être appelée de n'importe ou dans le programme
depuis USF, macro de feuille , module ...etc
Y at-il précaution a prendre au début : comme DECLARE PUBLIC .... ou autre ?
Car , je fais appel a une fonction qui se trouve dans une feuille et la Sub est dans la meme feuille : la C Ok
Puis , Je rappelle cette fonction depuis INitialize d'un USF ... et ca ne va plus ?
Merci
Bonjour
les fonctions doivent être placées dans un module ordinaire, surtout pas un module de feuille.
A part ça rien de particulier. Elle peut être pivée ou public.
Tu l'appelles par son petit nom depuis une autre macro ou depuis la feuille
function moncalcul()
...
end function
A1=moncalcul(B2)
ou mavariable=moncalcul(monautrevariable)
Si tu la mets dans ton personal.xlsb ou perso.xls suivant les versions, il faut l'appeler en ajoutant le nom du classeur perso devant.
Le Pb , c'est que cette fonction fait réference a des parametres précis , qui ne sont pas les memes a chaque fois qu'on l'appelle : plage , feuille ....
Function GetDerLigneTexte() As Long
Dim plg As Range
On Error Resume Next
Set plg = Range("b16:b1000").SpecialCells(xlCellTypeFormulas, xlTextValues) ' VALABLE ICI Pour Colonne B
If Not plg Is Nothing Then ' Changer si recherche dans autre colonne
With plg.Areas(plg.Areas.Count)
GetDerLigneTexte = .Cells(.Cells.Count).Row
Re,
@Misange : je place des fonctions dans les worksheets. et ça marche.... c'est vrai que je ne les appelle pas depuis excel mais uniquement depuis vba...
l'exemple joint te montre comment utiliser une fonction (deux en fait !) depuis une feuille ou depuis une autre macro.
Si tu déplaces les deux fonctions qui sont dans le module 1 dans le module de la feuille 1 tu verras que les fonctions ne marchent plus...
Dejà , faudrait savoir s'il est possible d'adapter en paramètre la plage :
Set plg = Range("b16:b1000"). ......
si maintenant dans le nouvel appel c'est C10:C1000 ??
et restera peut être aussi la reconnaisance de la feuille car c'est .cells(,,,) et non worksheets( xxxx).cells
si tu te places dans la colonne à traiter, tu peux utiliser activecell.column pour identifier ta plage de ligne 10 à 1000 en utilisant
range(cells(10,activecell.column),cells(1000,activecell.column))
ceci si c'est toujours de 10 à 1000
sinon, on peut utiliser selection() qui traitera alors sur les cellules selectionnées
regarde l'exemple que je t'ai fait !
tu passes une plage en paramètre à ta fonction
dans mon exemple simplissime, tu passes la plage et la fonction fait la somme de ta plage mais ç peut être autre chose.
Que fait ta fonction sur cette plage ?
si tu nous en donnais le code ?
Misange : oui j'ai vu ton exemple , mais tout est dans le même module , et tu passes une variable simple
Ma fonction ( voir code plus haut) elle , se trouve aussi dans la même feuille que la SUB ou je l'appelle et là ca va
par exemple elle me retourne : ligne 16
MAIS maintenant je l'appelle depuis une SUB INITIALIZE d'un USF et là ca colle plus !! c'est pour la MEME colonne et la MEME feuille
donc comme rien a changé elle devrait aussi me retourner : ligne 16 , mais déjà elle ne s'execute pas ?? erreur
Si tu nous mettais ton classeur en expliquant exactement ce que tu veux faire ce serait plus simple.
Les fonctions marchent très bien lorsqu'on les appelle depuis un userform initialize, il n'y a aucun pb conceptuel sur ce point, ton problème vient d'ailleurs je pense. Mais encore faudrait-il qu'on puisse comprendre et tester...
Bon je joins le classeur , mais juste pour les connaisseurs, car il est encore en construction et a besoin de SON (.wav) que vous n'aurez pas > donc erreur a l'exec du Pg
Sinon aller dans le code de l'USF : MAJ_date > Sub initialize
En mode DEBOGAGE , pas a pas , executer la Sub , vous aurez l'errreur : Sub Ou fonction non définie
Cette fonction GetDerLigneTexte se trouve dans la feuille "formation par personne" , ou elle marche bien
Mais là elle est appelée depuis l'USF ... et ca plante
Amusez vous bien
C'est votre fonction qui est mal définie
une fonction doit recevoir un argument et le traiter
ici votre fonction ne fait... rien
vous lui demandez de chercher la dernière ligne mais sans lui indiquer la plage ou rechercher. elle ne peut rien faire. Ce n'est pas une histoire de savoir ou placer la fonction, ni d'où l'appeler.
C'est comme si vous disiez
function monaddition()
A=range(A1)
B=1=range(B1)
monaddition=A+B
end function
elle ne fonctionnera que pour additionner A1 et B1 mais rien d'autre, quel que soit l'endroit d'ou vous l'appelez.
Function monaddition (A ans range, B as range)
indique que vous devez fournir 2 range à cette fonction pour qu'elle en fasse quelque chose et retourne un résultat
depuis une feuille on l'appelle en indiquant par exemple en C1=monaddition(A1,B1)
depuis un userform on l'appelle aussi en lui passant deux paramètres range.
Code:
Function GetDerLigneTexte() As Long
' cette fonction permet de detecter la Dernière REELLE ligne non-vide car lorsque l'on met
' une cellule avec "=B$6" par exemple et quil ny a rien alors on a 0
' donc ici on ne tient pas compte de cela ; exemple si 50 lignes avec un "=..." et que
' 10 ont une REELLE valeur , la fonction retournera 10 et non 50 comme avec la commande
' End(XLUp) cela raccourci bien les boucles au lieu de tourner dans le vide
Dim plg As Range
On Error Resume Next
Set plg = Range("b16:b1000").SpecialCells(xlCellTypeFormulas, xlTextValues) ' VALABLE ICI Pour Colonne B
If Not plg Is Nothing Then ' Changer si recherche dans autre colonne
With plg.Areas(plg.Areas.Count)
GetDerLigneTexte = .Cells(.Cells.Count).Row
End With
End If
End Function
ici vous imposez que la fonction traite la plage B6:B100 alors qu'il faut passer la plage en paramètre.
Cela dit, au lieu de faire appel à cette fonction, je ferai directement le calcul de la ligne cherchée dans le userform.
Une petite chose : il vaut mieux éviter de mettre on error resume next sauf si on sait exactement quel type d'erreur peut intervenir et pourquoi c'est attendu qu'elle se produise, surtout dans une formule où à priori on sait ce qu'on lui envoie comme données à traiter.
Misange
Cette fonction marche depuis longtemps , elle permet de rechercher la dernière ligne d'une colonne qui contient des formules car si la cellule est vide , elle contient quand meme ZERO , chose que le XLEnd tient compte et donc fausse le resultat car si mes formules vont de B10 a B100 et qu'il n'y a des données que jusque 16 , XLEnd me renvoie 100
Tandis que la fonction me renvoie bien 16 !
Pourtant dans les Sub de la feuille "formation par personne" , elle me renvoie bien la valeur que j'attend !!!!!
Là pour avancer les choses , j'ai recopié la fonction dans le Bloc de l'USF et ca a l'air de fonctionner , mais je voulais éviter les redondances
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD