Vous utilisez un navigateur obsolète. Il se peut que ce site ou d'autres sites Web ne s'affichent pas correctement. Vous devez le mettre à jour ou utiliser un navigateur alternatif.
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
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...).
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
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...
Super,Merci, pour les bouton option je vais m'en débrouiller
C'est génial mais il n'est pas impossible que je vous embête une nouvelle fois si je patine trop, lol!!!
je met résolu quand même
Bonne soirée à vous
Eric
1°on a des frames
2° on a 4 textbox par frame dont on en additionne les valeur de 3 d'entre eux puis on multiplie par la valeur du 4 eme le (coeff)
j'ai tout bon là ???????
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
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
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
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
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
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
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
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
'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
Ce site utilise des cookies pour personnaliser le contenu, adapter votre expérience et vous garder connecté si vous vous enregistrez.
En continuant à utiliser ce site, vous consentez à notre utilisation de cookies.