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.
Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
bonjours,
j'ai modifier grace a vos conseil, mon USERFORM
mais j'ai encore un petit soucis au niveau de multiplier des prix par des quantités. j'arrive a multiplier tous ce qui se trouve au dessus du chiffre 1, mais quand je rentre 0,20 par exemple, rien ce passe.
Pouvez vous m'aider
je met un morceau de mon code ici pour info :
Private Sub txtprix_AfterUpdate()
Dim wRange As Range
Dim wIdxTicket As Integer
Dim iRow As Integer
'Pas d'article saisi non renseigné
'L'article doit exister
If Len(LTrim(Me.CbxArticle.Value)) = 0 Or Not ArticleExist(Me.CbxArticle.Value) Then
Exit Sub
End If
'Pas de prix
If Len(LTrim(Me.txtprix.Text)) = 0 Then
Exit Sub
End If
'Pas d'article saisi
If Val(Me.txtprix.Text) = 0 Then
Exit Sub
End If
Bonjour Angoul le forum,
le bout de code que tu viens de donner à un rapport avec ta multiplication?
donne le bon bout de code STP et on t'aidera
a+
papou
Quand tu récupères la valeur contenue dans ta boîte de texte txtprix, utilise Val(Me.txtprix.Text) (ou bien CDec(Me.txtprix.Text), CDbl(Me.txtprix.Text), CVar(Me.txtprix.Text) ...).
Vérifie que, selon les options régionales installées sur ton PC, le point décimal s'écrit avec un "." ou une ",". Si c'est avec un ".", la fonction Val("0,2"), renvoie la valeur 0)
@+
Edit :
Rectification : la fonction Val ne reconnait que le "." comme séparateur décimal. Cela ne dépend pas des paramètres régionaux. Ton problème pourrait provenir de là.
Par contre, les fonctions CDec, CDbl ... tiennent bien compte des paramètres régionaux.
Exemple de code alternatif :
Code:
'Pas de prix "numérique" saisi
If Not IsNumeric(Me.txtprix.Text) Then
Exit Sub
End If
'Prix Nul saisi
'Remarque : attention, si [B]Me.txtprix.Text[/B] n'est pas reconnu comme un nombre, [B]CDec(Me.txtprix.Text)[/B] génère une erreur.
'Dans cet exemple, cette vérification est faite juste au dessus dans le code.
If CDec(Me.txtprix.Text) = 0 Then
Exit Sub
End if
Bonjour le forum 🙂,
Une solution peut-être plus courte, remplacer la virgule à la volée par un point. Le test fait avec 1,2 et 1.2 en dessous me parrait concluant.
Code:
Dim Texte As String
Texte = InputBox("Test")
MsgBox (Val(Texte))
MsgBox (Val(Replace(Texte, ",", ".")))
sans exemple dur dur, mais lorsque tu fais une multiplication as-tu pense à utiliser des variable de type Single ou Double pour gérer les décimales (Integer et long etant des entiers)
bonsoir,
Je revient a vous pour ce petit probleme de multiplier mes quantités par un prix
voila ce qui devrait ce passer, je tape, une quantité 2,5 que je multiplie par mon prix 2,5
cela marche et alimente alors ma listbox avec le resultat
par contre quand je tape quantité 2,5 et que je rentre un prix de 0,20 par exemple, rien se passe.
je met a votre dispo mon fichier pour de l'aide que j'arrive pas a voir ou cela bloque.
Cijoint.fr - Service gratuit de dépôt de fichiers
La réponse à ta question est dans les posts précédents.
La fonction Val ne reconnait pas la "," comme séparateur décimal, elle ne reconnait que le ".".
Ce qui veut dire que Val("0,3") = 0, ou bien Val("2,3") = 2, mais que Val("0.3") = 0.3.
Cette propriété cause deux problèmes dans ton code :
Tu ne fais aucune action si Val(Me.txtprix.Text) = 0, donc par exemple, si Me.txtprix.Text = "0,3".
Quand tu copies Val(Me.txtprix.Text) et Val(Me.Textquant.Text) dans les feuilles "Tickets" et "recap ticket", si txtprix ou Textquant sont des nombres comprenant une ",", tu perds tout ce qu'il y a après cette ",".
Il y a au moins deux solutions possibles (voir posts précédents) :
Tu remplaces tous tes Val(Texte) par CDec(Texte) en faisant bien attention que Texte représente un nombre au sens des paramètres régionaux (ce dont, d'aprés ce que j'ai vu dans ton code, tu t'assures déjà avec la fonction IsNumeric, dans tes procédures Txtprix_BeforeUpdate et Textquant_BeforeUpdate).
Tu remplaces tous tes Val(Texte) par Val(Replace(Texte, ",", ".")).
Deux dernières remarques :
Je t'invite à revoir tous tes controls et toutes les cellules que tu affectes et à t'interroger sur le type de données que tu veux dans ces éléments (texte, date, monnaie, nombre décimal ...) et à vérifier que c'est bien ce que tu fais dans ton code.
Sois également bien conscient des séparateurs définis dans les paramètres régionaux de Windows (Panneau de contrôle/Paramètres régionaux ...). Il y a deux types de séparateur pour le point décimal : le premier pour les nombres en général et le deuxième pour la monnaie. Ces paramètres affectent les fonctions CDec, CCur, ... de conversion de type (voir la documentation VBA).
bonsoir,
je te remercie des tes conseils et informations que tu me donne ngogoisidore , j'ai bien fait la modification que tu me conseil c'est a dire remplacer Val(Texte) par CDec(Texte)
et cela fonctionne bien, mais j'ai une petite erreur qui maintenant apparait quand je clique sur le bouton "supprimer article" pourrait tu me dire ce que je doit modifier dans mon fichier pour ne plus avoir l'erreur :
Private Sub BnSupprimer_Click()
Dim wIdxTicket, ligticket, ligrecapticket As Integer, num As String
wIdxTicket = Me.LstTicket.ListIndex
If wIdxTicket >= 0 Then
num = LstTicket.List(wIdxTicket, 8)
cTotal = cTotal - CCur(LstTicket.List(wIdxTicket, 5))
Me.LstTicket.RemoveItem wIdxTicket
Me.LblTotal.Caption = " " & CStr(cTotal)
End If
With Sheets("Tickets")
.Activate ligticket = .Columns("A").Find(what:=num).Row
.Rows(ligticket).Delete
End With
With Sheets("recap ticket")
.Activate
ligrecapticket = .Columns("A").Find(what:=num).Row
.Rows(ligrecapticket).Delete
End With
End Sub
C'est pour éviter ce genre de problèmes que je t'ai écrit de vérifier le type de toutes les données que tu affectes à tes controls et tes cellules ...
Je sais que ça peut paraitre un peu fastidieux, mais c'est indispensable si tu veux coder proprement.
Tu peux utiliser le debuggeur pour t'aider, et d'ailleurs, il faut utiliser le debuggeur et les points d'arrêt pour vérifier ton code (je ne sais pas si tu le fais ?).
Dans ce cas particulier :
Code:
With Sheets("Tickets")
...
[B]ligticket = .Columns("A").Find(what:=num).Row[/B]
...
Les valeurs dans la colonne A de la feuille Tickets ont été enregistrées en type Date, car tu n'as pas forcé le type lorsque tu les as affectées.
Par contre num est une chaîne de caractères, donc bien que, sur la feuille Tickets, tu vois bien la date num apparaitre, la donnée dans la colonne A est stockée comme un nombre (une date). Donc, num et valeur dans colonne A ne peuvent pas être identiques.
Par conséquent, il y a un choix à faire :
Dans ton contrôle TextDate, qui est la source de toutes tes dates, tu n'as pas le choix, comme c'est une boîte de texte, le type de ta donnée sera un texte. Par contre, dans tes feuilles Tickets, et recap ticket, tu peux soit la stocker comme date, soit la stocker comme texte.
Si tu choisis de la stocker comme texte, dans la procédure txtprix_AfterUpdate, change la ligne :
Car bien que LstTicket.List(iNbrArt, 8) contienne un Variant/String, par défaut, comme le type n'est pas forcé (le type est Variant, et ce Variant contient une String) Excel convertit automatiquement cette valeur en Date quand il l'affecte à ta colonne A. Par contre, TextDate est bien une String.
Pour l'affectation, de la colonne A de ta feuille recap ticket, tu envoies déjà une String, avec la commande :
Puis, dans la procédure BnSupprimer_Click, change les lignes :
Code:
With Sheets("Tickets")
...
ligticket = .Columns("A").Find(what:=num).Row
...
With Sheets("recap ticket")
...
ligrecapticket = .Columns("A").Find(what:=num).Row
en
Code:
With Sheets("Tickets")
...
ligticket = .Columns("A").Find(what:=CDate(num)).Row
...
With Sheets("recap ticket")
...
ligrecapticket = .Columns("A").Find(what:=CDate(num)).Row
Evidemment la solution 1 est celle qui demande le moins de changement sur ton code actuel ...
Voilà.
Sinon, une dernière remarque :
Dans ton code (procédures Txtprix_BeforeUpdate et Textquant_BeforeUpdate), tu testes la validité des valeurs entrées dans tes boîtes de texte Txtprix et Textquant : c'est trés bien.
Mais si les valeurs ne sont pas valides, tu renvoies le message d'erreur : "PERDU! REJOUE", là c'est moins bien 🙂. Non pas que je ne trouve pas ça drôle 😉, mais plutôt parce cela n'indique à l'utilisateur, ni la valeur erronnée, ni la raison de l'erreur. Un message du genre "Le Prix doît être un nombre : Entrée non Valide", me semble plus explicite et, donc, plus à propos 🙂 !.
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD