Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Multiplier 2 textboxs même lorsque qu'une des 2 est vide

Arnold35

XLDnaute Junior
Bonjour le forum,

Dans mon fichier j'ai créé un formulaire qui s'ouvre lorsqu'on souhaite ajouter une commande.

Voici les 2 problèmes que je rencontre:

1) Dans ce formulaire, l'utilisateur a le choix de saisir jusqu'à 12 articles pour sa commande avec donc 12 quantités différentes et 12 Prix unitaires HT différents. Mais il ne doit pas non plus être obligé de saisir dans les 12 champs.

Dans les textboxs "Prix Total HT" je souhaiterai que le calcul se fasse automatiquement "Qté référence 1 * PUHT référence1", etc....

J'ai trouvé quelques codes sur le forum pour y arriver (et je vous remercie bien!) mais je ne suis pas totalement satisfait du résultat. Le total de chaque ligne ne s'affiche pas automatiquement, il faut cliquer dans la textbox Prix total HT pour que celui-ci se calcule.

Existe t-il un moyen que cela se fasse instantanément?


2) D'autre part, en dessous des 12 textboxs de Prix total HT, j'ai inséré une textbox qui doit faire la somme des 12 textbox se trouvant au dessus.

Or si je ne renseigne pas 12 qtés, 12 PUHT et donc 12 PTHT, la macro plante. Je ne comprends pas.

Je vous joins le fichier, cela sera beaucoup plus simple à comprendre. Le mot de passe de la feuille est "citedia"

Je vous remercie énormément pour votre aide!
 

Pièces jointes

  • MODELE_validation des commandes V8.xlsm
    235.9 KB · Affichages: 27
Dernière édition:

job75

XLDnaute Barbatruc
Re : Multiplier 2 textboxs même lorsque qu'une des 2 est vide

Bonjour Arnold35,

Ce n'est pas l'événement Exit mais l'événement Change qu'il faut utiliser.

Et sur les 2 TextBoxes qui entrent dans le calcul :

Code:
Private Sub TextBox_Qté_1_Change()
TextBox_PTHT_1 = Val(Replace(TextBox_Qté_1, ",", ".")) * Val(Replace(TextBox_PUHT_1, ",", "."))
End Sub

Private Sub TextBox_PUHT_1_Change()
TextBox_PTHT_1 = Val(Replace(TextBox_Qté_1, ",", ".")) * Val(Replace(TextBox_PUHT_1, ",", "."))
End Sub
La virgule est remplacée par le point pour pouvoir utiliser la fonction Val.

A+
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Multiplier 2 textboxs même lorsque qu'une des 2 est vide

Bonjour Arnold35, job75,

J'avais fait un truc mais je n'ai pas pu le publier avant (panne générale au niveau du DSLAM donc internet en rade).

Il y a des méthodes plus élégantes et plus rapide mais j'ai choisi une méthode "bourrin" qui voulait minimiser le code à écrire ( surtout les recopies avec modification des indices) pour les TextBox. Ça vaut pas un clou, j'en ai presque honte

  • à chaque modification d'une quantité ou d'un montant hors taxe, on remet à jour toute la partie détail de la commande. de ce fait, les procédures associée à chaque TextBox sont en nombre réduit ( à une seule en fait)
  • on utilise 3 fonctions qui tiennent chacune en une seule ligne :
  • vp qui renvoie un texte dont on a remplacé les virgules par des points
  • pv qui renvoie un texte dont on a remplacé les points par des virgules
  • fo qui formate un nombre en #,##0.00 (cas des devises)
  • que le séparateur décimal soit un point ou une virgule, ça devrait marcher
  • la touche Entrée ou Tabulation provoque la mise à jour les montants

La partie modifiée du code :
VB:
'calculs automatiques des textbox de Prix Total HT
Function pv(a): pv = Replace(Replace(a, ".", ","), " ", ""): End Function
Function vp(a): vp = Replace(Replace(Replace(a, ",", "."), " ", ""), Chr(160), ""): End Function
Function fo(a): fo = Format(a, "#,##0.00"): End Function

Sub TextBox_PuHT_1_Exit(ByVal Cancel As MSForms.ReturnBoolean): valeurs: End Sub
Sub TextBox_Qté_1_Exit(ByVal Cancel As MSForms.ReturnBoolean): valeurs: End Sub
Sub TextBox_PuHT_2_Exit(ByVal Cancel As MSForms.ReturnBoolean): valeurs: End Sub
Sub TextBox_Qté_2_Exit(ByVal Cancel As MSForms.ReturnBoolean): valeurs: End Sub
Sub TextBox_PuHT_3_Exit(ByVal Cancel As MSForms.ReturnBoolean): valeurs: End Sub
Sub TextBox_Qté_3_Exit(ByVal Cancel As MSForms.ReturnBoolean): valeurs: End Sub
Sub TextBox_PuHT_4_Exit(ByVal Cancel As MSForms.ReturnBoolean): valeurs: End Sub
Sub TextBox_Qté_4_Exit(ByVal Cancel As MSForms.ReturnBoolean): valeurs: End Sub
Sub TextBox_PuHT_5_Exit(ByVal Cancel As MSForms.ReturnBoolean): valeurs: End Sub
Sub TextBox_Qté_5_Exit(ByVal Cancel As MSForms.ReturnBoolean): valeurs: End Sub
Sub TextBox_PuHT_6_Exit(ByVal Cancel As MSForms.ReturnBoolean): valeurs: End Sub
Sub TextBox_Qté_6_Exit(ByVal Cancel As MSForms.ReturnBoolean): valeurs: End Sub
Sub TextBox_PuHT_7_Exit(ByVal Cancel As MSForms.ReturnBoolean): valeurs: End Sub
Sub TextBox_Qté_7_Exit(ByVal Cancel As MSForms.ReturnBoolean): valeurs: End Sub
Sub TextBox_PuHT_8_Exit(ByVal Cancel As MSForms.ReturnBoolean): valeurs: End Sub
Sub TextBox_Qté_8_Exit(ByVal Cancel As MSForms.ReturnBoolean): valeurs: End Sub
Sub TextBox_PuHT_9_Exit(ByVal Cancel As MSForms.ReturnBoolean): valeurs: End Sub
Sub TextBox_Qté_9_Exit(ByVal Cancel As MSForms.ReturnBoolean): valeurs: End Sub
Sub TextBox_PuHT_10_Exit(ByVal Cancel As MSForms.ReturnBoolean): valeurs: End Sub
Sub TextBox_Qté_10_Exit(ByVal Cancel As MSForms.ReturnBoolean): valeurs: End Sub
Sub TextBox_PuHT_11_Exit(ByVal Cancel As MSForms.ReturnBoolean): valeurs: End Sub
Sub TextBox_Qté_11_Exit(ByVal Cancel As MSForms.ReturnBoolean): valeurs: End Sub
Sub TextBox_PuHT_12_Exit(ByVal Cancel As MSForms.ReturnBoolean): valeurs: End Sub
Sub TextBox_Qté_12_Exit(ByVal Cancel As MSForms.ReturnBoolean): valeurs: End Sub

Sub valeurs()
Const TVA = 0.2       ' INDIQUER ICI le TAUX de TVA
Dim i&, x As Control, y As Control, z As Control, TotalHT
 For i = 1 To 12
  ' on affecte à x,y,z les trois  derniers controles de chaque ligne
  Set x = Me.Controls("TextBox_Qté_" & i): Set y = Me.Controls("TextBox_PuHT_" & i)
Set z = Me.Controls("TextBox_PTHT_" & i)
  ' on en profite pour redéfinir les TabIndex
  Me.Controls("TextBox_Réf_" & i).TabIndex = 4 * (i - 1) + 0
  Me.Controls("TextBox_Désignation_" & i).TabIndex = 4 * (i - 1) + 1
  x.TabIndex = 4 * (i - 1) + 2: y.TabIndex = 4 * (i - 1) + 3
  ' on prend le controle, on remplace les virgules par des points (vp)
  ' on trouve la valeur numérique (VAL), si c'est un montant monétaire
  ' on le formate(0:00 par fo),on remplace les points par des virgules (vp)
  ' on réaffecte le résultat au controle
  If x <> "" Then x = pv(Val(vp(x)))
  If y <> "" Then y = pv(fo(Val(vp(y))))
  ' si x ou y ne sont pas vide, on calcule le montant de la ligne et on l'inscrit
  If Trim(x & y) <> "" Then z = pv(fo(Val(vp(x)) * Val(vp(y)))) Else z = ""
  ' on en profite pour rajouter le montant de la ligne au total hors taxe
  TotalHT = TotalHT + Val(vp(z))
 Next i
 ' on inscrit le total hors taxe
 TextBox1_Mtt_total_HT = pv(fo(TotalHT))
 ' on inscrit le total TTC
 TextBox_Mtt_TTC_commandé = pv(fo(TotalHT * (1 + TVA)))
End Sub
 

Pièces jointes

  • Arnold35-modele_validation commandes-va.xlsm
    238.9 KB · Affichages: 31
Dernière édition:

Si...

XLDnaute Barbatruc
Re : Multiplier 2 textboxs même lorsque qu'une des 2 est vide

salut

autre évènement (1 clic de plus mais une ligne de moins et vu leur nombre...*)

Code:
Private Sub TextBox_PTHT_1_Enter() 'clic sur ce contrôle
  TextBox_PTHT_1 = CDbl(Replace(TextBox_Qté_1, ".", ",")) * _
                  CDbl(Replace(TextBox_PUHT_1, ".", ","))
End Sub

Job, Val retourne un entier non ?

*un contrôle Listbox pourrait remplacer avantageusement tes nombreux contrôles TextBox
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Multiplier 2 textboxs même lorsque qu'une des 2 est vide

Salut Si...

(...) Val retourne un entier non ? (...)

Comme je passais par là : Pas forcément. Théoriquement, le point sert de séparateur décimal. Il sait même reconnaître un peu plus (notation scientifique)

Une copie d'exemples issues de la fenêtre d'exécution de VBE:

? val("123.45abcde")
123,45
? val("2e+2abcde")
200
? val("2E2abcde")
200
? val("5.2e-2abcde")
0,052
? val("123,45abcde")
123
? val("2e+2abcde")
200
? val("5,2e-2abcde")
5

 
Dernière édition:

Arnold35

XLDnaute Junior
Re : Multiplier 2 textboxs même lorsque qu'une des 2 est vide

Merci à tous, j'ai utilisé le code de job75 et ça à l'air de fonctionner pas trop mal (je suis un peu débutant en VBA donc mes codes ne sont pas forcément les plus élégants).

J'ai une autre question par la même occasion (qui doit rejoindre la remarque de Si...), J'ai créé une combobox pour le nom du fournisseur, qui est alimentée par une base de fournisseurs dans un onglet. Jusque là tout va bien.

