Microsoft 365 Calcul TEXTBOX dans Userform

eric72

XLDnaute Impliqué
Bonjour,
Je cherche à faire des calculs de Textbox dans un Userform en sachant qu'elles ne sont pas toujours toutes renseignées à chaque fois, malgré cela j'aimerais que le calcul se fasse quand même en tenant compte de celles renseignées, donc j'ai adapté ce code mais ça ne va pas.
Ou est la boulette?
Merci à tous
 

Pièces jointes

  • Gestion Fiche Produit test.xlsm
    204 KB · Affichages: 23

Robert

XLDnaute Barbatruc
Bonjour Éric, bonjour le forum,

CDbl(un contrôle vide) renvoie toujours une erreur !
Ton fichier modifié avec un Module de Classe qui permet de faire le calcul à chaque changement d'une valeur.
Utilise ce modèle en créant un module de classe pour chaque frame (celles qui en ont besoins en tous cas...).
 

Pièces jointes

  • Éric_ED_v01.xlsm
    138.2 KB · Affichages: 11

eric72

XLDnaute Impliqué
Bonjour Robert,
Tout d'abord merci pour la réponse, je me demande juste pour les autres frames ou comment faire car je ne vois rien dans le module de classe qui fait référence à la frame.
Dans le post2 il y a deux frame, pouvez-vous m'éclairer.
Merci beaucoup
Eric
 

Robert

XLDnaute Barbatruc
Re,

Les références se font par des tableaux à l'initialisation de l'Userform et le calcul dans la classe appropriée. Je propose un tableau et une classe par frame pour mieux structurer...

Ça donnerait à peu près le fichier ci-dessous. Mais tu as la variable ChbCoeffPlante non définie et ça provoque un bug. Tant qu'on ne touche pas aux boutons d'option, ça semble fonctionner.
Vérifie aussi le calcul du PRPlante dans le module de classe TB2Class...
 

Pièces jointes

  • Éric_ED_v02.xlsm
    141 KB · Affichages: 9

patricktoulon

XLDnaute Barbatruc
re
alors pour commencer
1°vous allez mettre un tag sur les 3 textbox a additionner dans les frames ca peut etre simplement une lettre
2° dans le coeff mettez un tag différent mais le meme dans chaque coeff de chaque frame

exemple:
dans chaque frames je met "X" dans les 3 textbox et "Y" dans le coeff de chaque frames

c'est simple jusque là non?
allez faite ça et je continu je suis sur que déja là ca vous parle
 

eric72

XLDnaute Impliqué
Bonjour,
Patrick, les calculs ne sont pas toujours les mêmes, de plus toutes les textbox ne sont pas toujours remplies.
En essai j'ai commencé à dupliquer la méthode de "Robert" qui fonctionne sauf pour les "PLAQUES" là ca bug.
Le calcul est (coeffplaque * prixplaque)/ nbplanteplaque.
Mais s'il y a une autre méthode je suis tout ouie!!!
Merci beaucoup
Eric
 

Pièces jointes

  • Gestion Fiche Produit test.xlsm
    384.3 KB · Affichages: 0

eric72

XLDnaute Impliqué
re
alors pour commencer
1°vous allez mettre un tag sur les 3 textbox a additionner dans les frames ca peut etre simplement une lettre
2° dans le coeff mettez un tag différent mais le meme dans chaque coeff de chaque frame

exemple:
dans chaque frames je met "X" dans les 3 textbox et "Y" dans le coeff de chaque frames

c'est simple jusque là non?
allez faite ça et je continu je suis sur que déja là ca vous parle

Patrick Bonjour,
Voilà ce que j'ai fait suite aux conseils de Robert, mais il y des soucis.
Par exemple dans "Pot" quand je clique pour changer le coeff, le calcul ne se refait pas.
Dans "Plaque ça bug aussi"
Pour l'instant j'ai fait "Conditionnement", là ça marche
"Plante", ça marche
"Pot" et "Plaque" ne fonctionne pas
Merci 1000 fois
Eric
 

Pièces jointes

  • Gestion Fiche Produit test.xlsm
    383 KB · Affichages: 3

patricktoulon

XLDnaute Barbatruc
re
non mais serieux combien de module classe tu va faire
désolé pour Robert je veux heurter personne mais ça n'est absolument pas le bon chemin
a quoi ça sert de faire une classe si on est obligé d'en coder 50 autant le faire avec les events d'origine

je fait une démo
je prends un userform je lui met X frames avec 4 textboxs chacune ici je vais en mettre 12
dans le tag de ces 4 textbox je met "X" a ceux qui vont etre additionnés et "y" acelui qui est le multiplicateur

pour la demo j'ai coloré les bouton le vert correspondrait a ton prixcdt et le rose au ceff
donc les verts et les blanc auront "x" dans leur tags et le rose aura "y"

c'est simple ça a faire




1635405295634.png


maintenant le code dans le userform
VB:
Dim cls As New la_classe_a_toto
Private Sub UserForm_Activate()
cls.init_le_bourin Me
End Sub
no comment tellement c'est simple ;)

maintenant la classe
je l'ai nommé "la_classe_a_toto"
et pour le coup je gère le keypress aussi dans la classe
la fonction init va classer les 48 textboxs dans leur instance
dans chaque instance je subclasse 4 object textbox (variable "les4"
donc chaque textbox reconnaîtra ses 3 frères dans l'events unique pour 48 textboxs
je gère aussi le keypress des 48 textboxs dans un keypress unique

dans l'event j'affiche dans un textbox les données et fait le calcul c'est juste pour te montrer
(toi tu fera bien ce que tu voudra dedans)
voila on y est


VB:
Option Explicit
Public WithEvents txtB As MSForms.TextBox
Dim mesclasses() As New la_classe_a_toto
Public les4
Public UsF As Object
Public mamanFram
Function init_le_bourin(uf)
    Dim a&, e&, txt, mestextB(1 To 4), ctr As Object, z&, Fram
    For Each Fram In uf.Controls
        e = 0
        If TypeName(Fram) = "Frame" Then
            For Each txt In Fram.Controls
                If txt.Tag = "x" Or txt.Tag = "y" Then
                    a = a + 1: ReDim Preserve mesclasses(1 To a)
                    With mesclasses(a)
                        Set .txtB = txt:
                        Set .UsF = uf
                        Set .mamanFram = Fram
                        If txt.Tag = "x" Then e = e + 1: Set mestextB(e) = txt Else If txt.Tag = "y" Then Set mestextB(4) = txt
                        .les4 = mestextB
                    End With
                End If
            Next
            For z = a To a - 3 Step -1: mesclasses(z).les4 = mestextB: Next
        End If
    Next
End Function

'<<voila moins de 15 lignes et tout mes textboxs sont classés>>

'les 4 textbox freres sont bien distingués dans l'event
Private Sub TxtB_Change()    'le change c'est le meme pour tous
    Dim valeurs(1 To 4) As Double
    If les4(1).Value <> "" Then valeurs(1) = CDbl(les4(1))
    If les4(2).Value <> "" Then valeurs(2) = CDbl(les4(2))
    If les4(3).Value <> "" Then valeurs(3) = CDbl(les4(3))
    If les4(4).Value <> "" Then valeurs(4) = CDbl(les4(4))

    'juste pour le visuel
    UsF.visuel = mamanFram.Name & vbCrLf & les4(1).Name & " :" & valeurs(1) & vbCrLf & les4(2).Name & " :" & valeurs(2) & vbCrLf & _
    les4(3).Name & " :" & valeurs(3) & vbCrLf & les4(4).Name & " :" & valeurs(4) & vbCrLf & _
    "                     resultat :" & (valeurs(1) + valeurs(2) + valeurs(3)) * valeurs(4)
End Sub

'et tant qu'a faire on gere le keypress aussi dans la classe et on vire tout les keypress de l'userform hop hop hop !!!
Private Sub TxtB_KeyPress(ByVal keyascii As MSForms.ReturnInteger)
'le vrai code ET  au complet !!!!!! de patricktoulon
    Dim ctrl As Object
    Set ctrl = UsF.ActiveControl: Do While TypeName(ctrl) <> "TextBox": Set ctrl = ctrl.ActiveControl: Loop
    With ctrl
        If keyascii = 46 Then keyascii = 44
        If Chr(keyascii) Like "[!0-9|,-]" Then keyascii = 0
        If (Len(.Value) = 0 Or .Value Like "*,*") And Chr(keyascii) = "," Then keyascii = 0
        If Chr(keyascii) = "-" And .Value <> "" Then keyascii = 0
    End With
End Sub

allez c'est parti regarde bien le textbox d'en bas
demo.gif


comme tu peux le voir je n'ai meme pas besoins de connaitre leur nom tout est commander par le tag (x ou y) rigolo non ?

Alors quoi les calculs ne sont pas les mêmes dans tes frames
et ben tu n'a qu'a mettre un select case dans l'event et en fonction du mamafram.name tu fait un calcul

voila ça c'est une classe control ;)

allez pour que vous puissiez travailler dessus ou vous en inspirer ,je vous donne l'exemple
 

Pièces jointes

  • exemple classe textbox and subclassing .xlsm
    30.7 KB · Affichages: 5

eric72

XLDnaute Impliqué
Re Patrick,
Alors comment dire, toi tu dis que c'est simple mais tu es THE EXPERT pour les apprentis comme moi c'est beaucoup moins clair, dois je comprendre que lorsqu'on doit diviser il faut mettre un autre tag "Z" par exemple?
Je ne sais pas si je vais m'en sortir avec mon tableau car dans chaque frame les calculs sont différents!!!
Je regarde ça et je tente de l'adapter.
Merciiiiiii
 

ChTi160

XLDnaute Barbatruc
Bonjour eric
Bonjour le Fil, Patrick
Patrick en forme des le matin ,tu as tellement l'habitude de magnier ces contrôles et autres classes que tu en oublies les nons initiés Lol
eric va devoir relire et relire ce que tu as écrit pour comprendre le principe !
Mais je sais que tu seras là pour l'aider à assimiler .
Merci Patrick
Moi même je vais m'y mettre Lol
Au plaisir de te lire
bonne journée
Jean marie
 

patricktoulon

XLDnaute Barbatruc
re
tes calculs sont différent ok ben c'est simple
VB:
'les 4 textbox freres sont bien distingués dans l'event
Private Sub TxtB_Change()    'le change c'est le meme pour tous
    Dim valeurs(1 To 4) As Double
    If les4(1).Value <> "" Then valeurs(1) = CDbl(les4(1)) Else valeurs(1) = 0
    If les4(2).Value <> "" Then valeurs(2) = CDbl(les4(2)) Else valeurs(1) = 0
    If les4(3).Value <> "" Then valeurs(3) = CDbl(les4(3)) Else valeurs(1) = 0
    If les4(4).Value <> "" Then valeurs(4) = CDbl(les4(4)) Else valeurs(1) = 0

    Select Case mamanFram.Name 'selon le nom de la frame parent

    Case "josette"
        'je fait un calcul ici
    Case "yollande"
        'je fait un autre calcul ici

    Case "roberta"
        'je fait encore un autre calcul ici

        'etc..etc...
        'et TOUT !!!!!!!!!!!!!!!!les calcus se font avec valeurs(1) ,valeurs(2),valeurs(3) ,valeurs(4)

    End Select
End Sub

là si tu t'en sort pas c'est que ton projet n'est pas clair dans ta tete
et en plus c'est simple le valeurs(4) tu sais que d'office il correspond au textbox rose dans mon exemple
 

Discussions similaires

Réponses
62
Affichages
3 K