[VBA]Bouton pour créer ligne de textbox [Résolu]

Messages postés
18
Date d'inscription
dimanche 27 mars 2011
Dernière intervention
24 novembre 2011
- 28 août 2011 à 23:04 - Dernière réponse :
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
- 30 août 2011 à 14:20
Bonjour,

Je créer sur VB un devis automatisé.
Dans un userform j'ai créé 3 textboxs les uns à côté des autres, le premier correspondant à la description de la prestation souhaitée, le deuxième à la quantité, le troisième au prix unitaire. Sur la même ligne viens ensuite un label correspondant au montant, soit le produit entre la quantité et le prix unitaire. Voir ci-dessous:

"Prestation 1 :" Quantité x Prix unitaire = Prix

J'ai essayé de créer en dessous de cette ligne un bouton qui permet de créer la ligne suivante, soit créer 3 textboxs + 1 label comprenant un code pour le calcul Quantité x Prix Unitaire.
(Au passage, le bouton d'ajout de ligne descend d'une ligne aussi...)
Une fois toutes les prestations remplies, on cliquerai sur un bouton "ok", et le calcul total ce fera tout seul en dessous de la dernière ligne.

Au bout d'une journée sans résultats, et malgré les recherches sur le net, je craque...
J'ai utilisé dans mon code les set"..."= control.Add(...), puis renseigné en dessus la position des textboxs, mais rien de satisfaisant.
Donc si vous avez une idée pour coder cela, je suis preneur...

Je précise que souhaitant imprimer ce USF via bouton sur feuille A4, le nombre d'ajout de lignes sera donc limité à 10.

Merci d'avance pour votre aide précieuse.
Comme il y 6 mois pour ma première programmation.
[Me]
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
- 30 août 2011 à 10:50
3
Merci
Tiens (tout à la fois) :

Private Sub BoutonAjouterLigne_Click()
 'ajoute une ligne de calcul en dessous de la precédente
 Dim Txtbox As Control, label As Control
 Static i As Integer, mahauteur As Integer, mamarge As Integer
 mahauteur = 18
 mamarge = 6
 BoutonAjouterLigne.Top = BoutonAjouterLigne.Top + mahauteur + marge
 MONTOP = BoutonAjouterLigne.Top - mamarge
 Set Txtbox = Controls.Add("Forms.TextBox.1", "TXTNvDevisPrest" & i, True)
 Txtbox.Tag = "TXTNvDevisPrest" & i
 Txtbox.Left = mamarge
 Txtbox.Top = MONTOP - mahauteur
 Txtbox.Width = 186
 Txtbox.Height = 18
 Txtbox.Visible = True

 Set Txtbox = Controls.Add("Forms.TextBox.1", "NvDevisTXTQt" & i, True)
 Txtbox.Tag = "NvDevisTXTQt" & i
 Txtbox.Left = Me.Controls("TXTNvDevisPrest" & i).Left + Me.Controls("TXTNvDevisPrest" & i).Width + mamarge
 Txtbox.Top = MONTOP - mahauteur
 Txtbox.Width = 30
 Txtbox.Height = mahauteur
 Txtbox.Visible = True

 Set Txtbox = Controls.Add("Forms.TextBox.1", "NvDevisTXTPx" & i, True)
 Txtbox.Tag = "NvDevisTXTPx" & i
 Txtbox.Left = Me.Controls("NvDevisTXTQt" & i).Left + Me.Controls("NvDevisTXTQt" & i).Width + mamarge
 Txtbox.Top = MONTOP - mahauteur
 Txtbox.Width = 54
 Txtbox.Height = mahauteur

 Set label = Controls.Add("Forms.Label.1", "NvDevisTXTMontantHT" & i, True)
 label.Tag = "NvDevisTXTMontantHT" & i
 label.Left = Me.Controls("NvDevisTXTPx" & i).Left + Me.Controls("NvDevisTXTPx" & i).Width + mamarge
 label.Top = MONTOP - mahauteur
 label.Width = 48
 label.Height = mahauteur
 label.Caption = "OK"
 label.Visible = True
 i = i + 1
