débutant - Créer nouvelle fonction

pdemaret

XLDnaute Nouveau
Bonjour

Avis aux connaisseurs avant d'aller plus loin :
Je qualifie ma connaissance excell de moyenne (par rapport aux balaises qu'il y a ici), par contre celle des macro et VB est nulle.
Je suis programmeur de formation donc ca ira vite, mais je ne sais pas comment m'y prendre pour commencer une macro, comment les appeller, etc ...
Merci de bien vouloir m'aider

J'ai justement un cas très pratique qui va me permettre d'être plongé dans le sujet.

Dans un de mes tableaux j'utilise une formule classique (ensemble de fonctions) un grand nombre de fois. Cette formule est longue à écrire.
Souvent les cellules possèdent un SI où la fameuse formule se retrouve à la fois dans le 'then' et dans le 'else' (avec des param différents)
Bref ca devient très dur à éditer.

Voici un exemple idéal pour créer une fonction spécifique qui reprendrait la formule et qui rendrait un résultat.
Je dois donc utiliser je suppose une macro ou un développement VB.

Mes questions :
  • Comment commencer le développement de cette fonction ?
  • Y a t'il un canevas standard de procédure VB dans lequel on écrit le code ?
  • Comment appeler cette fonction ?
  • Comment passer des arguments ?
  • Comment recevoir le résultat ? les résultats ?
  • Y a t'il des classes à définir ?
  • Gestion des erreurs ?

Si vous avez un tutorial où tout cela serait expliqué ce serait parfait.

J'espère ne pas trop en demander, mais je suis vraiment coincer.

Merci d'avance
 

JNP

XLDnaute Barbatruc
Re : débutant - Créer nouvelle fonction

Bonjour PDemaret :),
Si tu es programmeur de formation, rien que l'aide de VBA avec une recherche sur "Function" te donneras tout ce qu'il faut pour la réaliser.
Un résumé de la syntaxe pour te lancer :
Code:
[COLOR=red]Function[/COLOR] [COLOR=seagreen]MaFonction[/COLOR]([COLOR=blue]I As Integer[/COLOR]) [COLOR=purple]As String[/COLOR]
[COLOR=seagreen]MaFonction[/COLOR] = I [COLOR=darkorange]&[/COLOR] " au carré = " & I * I
[COLOR=red]End Function[/COLOR]
Déclaration de la fonction.
Nom de la fonction. Le résultat est renvoyé par l'égalité.
I est une variable déclarée comme Entier qui est passée à la fonction.
As String déclare que le retour sera une chaine de caractère.
& permet de concaténer le texte.
Je pense qu'avec ça et l'aide VBA, tu as tout ce qui faut ;).
Bon courage :cool:
Ajout : Salut Gilbert
 
Dernière édition:

pdemaret

XLDnaute Nouveau
Re : débutant - Créer nouvelle fonction

J'ai commencé et comme prévu je ne rencontre pas trop de problème avec VBA

Mais j'ai été confronté par un value error que j'ai isolé.
Pourquoi la fonction
Function brol() As Single
brol = arrondi.sup(14.56, 1)
End Function


que j'appelle ainsi
=brol()

Me donne l'erreur #VALEUR!

Merci de me renseigner
 

Pierrot93

XLDnaute Barbatruc
Re : débutant - Créer nouvelle fonction

Bonjour à tous,

essaye peut être comme ceci :
Code:
Function brol(c As Range) As Single
    brol = WorksheetFunction.RoundUp(c, 1)
End Function

mais vois pas trop, pourquoi créer une fonction qui appelerait une fonction native d'Excel... A voir...

bon après midi
@+
 

MJ13

XLDnaute Barbatruc
Re : débutant - Créer nouvelle fonction

Bonjour Pdemaret, Gilbert, Jean-Noël, Pierrot

Comme je suis plus lent que Pierrot (et j'ai pas copié :eek:).

Voici ce que j'ai trouvé:

Code:
Function brol(valeur)
brol = WorksheetFunction.RoundUp(valeur, 1)
End Function

Il est vrai que VBA est en anglais donc cela ne pouvait pas fonctionner et les formules sont en général en français.

Eh-Eh Pierrot :):p:D.
 
Dernière édition:

JNP

XLDnaute Barbatruc
Re : débutant - Créer nouvelle fonction

Re :),
J'avais pourtant bien indiqué comment passer l'argument à la fonction :p...
Pour le problème des fonctions de feuille en anglais, un petit truc pour notre ami : lancer l'enregistreur de macro, saisir la formule en français dans la feuille, valider, arrêter l'enregistreur de macro et regarder la traduction en VBA.
Ensuite, WorksheetFunction. est fortement conseillé ;).
Bonne fin de journée :cool:
 

Staple1600

XLDnaute Barbatruc
Re : débutant - Créer nouvelle fonction

