[Excel 2003] Création d'un fonction sous VBA

Résolu
drizzt22 Messages postés 44 Statut Membre -  
drizzt22 Messages postés 44 Statut Membre -
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

  1. pilas31 Messages postés 1878 Statut Contributeur 648
     
    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+
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Bonjour à tous

      Un textbox renvoyant du texte comme son nom l'indique...
      il faut ecrire
      xxx=(Textbox1)*1

      il vaut mieux suivre le conseil de Pilas mais si tu tiens à rester dans un module standard:

      With sheets(1) 
           xxx = (.TextBox1) * 1 
           yyyy = (.TextBox2) * 1 
      End With. 


      Mais il serait peut-^tre prudent de vérifier que la saisie dans le textbox est bien un futur integer
      0
    2. drizzt22 Messages postés 44 Statut Membre 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!
      0
    3. pilas31 Messages postés 1878 Statut Contributeur 648
       
      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
      0
    4. drizzt22 Messages postés 44 Statut Membre 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.
      0
    5. pilas31 Messages postés 1878 Statut Contributeur 648
       
      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 ?
      0
  2. drizzt22 Messages postés 44 Statut Membre 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
    0
    1. pilas31 Messages postés 1878 Statut Contributeur 648
       
      Bon, il faut se rendre à l'évidence.

      Vu comme ça il n'y a aucune raison qu'il y ait une division par zéro si une valeur est bien saisie. Sauf si les texbox sont mal nommées (il y a inversion de nom entre txt_tp et txt_td par exemple.)

      Sinon il faut nous déposer le fichier dans www.cjoint.com (en enlevant les données confidentielles) et en postant un lien pour que nous puissions le télécharger.
      0
    2. pilas31 Messages postés 1878 Statut Contributeur 648
       
      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
      0
    3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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
      0
    4. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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
      0