[Excel 2003] Création d'un fonction sous VBA [Résolu/Fermé]

Signaler
Messages postés
41
Date d'inscription
jeudi 26 juillet 2012
Statut
Membre
Dernière intervention
20 février 2018
-
Messages postés
41
Date d'inscription
jeudi 26 juillet 2012
Statut
Membre
Dernière intervention
20 février 2018
-
Bonjour,

Je voudrai créer une fonction sous VBA capable de faire le calcul de trois taux. Pour cela j'ai déclaré des variables, mais lorsque je veux faire coincider les valeurs des variables d'entrées à des valeurs contenues dans des textbox cela plante. Pouvez-vous m'aider à corriger mon code?

Voici le code:

Sub calcultrs()

    'Déclaration des variables
    Dim Tpt As Integer
    Dim Tpr As Integer
    Dim Pr As Single
    Dim Ct As Single
    Dim Td As Single
    Dim Tp As Single
    Dim Trs As Single
    
    'Valeurs des variables d'entrées
    Tpt = txt_tpt.Value
    Tpr = txt_tpr.Value
    Pr = txt_pr.Value
    Ct = txt_ct.Value
    
    'Calculs des trois taux en pourcentage
    Td = (Tpr / Tpt) * 100
    Tp = (((1 / Ct) * Pr) / Tpr) * 100
    Trs = Td * Tp * 100
    
    'Affichage des taux dans les textbox
    txt_td.Value = Td
    txt_tp.Value = Tp
    txt_trs.Value = Trs
    
End Sub


Merci d'avance
Cordialement

2 réponses

Messages postés
1823
Date d'inscription
vendredi 5 septembre 2008
Statut
Contributeur
Dernière intervention
24 avril 2020
578
bonjour,

Ce sont bien des textbox insérées directement dans une feuille et non pas dans un formulaire.

Dans ce cas il faut que la macro soit dans le code de la feuille et non pas dans un module à part.

A vérifier

A+
Messages postés
41
Date d'inscription
jeudi 26 juillet 2012
Statut
Membre
Dernière intervention
20 février 2018
1
Ce sont bien des textbox inclus dans un formulaire. En fait sur mon userform je vient renseigner les textbox (txt_tpt, txt_tpr, txt_pr, txt_ct), ensuite j'ai un bouton calcul ou je viens cliquer et qui me lance la fonction "calcultrs" si txt_tpt et txt_tpr sont supérieures à 0. Ensuite je veux que les résultats de mes calculs (td, tp, trs) soient visibles dans d'autre texbox (txt_td, txt_tp, txt_trs). J'espere avoir été clair.
J'ai testé en mettant: (txt_tpt)*1 et la meme chose pour les trois autres mais ca ne fonctionne toujours pas.... J'ai une erreur 6: Depassement de capacité sur la premiere ligne de calcul!
Messages postés
1823
Date d'inscription
vendredi 5 septembre 2008
Statut
Contributeur
Dernière intervention
24 avril 2020
578
alors là c'est différent.
C'est juste la déclaration qui n'est pas bonne.
Cela veut dire qu'il faut déclarer les variables As Double et non pas As Single


EDIT Pour Info :

Integer Entier jusqu'a 32 767
Long Entier jusqu'à 2 147 483 647
Single Réél jusqu'à 3,14 10puissance 38
Double Réél jusqu'à 1,8 10puissance 308


A tester
Messages postés
41
Date d'inscription
jeudi 26 juillet 2012
Statut
Membre
Dernière intervention
20 février 2018
1
Je viens de tester, ca ne marche pas...
En fait ce qui est bizarre c'est que le logiciel me dit que la premiere ligne de calcul est une division par zero : Td = (Tpr / Tpt) * 100
Alors que je met bien une valeur dans la txt_tpt et la txt_tpr aussi lors du test.
Messages postés
1823
Date d'inscription
vendredi 5 septembre 2008
Statut
Contributeur
Dernière intervention
24 avril 2020
578
Pour suivre l'idée de Michel (que je salue)

Essayer de remplacer la ligne en erreur par :
Tpt = CInt(txt_tpt.Value)