Bonsoir à tous


Je partage le même avis que Pierrot93
mais vois pas trop, pourquoi créer une fonction qui appelerait une fonction native d'Excel... A voir...
:confused::confused:

EDITION: histoire de me joindre aux camarades (et pour le fun)
Code:
Function brol(c As Range, No_chiffres As Integer) As Single
    brol = WorksheetFunction.RoundUp(c, No_chiffres)
End Function
Code:
Sub test()
Dim i%
    [a1] = 14.56
    For i = -2 To 2
        Select Case i
        Case -2, -1, 0 To 2
        MsgBox brol([a1], i)
    End Select
Next i
End Sub
 
Dernière édition:

MJ13

XLDnaute Barbatruc
Re : débutant - Créer nouvelle fonction

Re , Jean-Noël, JM

Je partage le même avis que Pierrot93

Citation:
mais vois pas trop, pourquoi créer une fonction qui appelerait une fonction native d'Excel... A voir...

Je pense que c'est plus pour comprendre le fonctionnement d'une fonction (quelque fois, il faut partir de codes simples pour faire des applis très complexes ;)).
 

Staple1600

XLDnaute Barbatruc
Re : débutant - Créer nouvelle fonction

Re, bonjour MJ13

Une fonction VBA personnalisée créé pour un besoin spécifique
OK je comprends

Une fonction VBA qui récrée une fonction native d'Excel,
je comprends moins.

Mais puisque on parle apprentissage de VBA
alors je ressors le duo magique pour pdemaret:
ALT+F11 puis F1

et la lecture de ces rubriques
Function, instruction, exemple
Utilisation des fonctions de feuille de calcul Microsoft Excel dans Visual Basic

Function, instruction, exemple
Cet exemple utilise l'instruction Function pour déclarer le nom, les arguments et le code qui constituent le corps d'une procédure Function. Le dernier exemple utilise des arguments Optional initialisés et nommés explicitement.
Et voici le premier exemple qu'on y trouve
Code:
' Cette fonction définie par l'utilisateur renvoie la
' racine carrée de l'argument qui lui est transmis.
Function CalculateSquareRoot(NumberArg As Double) As Double
    If NumberArg < 0 Then    ' Évalue l'argument.
        Exit Function    ' Quitte pour revenir à la
                            ' procédure appelante.
    Else
        ' Renvoie la racine carrée.
        CalculateSquareRoot = Sqr(NumberArg)
    End If
End Function
 

pdemaret

XLDnaute Nouveau
Re : débutant - Créer nouvelle fonction

Je vous remercie pour vos réactions intéressantes.
Il est vrai certains ont parlé trop vite :rolleyes:

Dans ma question je disais "Mais j'ai été confronté par un value error que j'ai isolé." --> du coup mon exemple.

Bien entendu que je ne comptais pas écrire une fonction qui appelle une fonction native telle quelle ... c'était pour montrer mon erreur :)
C'est pas grave Pierrot, merci quand même de m'avoir indiqué WorksheetFunction.


JNP, c'est pareil tu m'as bien montré et j'ai fait comme expliqué. Tout à marché jusqu'au moment où j'ai eu besoin de cette fonction. Bien sur que mes fonctions ont des arguments.
Merci pour le truc pour connaître le nom en anglais.


Staple, peux-tu m'expliquer ?
Sub test()
Dim i%
[a1] = 14.56
For i = -2 To 2
Select Case i
Case -2, -1, 0 To 2
MsgBox brol([a1], i)
End Select
Next i
End Sub

sub? --> sous-procédure ? appelée comment ?
Dim i% --> tableau ?
[a1] --> ? pourquoi entre []

Merci MJ13, enfin qqn qui me comprend.

Du temps où j'étais développeur (Sql Form, pl/sql, cobol, pascal et Php depuis peu quand il pleut le dimanche), j'avais pour principe de circonscrire une erreur incomprise dans un code simple.

Donc Staple non bien sur que je ne veux pas recréer une fonction native. J'ai fait cela pour isoler et analyser mon erreur.
Mais bien sur la fonction WorksheetFunction.RoundUp est utilisée dans un code plus complexe de calcul d'intérêt.

