[Déplacé .NET -> VBA]Multiplication de textbox et format €

Signaler
Messages postés
18
Date d'inscription
dimanche 27 mars 2011
Statut
Membre
Dernière intervention
24 novembre 2011
-
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-
Merci pour ta réponse satisfaisante ucfoutu! Avec 2, 3 adaptations, çà fonctionne.
Maintenant, si je peux abuser de ta générosité, je rencontre un autre souci pour continuer mon programme:
je souhaite donc inscrire automatiquement dans le label créé, le produit des 2 dernières textbox...
J'ai essayé ces 3 méthodes en vain:
(P.S.: j'ai renommé les textboxs pour les différencier, et le programme fonctionne toujours...)

1. label.caption = TxtboxQt.value * TxtboxPx.value
2. label.caption = val(Me.controls("NvDevisTXTQt" & i).value * Me.controls("NvDevisTXTPx" & i).value
3. J'ai essayé les même choses en mettant sous chaque paragraphe de création de textbox : txtbox = txtbox.value pour enregistrer la valeur

Parfois le programme inscrit "objet requis" à l'exécution, parfois il ne bug pas mais rien ne se passe. Le calcul ne se fait pas.
Je souhaitais également que le label soit au format ## O.OO€ mais çà ne fonctionne pas non plus...

Pourtant, pour la première ligne, le code ci-dessous (copie du net) qui fonctionne à merveille met le label au format souhaité et fait le produit voulu :

Dim Arr(), A As Double
Arr = Array("Textbox1", "Textbox2", "Textbox3")
A = 1
For Each elt In Arr
If IsNumeric(Me.Controls(elt)) Then
A = A * CDbl(Me.Controls(elt))
End If
Next
Me.NvDevisTXTMontantHT = Format(A, "# ##0.00")

Bref, VBA fonctionne quand il veut j'ai l'impression !!!
En gros je dois encore :
- afficher la dernière textbox créée au format €
- multiplier le 2 dernières textbox crées et afficher le résultat dans le dernier label créé au format €

Merci à vous de prendre le temps d'aider les débutants.
J'essaierai de ne pas trop poster, sinon autant vous demander de créer la programme à ma place...

Salutations


[Me]

15 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Bonjour,

Bon. Ce que tu cherches à faire est tout simplement des "ersatz" de groupes de contrôles indexés, de sorte à créer un évènement concernant le groupe, savoir sur lequel intervient l'évènement, connaître le(s) contrôle(s) qui lui correspond(ent) (c'est à dire de même "index"/suffixe), de sorte à leur appliquer tes opérations.
Tu vas alors commencer, pas à pas ...
Pour y parvenir sans douleur, tu vas d'abord aller lire mon tout derbnier message, avec code, dans [sujet-DEPLACE-NET-GT-VBA-MULTIPLICATION-TEXTBOX-FORMAT_1544086.aspx.htm CETTE DISCUSSION]
Entraîne-toi ensuite avec un groupe seulement, puis deux ...
Le reste devrait "venir tout seul ensuite .
Reviens si encore difficultés malgré cette lecture et ces petits essais.
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Ah oui : tu avais aussi un problème de formatage dans un label.
Regarde :
Dim toto As Single
toto = 10.01
Label1.Caption = Replace(Format(toto, "0#.00 €"), ",", ".")

Mais ce point-là est vraiment secondaire. Traite d'abord le reste, beaucoup plus important.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18
Date d'inscription
dimanche 27 mars 2011
Statut
Membre
Dernière intervention
24 novembre 2011

Ok, visiblement je suis un peu trop ambitieux pour mes minces capacités...
Je n'es pas tout compris à ce que tu m'a écris, et suis bien curieux de découvrir ce que tu as a m'apprendre, mais ton lien est mort: 404 Not found !

Dans l'attente d'un lien opérationnel.

Salutations et merci pour l'attention.

[Me]
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Lien mort :
on ressaye donc ===>>
CE LIEN


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18
Date d'inscription
dimanche 27 mars 2011
Statut
Membre
Dernière intervention
24 novembre 2011

Salut,

Bon j'ai compris le principe des objets crées dynamiquement, est leur association d'événements automatique depuis un module de classe.
C'est effectivement exactement ce qu'il me faut.
Maintenant, j'ai essayé de refaire ton code inscrit sur le lien, mais à l'exécution sur mon ordi, vba ne m'affiche qu'un userform...désespérément vide...
Bien sûr, je ne doute de tes capacités à coder un programme, mais je ne doute pas non plus des miennes pour recopier un code mot à mot en vérifiant la compatibilité des noms etc (ce qui relève du programme de CM2)... Donc, si tu as une idée de se qui ne va pas ...fait moi signe.

Ensuite, j'ai quand même regardé ton code pour la mise en forme d'un label en €, je l'ai adapté au textbox en faisant ceci, est bien sûr, çà plante...
Dim toto As Single
toto = TxtBoxMontant.value '(dans mon cas, toto est une valeur inconnue tapée par l'utilisateur dans la textbox et non un nombre prédéfini comme tu l'avais proposé dans ton exemple, soit "10")
TxtBoxMontant.value = Replace(Format(toto, "0#.00 €"), ",", ".")

P.S.: j'ose espéré que tu auras un peu plus d'indulgence à mon égard, qu'a celui de ton interlocuteur dans la discussion jointe via ton lien... Le pauvre, il a en pris plein la gueule... bref, épargne moi !

[Me]
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Je ne vais pas te sermonner.
1) Dans le code du lien montré, j'ai complètement oublié (c'est de ma faute) un point important :
Il faut ajouter un module (insertion module) dans lequel mettre cette petite déclaration :
Public mestextboxes() As New Classe1

