J'ai un souci dans un formulaire pour récupérer un montant d'une TextBox avec un format numérique monétaire.
Dans mon formulaire, (voir fichier joint,) après avoir rechercher un numéro, via le bouton rechercher et que je modifie le montant de la TextBox en rentrant un nombre décimal, il n'y a pas de problème et dans mon tableau le montant est dans un format numérique monétaire.
Par contre, si je modifie simplement le vendeur et pas le montant ou bien si je change le montant avec un nombre entier non décimal, dans mon tableau le format est un format texte.
Comment modifier le code pour récupérer à chaque fois une valeur numérique monétaire ?
Bonjour.
Ce n'est pas Format(txb_montant, "# ### ###.00 €") qu'il faut envoyer dans la cellule. Ca n'a pas de sens.
C'est CCur(txb_montant.Text).
Encore faudra-t-il faire ce qu'il faut pour vérifier que la conversion soit possible et corriger s'il y a lieu.
Normalement c'est la virgule qui est utilisée comme séparateur décimal.
Vous devriez remplacer votre Sub txb_montant_change par ça :
VB:
Private Sub txb_montant_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii = Asc(".") Then KeyAscii = Asc(",")
End Sub
Je reviens une nouvelle fois vers vous car j'ai un autre souci avec un code.
Vous avez réussi à me dépanner hier mais là mon problème porte sur un second formulaire que j'ai crée.
Il se présente sur le même modèle que le premier sauf que la recherche pour une modification se fait en cliquant sur la ListBox.
Donc, après avoir choisi un item dans la ListBox, j'aimerais que, quand je modifie le montant, et ou le vendeur, et ou la date,la correction se fasse dans le tableau.
Je suis débutant en VBA et j'ai recopié bêtement le code du premier formulaire en ajustant un peu mais force est de constater que cela ne fonctionne pas.
Comment corriger mon code pour que les modifications que je fais soient prises en compte ?
Comme je vous l'ai dit, je suis débutant en VBA et la la syntaxe des codes m'est complètement inconnue.
Pourriez-vous, me dire ou intégrer i = Me.lsb_base.ListIndex come vous le suggerez et que dois-je modifier dans le code ci-dessous pour que cela fonctionne ?
Private Sub btn_remplacer_Click()
Dim i As Integer
Dim numero As Integer
numero = txb_numlsb
Application.ScreenUpdating = False
Sheets("Base").Activate
For i = 6 To 500
If Cells(i, 2) = numero Then
Cells(i, 3) = CDate(txb_date.Value)
Cells(i, 4) = CDbl(Replace(txb_montant, ".", ","))
Cells(i, 5) = cbb_vendeur
End If
Next i
End Sub
Vous le mettez à la place de For i = 6 to 500, pas de boucle ni de test à faire: i devrait toujours être bon, non ?
Utilisez CCur pour convertir en Currency, CDbl c'est pour convertir en Double.
Merci pour votre réponse mais hélas cela ne fonctionne pas. Seul le numéro est modifié mais en format texte et en plus il y a un décalage de plusieurs lignes.
Déclarez une variable globale Private LCou As Long pour le numéro de ligne courant dans la base.
Et veillez à ce qu'elle contienne toujours le bon numéro de ligne dans la base en toute occasion. Et si une ListBox contient une partie des informations seulement, garder les numéros de lignes dans la base correspondant à ceux de la ListBox dans un Private TLgn() As Long. Personnellement c'est comme ça que je fais toujours. Et j'ai aussi en général une VLgn() As Variant pour conserver les valeurs de la ligne courante.
Comme je l'ai posté plus haut, je suis débutant en VBA et malheureusement les propositions que vous suggérez Dranreb, je suis incapable de les mettre en place. C'est vraiment trop compliqué pour moi.
les données de la feuille Base (plage B6:E14) sont insérées dans la listbox lsb_base.
L'index des données dans une listbox commence à 0.
La première ligne de données de la listBox aura pour index : 0
Cette première ligne de données correspond à la ligne 6 dans la feuille Base.
Donc, à partir de la listbox, pour retrouver la ligne de la feuille => index de la ligne listbox +6, soit: lsb_base.ListIndex + 6
Dans Private Sub btn_remplacer_Click() de usf_remplacer, on aurait alors
Code:
Dim i As Integer
i = lsb_base.ListIndex + 6
Cells(i, 3) = CDate(txb_date.Value)
Cells(i, 4) = CDbl(Replace(txb_montant, ".", ","))
Cells(i, 5) = cbb_vendeur
A+
Edit :
A l'issue de cette correction, la mise à jour ne fonctionnait pas ! (avant non plus!!)
Après recherches, il s'avère que chaque écriture (Cells(i, 3) =..., Cells(i, 4) =..,...) provoquait le déclenchement de Private Sub lsb_base_Click() deux fois de suite ! Curieux !!!
En modifiant la façon de charger la listbox, tout est rentré dans l'ordre.
Dans Private Sub UserForm_Initialize() :
au lieu de : Me.lsb_base.RowSource = "tab_base"
écrire: tablo = Range("tab_base")
lsb_base.List = tablo
Par ailleurs la ligne Me.lsb_base.TopIndex = Me.lsb_base.ListCount ne me semble pas utile.
Je vous remercie de vous êtes penché sur mon souci. Le problème est maintenant résolu. Félicitations.
Le caractère CURIEUX, c'est surement parce que j'ai fait de la bidouille avec des codes que j'ai trouvés par ci par là.
En ce qui concerne la ligne Me.lsb_base.TopIndex = Me.lsb_base.ListCount, je l'ai placée dans le code car je préfère avoir les derniers enregistrements affichés. Sur cet exemple, c'est vrai que ce n'est pas très utile mais comme je vais utiliser ce code pour des centaines d'enregistrements cela sera plus pratique pour moi.
non,non,
c'est bien (a priori) l'utilisation de Me.lsb_base.RowSource = "tab_base" qui faisait déclencher Private Sub lsb_base_Click() inopportunément.