End Sub


Par cette méthode :
- non seulement tu peux placer ton bouton où tu le soiuhaites (le "tir" sera réglé)
- mais tes contrôles auront un "suffixe" (ton i) de 0, 1,2, .... sur chaque ligne (sur chaque ligne, ils auront le même "suffixe")
Voilà
_________________
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

Merci ucfoutu 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de ucfoutu
Messages postés
14299
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
16 novembre 2018
- 28 août 2011 à 23:47
0
Merci
Bonjour,

Peux-tu montrer les codes que tu as essayés.
Tu es en VB6 ou VBA (Excel, Word, ...) ?
Et les contrôles indexés avec un Load (VB6 seulement) ?

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Commenter la réponse de NHenry
Messages postés
18
Date d'inscription
dimanche 27 mars 2011
Dernière intervention
24 novembre 2011
- 29 août 2011 à 12:35
0
Merci
Bonjour NHenry,

D'abord merci de vous penchez sur ma question !
Je boss en VBA excel 2007.

Ci-dessous le bout de code qui me pose problème: (récup. et adaptation d'un code trouvé sur le net)

Private Sub BoutonAjouterLigne_Click()
'ajoute une ligne de calcul en dessous de la precédente
Dim Txtbox As Control
Dim i, a As Integer

i = Me.Controls.Count - 31 'cette méthode compte à priori le nombre de controls du USF, ce n'est à mon sens pas l'idéal...
a = i * 20

Set Txtbox = Controls.Add("Forms.TextBox.1", "TXTNvDevisPrest" & i, True)
Txtbox.Tag = "TXTNvDevisPrest" & i
Txtbox.Left = 6
Txtbox.Top = 460 + a
Txtbox.Width = 186
Txtbox.Height = 18

Set Txtbox = Controls.Add("Forms.TextBox.1", "NvDevisTXTQt" & i, True)
Txtbox.Tag = "NvDevisTXTQt" & i
Txtbox.Left = 240
Txtbox.Top = 460 + a
Txtbox.Width = 30
Txtbox.Height = 18

Set Txtbox = Controls.Add("Forms.TextBox.1", "NvDevisTXTPx" & i, True)
Txtbox.Tag = "NvDevisTXTPx" & i
Txtbox.Left = 348
Txtbox.Top = 460 + a
Txtbox.Width = 54
Txtbox.Height = 18

Set Label = Controls.Add("Forms.Label.1", "NvDevisTXTMontantHT" & i, True)
Label.Tag = "NvDevisTXTMontantHT" & i
Label.Left = 492
Label.Top = 460 + a
Label.Width = 48
Label.Height = 18
Label.Caption = "OK"

BoutonAjouterLigne.Top = 480 + a

End Sub

Voilà, en espérant que vous arriviez à m'aider

Salutations

[Me]
Commenter la réponse de Ocin2
Messages postés
94
Date d'inscription
vendredi 13 mai 2005
Dernière intervention
30 octobre 2011
- 29 août 2011 à 22:53
0
Merci
Bonsoir Ocin2,

Le principal problème de ton code ne serait-il pas la valeur attribuée à la propriété Top de tes controles?

Vérifies bien que cette valeur ne se situe pas en dehors de ton USF. (valeur négative par exemple ou supérieure à la propriété Height de l'USF).

Cordialement.
Commenter la réponse de cs_GG72
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
- 30 août 2011 à 08:08
0
Merci
Bonjour,

tes concaténations avec i donnent à penser que tu veux faire une sorte de contrôles identifiables par leur dernier caractère (une espèce de "groupes").
Dans un tel cas, je te recommande de ne pas utiliser ta méthode de calcul de i, mais de procéder autrement, en utilisant astucieusement TypeOf et TypeName (à voir dans ton aide 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
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
- 30 août 2011 à 08:16
0
Merci
et Name, bien entendu


____________________
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
Commenter la réponse de ucfoutu
Messages postés
18
Date d'inscription
dimanche 27 mars 2011
Dernière intervention
24 novembre 2011
- 30 août 2011 à 08:58
0
Merci
Bonjour Messieurs,

ucfoutu : merci de votre coup d'œil et du conseil, je vais y cogiter...

GG72: En fait, vous avez en partie raison.
Le code fonctionne très bien pour créer la première ligne de textbox. En effet:
rappel : i = Me.Controls.Count - 31 (mon userform compte à ce stade 31 controls)
i = 31 - 31
a 0 * 20 0
Top 460 + 0 460 (460 étant la position de la première ligne déjà créée + 20 soit 440 + 20 = 460).
Donc, le code incrémente correctement la seconde ligne de textbox.
Le problème viens lorsque je veux créer les lignes suivantes : Avec la première ligne, j'ai créer 3 textboxs, mon Usf compte alors 31 + 3 = 34 controls, soit:
i 34 - 31 3
a 3 * 20 60
Top 460 + 60 250. C'est ici que mon code n'est pas convenable.
En fait, il me faudrait une suite qui incrémente de 20 en 20, et non de 20 * "x" textboxs crées.
C'est pour cela que je rejoins la réflexion de ucfoutu et penses que la technique du compte des controls n'est pas idéal...

[Me]
Commenter la réponse de Ocin2
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
- 30 août 2011 à 10:28
0
Merci
Je trouve que tu te compliques bien la vie, alors que tu as un ewxcellent point de répère (ton bouton d'ajout de ligne lui-même) !

Regarde, par exemple, ce que ferait ceci, en plaçant sur ton userform ton seul bouton d"'ajout, et en le plaçant suffisamment bas pour laisser de la place à la ligne que tu vas insérer :

Private Sub BoutonAjouterLigne_Click()
 'ajoute une ligne de calcul en dessous de la precédente
 Dim Txtbox As Control
 Dim i, a As Integer
 mahauteur = 18
 i = BoutonAjouterLigne.Top
 Set Txtbox = Controls.Add("Forms.TextBox.1", "TXTNvDevisPrest" & i, True)
 Txtbox.Tag = "TXTNvDevisPrest" & i
 Txtbox.Left = 6
 Txtbox.Top = i - mahauteur
 Txtbox.Width = 186
 Txtbox.Height = 18
 Txtbox.Visible = True

 Set Txtbox = Controls.Add("Forms.TextBox.1", "NvDevisTXTQt" & i, True)
 Txtbox.Tag = "NvDevisTXTQt" & i
 Txtbox.Left = 240
 Txtbox.Top = i - mahauteur
 Txtbox.Width = 30
 Txtbox.Height = 18
 Txtbox.Visible = True

 Set Txtbox = Controls.Add("Forms.TextBox.1", "NvDevisTXTPx" & i, True)
 Txtbox.Tag = "NvDevisTXTPx" & i
 Txtbox.Left = 348
 Txtbox.Top = i - mahauteur
 Txtbox.Width = 54
 Txtbox.Height = 18

 Set Label = Controls.Add("Forms.Label.1", "NvDevisTXTMontantHT" & i, True)
 Label.Tag = "NvDevisTXTMontantHT" & i
 Label.Left = 492
 Label.Top = i - mahauteur
 Label.Width = 48
 Label.Height = 18
 Label.Caption = "OK"
 Label.Visible = True
 BoutonAjouterLigne.Top = BoutonAjouterLigne.Top + mahauteur

End Sub


J'ai là pratiquement repris ton propre code.
Je te conseille toutefois à nouveau de tenir compte de ce que je t'ai déjà dit dans mon premier message car cela te sera probablement très utile dans la suite de ton appli !

____________________
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
Commenter la réponse de ucfoutu
Messages postés
18
Date d'inscription
dimanche 27 mars 2011
Dernière intervention
24 novembre 2011
- 30 août 2011 à 14:16
0
Merci
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]
Commenter la réponse de Ocin2
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
- 30 août 2011 à 14:20
0
Merci
Autre problème = autre discussion
Si celle-ci est terminée ===>> tag "Réponse acceptée" ===>> ouverture d'une autre discussion pour ton nouveau problème.

____________________
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
Commenter la réponse de ucfoutu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.