Au fait Il s'agit bien d'un entier qui est saisi dans txt_tpt ?
Messages postés
41
Date d'inscription
jeudi 26 juillet 2012
Statut
Membre
Dernière intervention
20 février 2018
1
Oui ce sont bien des entiers qui sont saisis. J'ai changé la ligne mais elle se met en erreur 424: objet requis..
Messages postés
41
Date d'inscription
jeudi 26 juillet 2012
Statut
Membre
Dernière intervention
20 février 2018
1
Merci de l'aide que vous me donnez !!

Mon code est a présent comme ce qui suit:

Avec un probleme de division par zero a la premiere ligne de calcul mise en gras. Lors de mes test je rentre bien des valeur dans les textbox.




Sub calcultrs()

    'Déclaration des variables
    Dim Tpt As Double
    Dim Tpr As Double
    Dim Pr As Double
    Dim Ct As Double
    Dim Td As Double
    Dim Tp As Double
    Dim Trs As Double
    
    'Valeurs des variables d'entrées
   
    Tpt = (txt_tpt) * 1
    Tpr = (txt_tpr) * 1
    Pr = (txt_pr) * 1
    Ct = (txt_ct) * 1
    
   
   'Calculs des trois taux en pourcentage
   Td = (Tpr / Tpt) * 100
    Tp = (((1 / Ct) * Pr) / Tpr) * 100
    Trs = Td * Tp * 100
    

    'Affichage des taux dans les textbox
    txt_td.Value = Td
    txt_tp.Value = Tp
    txt_trs.Value = Trs
    
End Sub
Messages postés
1823
Date d'inscription
vendredi 5 septembre 2008
Statut
Contributeur
Dernière intervention
24 avril 2020
578
Je viens de regarder.

Apparemment on revient a ma première réponse.
En fait la macro est dans un module à part. c'est un problème de portée de variables.

Il faut transporter la macro calcultrs dans le code de l'Userform.

Ou bien préfixer les champs par le nom de l'Userform comme ceci :
Tpt = UserForm1.txt_tpt
Tpr = UserForm1.txt_tpr
Pr = UserForm1.txt_pr
Ct = UserForm1.txt_ct



A tester
Messages postés
16175
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
13 août 2020
3 001
Modifs à apporter à tes code

dans l'usf
Private Sub calcul_Click()  
If txt_tpt.Value <= 0 Then MsgBox ("la valeur du temps de production théorique doit être supérieure à 0")  
If txt_tpr.Value <= 0 Then MsgBox ("la valeur du temps de production réelle doit être supérieure à 0")  
If txt_tpt.Value > 0 And txt_tpr.Value > 0 Then  
     tpt = (txt_tpt) * 1  
    Tpr = (txt_tpr) * 1  
    Pr = (txt_pr) * 1  
    Ct = (txt_ct) * 1  
     calcultrs  
End If

dans le module standard

Public tpt As integer 
    Public Tpr As integer 
    Public Pr As integer 
    Public Ct As integer 

Sub calcultrs()  
    'Déclaration des variables  
    Dim Td As Double  
    Dim Tp As Double  
    Dim Trs As Double 
....etc
Messages postés
16175
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
13 août 2020
3 001
Je n'avais pas testé jusqu'au bout

tu passes Td, Tp, Trs en variables publiques
et

dans
If txt_tpt.Value > 0 And txt_tpr.Value > 0 Then
tpt = (txt_tpt) * 1
Tpr = (txt_tpr) * 1
Pr = (txt_pr) * 1
Ct = (txt_ct) * 1
calcultrs
txt_td.Text = Td
txt_tp.Text = Tp
txt_trs.Text = Trs


End If
Messages postés
16175
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
13 août 2020
3 001
Excuses moi, Pilas, je n'avais pas rafraichi !

mais il est vrai qu'on peut se poser la question de l'utilité de cette appelée mais...
Messages postés
41
Date d'inscription
jeudi 26 juillet 2012
Statut
Membre
Dernière intervention
20 février 2018
1
Ca marche très bien maintenant!!! Merci beaucoup à vous!! :)