Par contre je peine pour arriver à relier les textboxs qui en découlent (à savoir, l'adresse, code postal, etc...)

Auriez vous un bon conseil pour un débutant qui ne sait pas trop où il va?

Merci beaucoup à vous en tout cas!
 

Pièces jointes

  • MODELE_validation des commandes V9.xlsm
    244.4 KB · Affichages: 26

Si...

XLDnaute Barbatruc
Re : Multiplier 2 textboxs même lorsque qu'une des 2 est vide

re

salut mapomme,
chez moi, avec mon code, 2 et 3,5 retourne 7. Si... je remplace Cdbl par Val, je ne reçois que 6 .

On pourrait aussi simplifier les codes avec un module de classe.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Multiplier 2 textboxs même lorsque qu'une des 2 est vide

re,

(...) chez moi, avec mon code, 2 et 3,5 retourne 7. Si... je remplace Cdbl par Val, je ne reçois que 6 . (...)
Je ne comprends pas , c'est très étrange. Attendons un troisième avis.
Si tu prends mon fichier et que tu saisis 2 en quantité et 2e3 en montant unitaire que se passe-t-il ?
Chez moi, ça donne qté = 2 ; PU = 2 000,00 et HT = 4 000,00

(...) On pourrait aussi simplifier les codes avec un module de classe. (...)
C'est aussi à quoi je pensais en parlant de méthode plus élégante.
 
Dernière édition:

Arnold35

XLDnaute Junior
Re : Multiplier 2 textboxs même lorsque qu'une des 2 est vide

Finalement j'ai utilisé le code de mapomme qui fonctionne également très bien et qui permet d'avoir les montants dans la textbox décalé sur la droite.

Par contre quand je génère la commande, cela écrase la mise en forme de l'onglet "Suivi des Cdes MDA V2" (le montant TTC se trouve décalé à gauche). Le même phénomène se produit dans le nouveau fichier bon de commande qui se génère en appuyant sur "Ajouter".

Avez vous une astuce pour contourner cela?

Merci beaucoup
 

Pièces jointes

  • MODELE_validation des commandes V10.xlsm
    235.3 KB · Affichages: 33
  • MODELE_validation des commandes V10.xlsm
    235.3 KB · Affichages: 29
  • MODELE_validation des commandes V10.xlsm
    235.3 KB · Affichages: 24

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Multiplier 2 textboxs même lorsque qu'une des 2 est vide

Re Arnold35,

(...)qui permet d'avoir les montants dans la textbox décalé sur la droite.

L'alignement dans les contrôles avec du texte n'est pas codé. J'ai simplement modifié une propriété de chaque Textbox.
La propriété s'appelle TextAlign et elle peut prendre trois valeurs différentes qui correspondent à : aligné à gauche, centré ou aligné à droite
 

Arnold35

XLDnaute Junior
Re : Multiplier 2 textboxs même lorsque qu'une des 2 est vide

Ok merci.

Par contre qu'est ce qui fait que les montants rappatriés dans les 2 onglets ne prennent plus la mise en forme de ces onglets?

J'ai l'impression qu'ils sont désormais en données texte. non?
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Multiplier 2 textboxs même lorsque qu'une des 2 est vide

Rere,


Attention, comme son nom l'indique, le contenu des TextBox est du texte. Quand vous le transférer sur une feuille Excel, il peut se passer des choses indésirables qui dépendent, entre autres, du format de la cellule.
Le mieux est de connaître le format de la cellule destinataire et de convertir le texte au format attendu par la cellule Excel.
Pour la mise au point en général, j'affecte le format standard aux cellule, le format standard à l'alignement et je regarde le résultat.
Si on a un un textbox qui représente un nombre et qu'une fois transféré dans Excel, il est aligné à gauche -> cela signifie qu'Excel l'a interprété comme du texte et non comme un nombre. C'est tout pareil pour les dates.

Je vais regarder ce qu'il en est pour votre fichier... mais je ne sais pas quand ce soir...

nota : la flopée de vérif que vous faites (et c'est bien) n'accélère cependant pas les tests !
 
Dernière édition:

Arnold35

XLDnaute Junior
Re : Multiplier 2 textboxs même lorsque qu'une des 2 est vide

Ok merci mapomme,

J'ai trouvé la fonction pour convertir mes montants en données standard => Val()

Par contre j'ai un problème avec la Combobox_Fournisseur: j'ai alimenté les textbox des coordonnées fournisseur avec un onglet de base. Cela fonctionne parfaitement quand j'ouvre mon formulaire et que je sélectionne mon fournisseur.
En revanche lorsque je clique sur le bouton "ajouter", la macro bloque sur ce code:

'Alimente l'adresse du fournisseur en fonction du choix de la Combobox_Fournisseur

Private Sub Combobox_Fournisseur_Change()

With Sheets("Base Fournisseurs")
TextBox_FSR_Rue = .Cells(ComboBox_Fournisseur.ListIndex + 2, 2)
TextBox_FSR_complément_adresse = .Cells(ComboBox_Fournisseur.ListIndex + 2, 3)
TextBox_FSR_BP = .Cells(ComboBox_Fournisseur.ListIndex + 2, 4)
TextBox_FSR_CP = .Cells(ComboBox_Fournisseur.ListIndex + 2, 5)
TextBox_FSR_Ville = .Cells(ComboBox_Fournisseur.ListIndex + 2, 6)



End With
End Sub

Est ce que j'ai oublié un code ou est ce que je n'ai pas placé la liaison Combobox-textbox au bon endroit dans ma programmation?

Je vous remercie par avance pour votre aide
 

Pièces jointes

  • MODELE_validation des commandes V10.xlsm
    239.2 KB · Affichages: 20
  • MODELE_validation des commandes V10.xlsm
    239.2 KB · Affichages: 22
  • MODELE_validation des commandes V10.xlsm
    239.2 KB · Affichages: 29

job75

XLDnaute Barbatruc
Re : Multiplier 2 textboxs même lorsque qu'une des 2 est vide

Re, salut Si...

chez moi, avec mon code, 2 et 3,5 retourne 7. Si... je remplace Cdbl par Val, je ne reçois que 6 :confuse

C'est quand même évident cette histoire de séparateur décimal !

CDbl nécessite la virgule (sur version française) et Val nécessite le point.

Mais Val lui ne beugue pas si l'on utilise la virgule...

Bonne fin de soirée.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Multiplier 2 textboxs même lorsque qu'une des 2 est vide

Re,

Trois petits points :

J'ai remplacé l'évènement exit par AfterUpdate pour les TextBox (la mise à jour ne se faisait pas quand on quittait la dernière TextBox (TextBox_PuHT_12)

Pour le PB cité ci-dessus, quand vous exécutez le code en cause, le classeur actif est le nouveau fichier "Bon de commande" et non votre classeur initial. Il n'y trouve donc pas la feuille "Base Fournisseurs". Il suffit d'indexer Sheets avec le bon classeur:
With Workbooks("MODELE_validation des commandes V10a.xlsm").Sheets("Base Fournisseurs")

Vous avez oublié le l'extension ".xlsm" sur une ligne. Chez moi, ça coinçait. La ligne concernée est :
Range("I10") = Workbooks("MODELE_validation des commandes V10a.xlsm").Sheets("Suivi des cdes MDA V2").Range("G1").Value
 

Pièces jointes

  • MODELE_validation des commandes V10a.xlsm
    245.2 KB · Affichages: 19

Discussions similaires

Réponses
5
Affichages
554
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…