2) pour ce qui est de l'utilisation de Format dans ton cas, ton problème résulte du fait que tu pars d'un string (ta textbox) et non d'un numérique.
Il te faut alors adapter ===>>
dim toto as string
toto = TxtBoxMontant.Text 
TxtBoxMontant.Text = Replace(Format(Val(toto), "0#.00 €"), ",", ".")



Mais laisse stp tomber pour l'instant cet aspect secondaire. Focalise tes efforts (je sais nue c'est dur) sur le reste d'abord.



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18
Date d'inscription
dimanche 27 mars 2011
Statut
Membre
Dernière intervention
24 novembre 2011

Ha ok ! Je vois maintenant mieux pourquoi je ne comprenais pas ce paragraphe de code...
Donc, arrête moi si je me trompe, dans les grandes lignes:
Dans code userform:
1. Créer les controls en leur appliquant des noms de variable i,
2. Les mettre en mémoire (Redim preserve...)
Dans un module:
3. Assigner les controls en mémoire à un module de classe
Dans un module de classe:
4. Coder les événements à appliquer à ces controls.

Si cette procédure est justement décrite, est-elle l'unique à appliquer pour faire des "ersatz" de groupes de contrôles indexés ?

Je vais décortiquer tout çà est faire des essais.

Je reviens si pb. Donc, à bientôt.... !
[Me]
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Si cette procédure est justement décrite, est-elle l'unique à appliquer pour faire des "ersatz" de groupes de contrôles indexés ?

Unique ? je ne le crois pas. On pourrait en faire une presque identique avec une collection, mais avec le même principe (et donc aussi "lourde") , au fond.

Si, à la fois : le nombre de tes contrôles était plus petit et que tu ne les créais pas dynamiquement (par ajouts de "lignes de contrôles"), on pourrait envisager autre chose, mais non recommandable (car finalement encore plus lourd) dans le cas de figure que tu as décidé de mettre en oeuvre.

VBA n'est pas (hélas) VB6 (qui offre de vrais groupes de contrôles indexés, gérables avec la plus grande facilité et sans tout le "bastringue" que je t'ai décrit pour VBA). Il te faut donc "faire avec" !

Pour résumer :
Tu auras besoin :
- d'un module de classe pour CHAQUE groupe de contrôles ainsi "indexés"
- d'un seul module "normal" dans lequel tu pourras déclarer chacun des tableaux de contrôles
Rien ne t'empêchera par ailleurs (mais je te le montrerai au "deuxième pas") de mettre dans ce module "normal" les instructions relatives à la constitution des tableaux dynamiques de ces groupes (il te suffira alors, depuis le code de ton userform, de lancer la procédure de ce module qui fait la chose)

A l'étape où tu en es (avec l'exemple sur lequel tu travailles : celui du lien/exemple): ouvre le code du module de classe classe1 ===>> dans la colonne de gauche : choisis Buttongroup ===>> regarde dans celle de droite les évènements qui sont utilisables.
Cela devrait déclencher mille et une idées

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18
Date d'inscription
dimanche 27 mars 2011
Statut
Membre
Dernière intervention
24 novembre 2011

Bon, dans l'ensemble, je comprend ce que tu fais exécuter à ton code ligne par ligne.
Mais lorsque je me lance sur une page blanche pour un essai, aussi basique soit-il, je suis perdu... je ne sais par où commencer.
Me conseil-tu de la documentation à lire, des exemples à suivre, ou même de revoir mes ambitions à la baisse (ce qui ne vas pas dans le sens du progrès et qui est déplorable...) ?

P.S.: buttongroup : introuvable....
[Me]
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
P.S.: buttongroup : introuvable....

je ne comprends pas ce que tu veux dire par là. Où l'as-tu cherché ailleurs que dans mon exemple ? !
ou même de revoir mes ambitions à la baisse

Les ambitions ne doivent JAMAIS être revues à la baisse. La "barre", par contre, ne doit être "relevée" que peu à peu, pas à pas, en commençant par la hauteur que l'on passe à l'aise et en ne la relevant, dans les étapes suivantes, que lorsque l'étape précédente nous "colle" sans faille à la peau.
Me conseil-tu de la documentation à lire, des exemples à suivre

