Fonction perso pouvant prendre en argument une plage nommée

  • Initiateur de la discussion Initiateur de la discussion valenton
  • Date de début Date de début

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 !

V

valenton

Guest
Bonjour,

Je souhaite créer des fonctions personnalisées pouvant prendre comme argument soit directement une cellule, soit une plage nommée (comme les fonctions standard Excel finalement...). Par exemple faire une bête fonction MaFonction(x)=x.

J'ai essayé quelques trucs simples comme décalrer l'argument comme un range, en essayant de le passer comme un ParamArray, etc mais je ne trouve pas la solution. Est-ce que quelqu'un sait comment faire ça ?

Merci !
 
Re : Fonction perso pouvant prendre en argument une plage nommée

Bonjour à tous


Un exemple de fonction
Code:
Function mafonction(r As Range)
mafonction = r.Value * 2
End Function
Sub test()
[A1] = 5
[B1].Formula = mafonction(Range("A1"))
MsgBox mafonction(Range("A1"))
End Sub


mais comme le dit Paritec, un fichier exemple serait le bienvenu pour faire nos tests ailleurs que dans le vide 😉
 
Re : Fonction perso pouvant prendre en argument une plage nommée

OK pour cette proposition, j'ai essayé de la modifier pour qu'au lieu de renvoyer x(1) la fonction renvoie la valeur de MaPlage située sur la même ligne.
j'ai essayé quelques trucs mais je bute pour récupérer la ligne de la cellule. ActiveCell.Row ne convient pas puisque ce n'est pas la ligne de la cellule active qui m'intéresse mais la ligne de la cellule contenant la fonction...

J'ai rajouté une colonne avec ce que je cherche à reproduire d'après la fonction standard Excel cos.

Fichier mis à jour :
 

Pièces jointes

Re : Fonction perso pouvant prendre en argument une plage nommée

Re

Avec ceci, seules deux cellules renvoient #VALEUR
Code:
Function MaFonction(x As Range) As Double
Dim a&, b&
a = x.Value
b = x.Row
MaFonction = x(a - b + 1)
End Function

Et ceci affiche autre chose
Code:
Function MaFonction(x As Range) As Double
Dim a&, b&
a = x.Value: b = x.Row
MaFonction = x * (a - b + 1)
End Function

PS: Que dois exactement calculer ta fonction ? je dois être mal reveillécar j'ai du mal à saisir 😉
 
Dernière édition:
Re : Fonction perso pouvant prendre en argument une plage nommée

Je veux faire plusieurs fonctions qui vont calculer tout un tas de choses : formules mathématiques, formules trigo, ... sur le même principe que la colonne que j'ai rajoutée avec la fonction COS(), à partir d'une plage nomme pouvant contenir un peu tout et n'importe quoi (donc pas nécessaire des entiers, pas nécessairement triés, ... par contre des double à coup sur).

Avec la solution que tu propose je sens qu'on se rapproche. Il faut simplement arriver à ce que la variable a contienne le numéro de ligne de la cellule contenant la cellule.
 
Re : Fonction perso pouvant prendre en argument une plage nommée

pour pouvoir créer des fonctions complexes regroupant différentes fonctions natives (assemblage de fonctions trigo, de fonctions polynomiales, des log, des exp, etc...), puis pouvoir facilement donner ces fonctions utilisateurs à d'autres personnes qui pourront du coup les utiliser sans avoir à se casser la tête plutôt que de devoir re-rentrer tout le détail à la main.

exemple (volontairement simple) : je créé une fonction perso MaFonction(x)=cos(x)+3*sin(x)+x^1.5
je donne mon fichier à d'autres personnes, qui l'enregistrent comme macro complémentaire. elles peuvent alors utiliser directement MaFonction(x) plutôt que devoir rentrer à la main le détail.
 
Re : Fonction perso pouvant prendre en argument une plage nommée

Re


Par exemple ceci renvoie le même résultat que la formule en colonne D
(mais pas avec le nom de la plage de nommée)
Code:
Function vbaCOS(x As Range)
vbaCOS = Cos(CDbl(x.Value))
End Function

Peut-être qu'un exemple plus poussé, nous permettrai de faire des tests plus poussés.
 
Re : Fonction perso pouvant prendre en argument une plage nommée

Bonjour,

Je me suis basé sur votre exemple utilisant la fonction COS qui fonctionne tant que la formule est exprimée sur une même ligne que la plage nommée.
Essayez le code suivant
Code:
Function pmo(Plage As Range) As Double
Dim Ligne&
Dim var As Variant
'---
Ligne& = Application.Caller.Row
If Ligne& >= Plage.Row And Ligne& <= Plage.Row + Plage.Rows.Count - 1 Then
  var = Plage(Ligne& - Plage.Row + 1)
  If IsNumeric(var) Then
  
    pmo = var * 2 'mon calcul (par exemple : le double)
  
  End If
End If
End Function
 
Dernière édition:
Re : Fonction perso pouvant prendre en argument une plage nommée

Super ! c'est la partie Application.Caller qu'il me manquait.

Merci beaucoup PMO2 pour la solution, et merci également Staple1600 pour ton aide !
 
- 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
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

L
Réponses
3
Affichages
18 K
Laurent_67
L
D
Réponses
2
Affichages
1 K
D
P
Réponses
8
Affichages
4 K
patapock
P
N
Réponses
9
Affichages
2 K
nicopat
N
L
Réponses
0
Affichages
3 K
LiuXing
L
Réponses
4
Affichages
1 K
B
Réponses
13
Affichages
5 K
Bernard de Go Mars
B
Retour