Merci à tous (vivement d'autres réactions)
 

Staple1600

XLDnaute Barbatruc
Re : débutant - Créer nouvelle fonction

Re

Alors voici des explications ;
sub? --> sous-procédure ? appelée comment ?
Dans VBA, une Sub est une procédure
Que l'on exécute en faisant à partir d'Excel
Outils/Macros/NomdelaSub -> Exécuter

Dim i% --> tableau ?
Ceci équivaut à:
Dim i As Integer
[a1] --> ? pourquoi entre []
[A1] est une écriture "raccourcie" de : Range("A1")
ou plus précisément : Evaluate(Range("A1")

Ainsi pour lancer la macro test
macro1.gif
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : débutant - Créer nouvelle fonction

Re

Pour t'expliquer la macro
Je vais utiliser l'aide d'Excel (la fameuse touche F1)

ARRONDI.SUP
Arrondit un nombre en s'éloignant de 0 (zéro).
Syntaxe
ARRONDI.SUP(nombre;no_chiffres)
nombre représente un nombre réel quelconque à arrondir en s'éloignant de zéro.
No_chiffres représente le nombre de chiffres à prendre en compte pour arrondir l'argument nombre.
Notes

  • La fonction ARRONDI.SUP est similaire à la fonction ARRONDI, excepté qu'elle arrondit toujours le nombre en s'éloignant de zéro.
  • Si l'argument no_chiffres est supérieur à 0 (zéro), le nombre est arrondi à la valeur immédiatement supérieure (ou inférieure pour les nombres négatifs) et comporte le nombre de décimales spécifié.
  • Si l'argument no_chiffres est égal à 0 ou omis, le nombre est arrondi au nombre entier immédiatement supérieur (ou inférieur si négatif).
  • Si l'argument no_chiffres est inférieur à 0, le nombre est arrondi à la valeur immédiatement supérieure (ou inférieure si négative) par incrémentations de 10, 100, etc... en fonction de la valeur de no_chiffres.
Exemples
ARRONDI.SUP(3,2;0) égale 4
ARRONDI.SUP(76,9;0) égale 77
ARRONDI.SUP(3,14159;3) égale 3,142
ARRONDI.SUP(-3,14159;1) égale -3,2
ARRONDI.SUP(31415,92654;-2) égale 31500

C'est en me basant sur ce que dit l'aide que j'ai créé la macro
dont voici la version avec commentaires
(et avec une syntaxe plus traditionnelle)
Code:
Sub test()
[COLOR=SeaGreen]'Déclarations de variable[/COLOR]
Dim i As Integer
[COLOR=SeaGreen]'Ici on donne une valeur à la cellule A1[/COLOR]
  Range("A1").Value = 14.56
[COLOR=SeaGreen]'Ici boucle sur différentes valeurs de No_Chiffre
'reprises dans les exemples de l'aide[/COLOR]
    For i = -2 To 2
        Select Case i
[COLOR=SeaGreen]'Pour ces valeurs de i[/COLOR]
        Case -2, -1, 0 To 2
[COLOR=SeaGreen]'Affichage de l'arrondi de la valeur de A1
'par l'intermédiaire de 
'la fonction vba personnalisée brol[/COLOR]
        MsgBox brol([a1], i)
    End Select
[COLOR=SeaGreen]'Fin du Select Case[/COLOR]
Next i
End Sub
 

JNP

XLDnaute Barbatruc
Re : débutant - Créer nouvelle fonction

Re :),
sub? --> sous-procédure ? appelée comment ?
Pour complêter le cours de Jean-Marie ;), différentes procédures d'appel et de passage d'arguments :
Code:
[COLOR=blue]Public[/COLOR] Message [COLOR=blue]As String[/COLOR]
 
[COLOR=blue]Sub[/COLOR] Main()
Message = "Coucou Test1"
Run "Test1"
[COLOR=blue]Call[/COLOR] Test1
Test1
Run "Test2", "Coucou Test2"
[COLOR=blue]Call[/COLOR] Test2("Coucou Test2 bis")
Test2 ("Coucou Test2 ter")
Test3 ("Coucou Test3")
[COLOR=blue]End Sub[/COLOR]
 
[COLOR=blue]Sub[/COLOR] Test1()
MsgBox Message
[COLOR=blue]End Sub[/COLOR]
 
[COLOR=blue]Sub[/COLOR] Test2(Msg [COLOR=blue]As String[/COLOR])
MsgBox Msg
[COLOR=blue]End Sub[/COLOR]
 
[COLOR=blue]Function[/COLOR] Test3(Msg [COLOR=blue]As String[/COLOR]) [COLOR=blue]As String[/COLOR]
MsgBox Msg
[COLOR=blue]End Function[/COLOR]
Public permet de déclarer la variable pour tout le classeur. Dans un seul module, Dim avant les procédures suffirait :rolleyes:. Du coup, je passe l'argument en Test1 sans l'expliciter.
Tu remarqueras que la syntaxe est différente entre Run (nom de la macro entre doubles cotes) et Call qui utilise directement le nom de la macro. Call est optionnel (mais conseillé pour la lisibilité du code), et peut aussi appeler une fonction.
Lance la sub Main, et tu verras que toutes ces syntaxes fonctionnent :p.
Bon WE :cool:
 

Discussions similaires

Réponses
6
Affichages
230
Réponses
16
Affichages
613

Statistiques des forums

Discussions
312 198
Messages
2 086 110
Membres
103 121
dernier inscrit
SophieS