La seule documentation que je te conseille est sur ta machine (ton aide VBA. Je n'en utilise personnellement aucune autre).
Les exemples à suivre ? tu en as une floppée plus quinze sur ce site en ce qui concerne VBA. Mais n'hésite pas à regarder également ceux qui concernent VB6 (tu y trouveras fréquemment des choses intéressantes utilisables telles quelles en VBA).
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Si tu veux te donner plus de chances de comprendre à ce stade :
ouvre ton aide VBA sur "modules de classe"
Cela t'aidera beaucoup.
On commence par la toute première rubrique, claire :
Module contenant la définition d'une classe, notamment les définitions de ses propriétés et de ses méthodes.


"notamment" ne veut pas dire uniquement.
Regarde ensuite la toute première ligne du code de Classe1 dans l'exemple étudié :
Public WithEvents TextBoxEvents As MSForms.TextBox

Elle signifie que cette classe que nous avons nommée Classe1 traitera des évènements subis par les objets qu'elle concerne. Note bien que Classe1 n'est qu'un nom ! on aurait pu la nommer autrement, exemple "la_classe_définie_pour_mes_mestextboxes"
Quant à la ligne :
Public mestextboxes() As New Classe1

de déclaration faite dans un module standard :
elle a pour objet de définir que la classe utilisée pour gérer est la classe que nous avons nommée Classe1
De cette manière, le tableau dynamique d'objets mestextboxes() contient des contrôles (tes texboxes) dont les évènements seront gérés par la classe Classe1.
Prends cela calmement, en te disant à chaque instant que ce n'est pas de la sorcellerie, mais finalement quelque-chose d'assez simple et logique.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Ah vu !
Je comprends seulement maintenant ce que tu voulais dire par "buttongroup introuvable".
J'avais tout simplement encore la tête dans ce que j'avais écris au départ, oubliant que j'avais ensuite changé de nom pour une plus grande lisibilité.
Ce nom est devenu TextBoxEvents et c'est lui, que tu dois chercher dans la colonne de gauche du module de classe Classe1 ===>> et du azfficheras alors dans celle de droite tous les évcènements possibles pour tes textboxes.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18
Date d'inscription
dimanche 27 mars 2011
Statut
Membre
Dernière intervention
24 novembre 2011

Ok, je verrais çà après le boulot...
Pour le moment, j'essaie de bien cerner la méthode pour créer et utiliser les modules etc...
Merci


[Me]
Messages postés
18
Date d'inscription
dimanche 27 mars 2011
Statut
Membre
Dernière intervention
24 novembre 2011

Bonsoir Ucfoutu,

Bon, je suis arrivé à adapter ton code pour créer mes textboxs et label dans le module standard.
Maintenant, et malgré les 1000 exemples et tutoriels que j'ai pu lire sur le net, je ne trouve pas comment codé, dans le module de classe, un évènement sur ses controls puisqu'ils ont des noms variables...
Alors avec tout ce que j'ai lu, certains utilisent property Get, Let, d'autres utilisent la fonction évènements, d'autres pas, dans ton cas, et le seul que j'ai vu, tu utilises en plus des modules standard et de classe, le module "tout cours"....Sans parler des erreurs à gérer... Bref, où donner de la tête ?
Mon soucis est d'autant plus frustrant que je comprends le principe, mais je n'arrive pas à l'adapter à mon besoin...

Peut-tu me venir en aide que j'avance un peu ?
Si oui, as-tu besoin que je post mon programme ?

Te remerciant par avance

[Me]
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Je ne peux te venir en aide plus que je ne l'ai déjà fait !
Je ne vois par ailleurs vraiment pas ce que Property Get et Property Set pourraient avoir à faire avec la survenue d'évènements et leur exploitation !
Et la "fonction évènements" ne veut strictement rien dire ! Un évènement n'est ni une fonction, ni une méthode ! Un évènement est un EVENEMENT, point barre ! Il survient, on le constate ===>> on décide des instructions à exécuter lors de cette constatation. Dans la classe Classe1 de l'exemple que je t'ai montré, ce n'est pas toi, qui décide des évènements que peut subir le groupe de contrôles gérés par cette classe ! Ces évènements seront différents selon le type des contrôles du groupe concerné ! Et c'est VB seul qui, voyant de quel type de contrôles il s'agit, saura quels évènements ils peuvent subir ! Ce sont ces évènements (leurs procédures évènementielles) que VB te propose (dans mon exemple) SPONTANEMENT dans la colonne de gauche de ton IDE (relis-moi).
En d'autres termes plus clairs : tu ne parviendras à rien en continuant à "prospecter googoomachin", mais tu as une chance de parvenir à tout en y allant calmement, avec patience, mais, surtout, en comprenant ce que tu fais
Je ne peux manifestement pas t'aider plus sans que toi-même n'acceptes pas cette démarche fondamentale de l'esprit.
Désolé !
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient