Intialiser un nombre à 2 décimales et l'afficher dans le userform

Bonjour Alex,

Je vois que tu as passé mon fichier à la moulinette spécial Alex !

concernant mon bout de code du dernier prix connu HT, j'avais un bug.

Le voici maintenant.

Private Sub TextBoxDPCHT€_AfterUpdate()
    ' Dernier Prix Connu Hors Taxe en €uros
    Dim valeur_DPCHT€ As String
    valeur_DPCHT€ = Me.TextBoxDPCHT€

        If valeur_DPCHT€ <> "" Then
            'remplacer le . éventuel
            valeur_DPCHT€ = Replace(valeur_DPCHT€, ".", ",")
                'vérifier que la saisie est un nombre
                If IsNumeric(valeur_DPCHT€) Then
                    'formater TextBoxDPCHT€
                    TextBoxDPCHT€ = Format(valeur_DPCHT€, "#,##0.00")
                    ' calcule le prix TTC et l'affiche dans la textbox TTC
                    TextBoxDPCTTC = (TextBoxDPCHT€ * 1) * (ThisWorkbook.Sheets("Code_VBA").Range("F8") + 1)
                    ' formater TextBoxDPCTT€
                    TextBoxDPCTTC = Format(TextBoxDPCTTC, "#,##0.00")
                Else
                    'vider la valeur
                    valeur_DPCHT€ = ""
                    ' vider la textbox et afficher un message d'alerte
                    TextBoxDPCHT€ = ""
                    MsgBox ("il y a un caractère qui n'est pas un chiffre ou un séparateur de décimale." & Chr(10) & vbCrLf & _
                    "Vous ne devez saisir QUE des CHIFFRES, un POINT ou une VIRGULE." & Chr(10) & vbCrLf & _
                    "En cas d'erreur de saisie, la valeur enregistrée précédemment dans le classeur sera conservée."), vbExclamation, ".           FORMAT DE Dernier Prix Connu en € INCORRECT"
                End If
        Else
            TextBoxDPCHT€ = ""
            TextBoxDPCTTC = ""
        End If
End Sub

il y avait

                If IsNumeric(valeur_DPCHT€) Then
                    'formater TextBoxDPCHT€
                    TextBoxDPCHT€ = Format(Me.TextBoxDPCHT€, "#,##0.00")

J'ai corrigé par ( valeur_DPCHT€ remplace

Me.TextBoxDPCHT€
                If IsNumeric(valeur_DPCHT€) Then
                    'formater TextBoxDPCHT€
                    TextBoxDPCHT€ = Format(valeur_DPCHT€, "#,##0.00")

pour le prix Adaptable HT, j'ai repéré cette anomalie en voulant saisir un nombre à virgule.
Je pense l'avoir correctement corrigé. est-ce que c'est bon ? justement en mettant "valeur_HT€Adap" à la place de "TextBoxHT€Adaptable" comme précédemment.

Private Sub TextBoxHT€Adapable_AfterUpdate()
    ' Prix Hors Taxe Adaptable en €uros
    Dim valeur_HT€Adap As String
    valeur_HT€Adap = Me.TextBoxHT€Adapable

        If valeur_HT€Adap <> "" Then
            'remplacer le . éventuel
            valeur_HT€Adap = Replace(valeur_HT€Adap, ".", ",")
                'vérifier que la saisie est un nombre
                If IsNumeric(valeur_HT€Adap) Then
                    'formater TextBoxDPCHT€
                    TextBoxHT€Adapable = Format(valeur_HT€Adap, "#,##0.00")
                    ' calcule le prix TTC et l'affiche dans la textbox TTC
                    TextBoxTTC€Adapable = (TextBoxHT€Adapable * 1) * (ThisWorkbook.Sheets("Code_VBA").Range("F8") + 1)
                    ' formater TextBoxTTC€Adapable
                    TextBoxTTC€Adapable = Format(TextBoxTTC€Adapable, "#,##0.00")
                Else
                    'vider la valeur
                    valeur_HT€Adap = ""
                    ' vider la textbox et afficher un message d'alerte
                    TextBoxHT€Adapable = ""
                    MsgBox ("il y a un caractère qui n'est pas un chiffre ou un séparateur de décimale." & Chr(10) & vbCrLf & _
                    "Vous ne devez saisir QUE des CHIFFRES, un POINT ou une VIRGULE." & Chr(10) & vbCrLf & _
                    "En cas d'erreur de saisie, la valeur enregistrée précédemment dans le classeur sera conservée."), vbExclamation, ".       FORMAT DE Prix de pièce adaptable INCORRECT"
                End If
        Else
            TextBoxHT€Adapable = ""
            TextBoxTTC€Adapable = ""
        End If
End Sub

Concernant la valeur bizarre qui apparait quand on saisi une valeur de 10€ et quelques, c'est corrigé mais j'avoue ne pas savoir comment j'ai fait.
Pour bloquer la saisie des valeurs négatives, je ne vois pas comment il faut faire. :(

Alex le 05/05 à 23h12

Bon je critique mais je vois aussi que par rapport à ta première version il y a du mieux. Bravo.

Tu as 2h pour corriger ;)

c'est fait.
il faut savoir que c'est une vieille base de données et justement j'avais des nombres en texte et d'autres en nombre.
j'ai tout simplement ouvert les fiches avec les nombres en texte, puis "sauvegarder" et ça l'a fait.
J'avais une dizaine de fiches comme ça.

Dans la partie "initialize" j'ai ajouté

ThisWorkbook.Sheets("Honda").

Comme suggéré. C'est bien ça ? nulle part ailleurs ?

Je dois aller en commission là, je continue les autres suggestions tout à l'heure.

Alex le 05/05/2025 à 19h15

Concernant ma recommandation d'insérer Me. : je n'ai pas réellement parcouru ton code dans le fichier pour regarder mais je vois en tout cas que tu ne l'as pas mis dans ton report de code dans ta réponse précédente. D'où ma suggestion (qui reste un conseil).

Je crois que je n'ai pas bien compris ta consigne.

Peux tu me donner 1 exemple, stp, car si je mets des Me. partout pour des prunes... cette perspective ne m'enchante pas.
et surtout je ne comprends pas bien l'intérêt.

Alex le 06/05/2025 à 05h13

Je te conseille plutôt d'insérer une formule dans ton tableau pour calculer le TTC via le HT et le taux de TVA ainsi si tu modifies ton HT ou le taux de TVA alors ton TTC sera automatiquement mis à jour sans avoir à faire de corrections manuelles. Moi je dis ça je dis rien.

Ça c'est déjà fait.

Dans la colonne P (champ DPC_TTC / Dernier Prix Connu TTC) il y a la formule

=[@[DPC_HT_€]]*(1+Tab_TVA[TVA])

mais comme la plupart des derniers prix connus HT ne sont pas forcément renseignés...
J'avais bien conscience que je devais trouver le moyen d'avoir tous les prix HT au format nombre car cela a son importance.
C'est d'ailleurs une partie de ma recherche dans ce sujet.

Coté contrôle, je viens de voir que le fait de saisir une valeur négative fait sauter la formule dans le tableau.
Je vais chercher comment limiter la saisie des caractères à des chiffres, des virgules, des points.

Tiens regarde. Je n'ai pas encore tout contrôlé mais, pour ModificationHonda :

  • regarde le initialize (plus de cells, que des range bien plus pratique pour comprendre la colonne)
  • essaye de saisir des caractères autres que des nombres dans TextBoxHT€Adapable
  • essaye de saisir des caractères autres que des nombres dans TextBoxDPCHT€
  • essaye de saisir plus de 2 décimales dans TextBoxHT€Adapable
  • essaye de saisir plus de 2 décimales dans TextBoxDPCHT€
  • essaye de saisir un point dans TextBoxHT€Adapable
  • essaye de saisir un point dans TextBoxDPCHT€
  • regarde aussi le code d'appel à l'ouverture du formulaire sur la feuille Honda

J'ai créé 2 fonctions qui contrôlent tout ça. Ce sera très simple de faire de même pour tous tes champs numériques de tes 2 formulaires en bloquant le nombre de décimales et en laissant le choix de n'autoriser que des positifs ou négatifs. Quels sont les autres champs qui ne doivent contenir que des nombres ? A combien e décimales ? Positifs et/ou négatifs ?

Je t'ai également fait afficher le formulaire sur un double clic sur les colonnes B à N plutôt que sur un changement de sélection de cellule comme tu avais fait comme cela tu peux double cliquer sur la même cellule et surtout tu peux naviguer dans ton tableau sans que ton formulaire s'ouvre à chaque changement de cellule entre B et N (on peut bien sûr remettre comme c'était si tu préfères).

Avec une petite sécurité supplémentaire :

  • essaye de saisir une valeur négative dans TextBoxHT€Adapable
  • essaye de saisir une valeur négative dans TextBoxDPCHT€
  • à chaque caractère saisi de TextBoxHT€Adapable le pendant TTC se met à jour
  • à chaque caractère saisi de TextBoxDPCHT€ le pendant TTC se met à jour
  • Bonjour Alex,

    Whooaaaouuuu, tu t'es amusé grave ! :)

    le code d'appel sur la page Honda est super bien fait, facile à comprendre et à reproduire. MERCI

    Il y a juste une chose qu'il faudrait remettre en place, c'est la saisie du point que l'on transforme en virgule. Car, selon le clavier qu'on a et les paramètre d'excel, sur le pavé numérique l'utilisateur Lambda peut avoir un point ou une virgule. il ne faut pas que ce soit bloquant.

    je n'ai pas tout compris dans ton module perso, mais visiblement, c'est efficace.

    il y a seulement le champ quantité qu'on doit aussi mettre en nombre et à zéro décimale.
    Là, il faut que je mange sinon je vais tomber.
    Je verrai ça ce soir si j'y parviens moi-même.

    et par la suite, dupliquer ça sur le formulaire AjouterHonda.
    Justement, quand j'ajoutais une référence à mon tableau, j'avais le formulaire de Modification qui s'affichait 2 fois, il fallait le fermer 2 fois mais l'enregistrement se faisait correctement quand même.
    J'ai un autre fichier excel qui utilise ce paramétrage, je vais donc lui appliquer ces nouveaux paramètres sur la page.

    Sur le fichier Honda, je vais devoir y mettre des images dans le coin haut à gauche du formulaire laissé libre.
    Il y a du boulot à ce que j'ai vu dans les discussions sur le forum.

    Un grand MERCI à toi.

    Bonsoir Alex,

    Pour la saisie des quantités, j'ai modifié mon codage à ma sauce.

    Private Sub TextBoxQuantité_AfterUpdate()
        ' Quantité nécessaire pour 1 véhicule
        Dim valeur_quantité As String
        valeur_quantité = Me.TextBoxQuantité
    
            If IsNumeric(valeur_quantité) Then
                TextBoxQuantité = valeur_quantité
                'formater TextBoxDPCHT€
                TextBoxQuantité = Format(valeur_quantité, "#,##0")
            Else
                'vider la valeur
                valeur_quantité = ""
                ' vider la textbox et afficher un message d'alerte
                TextBoxQuantité = ""
                MsgBox ("Vous ne devez saisir QUE des CHIFFRES" & Chr(10) & vbCrLf & _
                        "En cas d'erreur de saisie, la valeur enregistrée précédemment dans le classeur sera conservée."), vbExclamation, ".       FORMAT DE Quantité de pièce nécessaire INCORRECT"
            End If
    End Sub

    Dans le bouton SAUVEGARDER, j'ai mis ça ( . Value ) pour que la valeur soit au format nombre, et ça semble fonctionner

        Cells(NumLigne, 2) = TextBoxQuantité.Value        ' colonne B     Quantité au format nombre !

    Je vais ensuite essayer de le mettre à la tienne, mais j'avoue que ma pauvre cervelle est mise à rude épreuve.
    Je vais d'abord tenter de commenter ton fichier de fonctions pour le comprendre, le communiquer ici, tu me diras si j'ai faux.

    Problème N°1 , non bloquant

    la textbox du prix Adaptable TTC affiche 0,00 quand il n'y a pas de prix HT. C'est moche.

    2025 05 07 194735

    J'avais mis une ligne de code qui faisait que si la ligne HT était vide, ça n'affichait rien.
    Je pense que cela résoudrait les 2 problèmes. Pas sûr.

    stp, j'ai repris ton fichier, ajouté le contrôle de la textBox quantité.

    NB : Depuis la version C j'ai mis à jour plusieurs références, le fichier version F tient compte de ces 2 changements.


    Problème N°2 , bloquant

    Lorsque le Dernier Prix Connu HT en € est manquant , la cellule du tableau affiche un tiret. (colonne P)
    C'est normal, c'est grâce à la formule de calcul dont tu parlais.

    Comme c'est un caractère qui est exclu de la saisie, ça bloque au moment de sauvegarder.

    2025 05 07 194832 2025 05 07 194714 2025 05 07 194620

    La solution à laquelle je pense, serait de NE PAS bloquer la validation.
    Ce n'est pas une case prévue pour la saisie. Seules les cases en HT sont prévues pour cela.

    Problème N°2 résolu en rétablissant la formule dans la colonne P

    =[@[DPC_HT_€]]*(1+Tab_TVA[TVA])
    8honda-2025-f.xlsm (405.71 Ko)

    Bonjour Patrice,

    Il y a juste une chose qu'il faudrait remettre en place, c'est la saisie du point que l'on transforme en virgule. Car, selon le clavier qu'on a et les paramètre d'excel, sur le pavé numérique l'utilisateur Lambda peut avoir un point ou une virgule. il ne faut pas que ce soit bloquant.

    Je me sers du code ASCII donc normalement pas de souci. 1 caractère = 1 code ASCII quel que soit sa position sur le clavier

    il y a seulement le champ quantité qu'on doit aussi mettre en nombre et à zéro décimale.

    Non. Il y avait également tout tes champs d'historique de relevé de prix (de 98, 99 ...) --> c'est fait

    Quantité --> c'est fait

    J'ai également regardé et modifié en (grosse) partie le code de "sauvegarder". Tes champs de formulaire sont maintenant bien reportés dans la feuille. Le tout au bon format (numérique en numérique). Les formules de calcul TTC et les mises en forme des cellules seront recréées à chaque fois.

    NB1 : comme j'ai compris dans ton code existant si un champs de relevé d'historique de prix ou de quantité ne contient pas de valeurs dans ton formulaire alors l'ancienne valeur du tableau est gardée. Discutable mais c'est ton choix. Tu ne pourras pas effacer une valeur erronée par une valeur vide via le formulaire du coup...

    NB2 : on pourrait faire plus propre en ordonnançant le report de ces valeurs par ordre de colonnes de la feuille...

    Manque le contrôle de la date mais là plus envie.

    Bonsoir Alex,

    Je me sers du code ASCII donc normalement pas de souci. 1 caractère = 1 code ASCII quel que soit sa position sur le clavier

    Là, je n'ai rien compris. (la façon dont ça fonctionne)

    7honda-2025-g.xlsm (459.06 Ko)

    Si tu peux développer, je suis preneur.

    un grand MERCI encore, c'est topissime.
    on avait une erreur pour les champs 400E et 500E en bas du formulaire, les colonnes appelées étaient N et O au lieu de AN et AO.
    J'ai bien sûr corrigé.
    J'ai commenté les lignes ajoutées et ré indenté les lignes de code. Ça m'a permis de faire le tour de tout ce que tu as corrigé.

    Au fait, bien vu pour les taux de TVA selon les années.
    En commentant les lignes de code, ça serait facile de faire évoluer le tableau si besoin.

    ton NB1 : on peut toujours l'effacer via le tableau. Le cas sera rarissime.

    ton NB2 : c'est plus facile ainsi, pour moi, pour retrouver les lignes de code selon la disposition du formulaire.
    Pour le contrôle de la date, c'est inutile car il n'y a pas de fonction qui utilise ce champ, c'est juste informatif.

    Je vais donc m'atteler à appliquer tout ça au formulaire AjouterHonda et garder mon énergie pour faire une fonction de recherche dans la base et la possibilité d'y ajouter une image.
    C'est l'objet d'un autre sujet.

    Et voici pour la date. L'utilisateur ne peut saisir que des chiffres et la date résultante ne peut pas être incorrecte (calendairement parlant j'entends car je ne peux pas contrôler son exactitude mais on pourrait mettre un contrôle pour qu'elle soit <= à la date du jour).

    Tu avais raison. Il manquait bien les champs 400E et 500E dans la partie "sauvegarder" et pour info ces colonnes n'étaient pas bonnes non plus dans l'initialize.

    Il manquait aussi la sélection.

    J'ai vérifié que tous les champs sont bien repris en initialize et reportés en "sauvegarder" (uniquement le listing des champs je n'ai pas vérifié la cohérence entre les noms et les colonnes).

    Concernant la date une fois saisi le jour le curseur passe automatiquement dans le champs du mois puis celui de l'année et comme chacun des champs est verrouillé pour ne recevoir que des chiffres on obtient une date complète qui est ensuite contrôlée. Toujours pas besoin de saisir les "/".

    J'ai vu ta question sur les ascii. Je t'expliquerai comment j'ai fait.

    Avec le contrôle des numériques en initialize en +

    J'ai ajouté le contrôle de la date, des valeurs numériques et des erreurs Excel (pour les valeurs numériques) à l'initialisation.

    bonjour le fil,

    @Alex020181, un userform avec 98 "controls", c'est souvent assez difficile à manipuler et un "class-module" est peut-être trop compliqué.

    Bon, on peut créer des boucles pour traiter ces controls et si on assigne une etiquette à chaque control, on peut créer un lien entre certains controls et votre TS. Je vous joins une première macro pour vous montrer. Vous pouvez par exemple utiliser le numéro de la colonne du TS au "tag" du control et ainsi copier les "textboxes" vers leur colonne correspondantes. Comme ca, vos macros seront beaucoup plus simple.

    Sub test()
         Dim N, i, Cntrl, Tbl
    
         With AjouterHonda                       'cet userform
              N = .Controls.Count                'nombre de "controls" dans cet UF
              ReDim Tbl(0 To N - 1, 1 To 5)      'matrice pour récupérer les propriétés des controls
    
              On Error Resume Next               'éviter certaines erreurs (pas tous les propriétés existent)
              For i = 0 To N                     ' attention premier control est 0 !!!
                   Set Cntrl = .Controls(i)      'le control
                   Tbl(i, 1) = i
                   Tbl(i, 2) = TypeName(Cntrl)   'textbox,label,combobox,...
                   Tbl(i, 3) = Cntrl.Name        'le nom assigné
                   Tbl(i, 4) = Cntrl.Value       'le valeur actuel
                   Tbl(i, 5) = Cntrl.Tag         'on peut assigner ce tag pour faire quelque chose
              Next
              On Error GoTo 0
         End With
    
         With Sheets("N° Colonnes").Range("A10").Resize(N - 1, 5)
              .Value = Tbl
              .EntireColumn.AutoFit
         End With
    
    End Sub

    Et un TS, si on ajoute une ligne, il ne faut plus mettre à jour les numberformats et les formules.

    Edit : macro "Test"

    Bonjour à vous deux.
    Je vois que mon sujet vous passionne !

    @Alex
    Le contrôle de la date ne fonctionne pas. J'ai mis une date au 45/18/00 et ça a "passé crème" comme dirait ma fille. (24 ans).
    et même si la date est correcte, elle n'est pas enregistrée.
    Le bouton " aujourd'hui " n'est plus opérationnel.
    Pour la date, ne serait ce pas plus facile d'utiliser la fonction DatePiker ? mais sincèrement, ne perd pas ton temps là dessus. Elle n'est là qu'à titre indicatif.

    J'avais bien vu une erreur de chevrons dans le contrôle que tu as corrigé ainsi.

    ElseIf ascii_origine < 48 Or ascii_origine > 57 Then

    Mais je veux bien que tu prennes du temps à m'expliquer cet histoire de control de caractère ascii .

    Je sais ce que sont les caractères Ascii, mais je n'ai pas compris ton code/contrôle.


    @Bsalv

    Bonjour Bart,

    Je te remercie de vouloir m'aider, sincèrement, ça me touche.

    J'ai testé 1 ajout de pièce et j'ai pu saisir et enregistrer une lettre pour la quantité.
    J'avoue sincèrement ne pas comprendre du tout comment fonctionne ton code qui m'a l'air bien compliqué.

    Peux tu expliqué ce bout de code stp ? il se passe quoi s'il y a une erreur ?

    On Error GoTo 0

    J'ai bien vu que tu as complété l'onglet des numéros de colonnes.

    L''onglet supplémentaire avec les numéros de cellule, nom de textbox, etc. , est il là en utilitaire personnel ou bien est il utilisé par les Modules ?

    Par exemple, comment empêcher la saisie de lettres là où on attend un ou des chiffres ?
    Merci d'avance.

    Merci à vous deux en tout cas.

    re,

    pour modifier tout, c'est peut-être trop tard pour ce fichier, mais pour un autre project ...

    on commence avec un TS comme celui dans la feuille "Blad1", première colonne est le nom du "control" (donc le textbox ou le combobox) et la 2eme colonne c'est le numéro de la colonne dans le TS "tableau1". Les controls sans lien, on les oublie ou on met rien dans la 2eme colonne. On peut faire la même chose pour l'autre userform.

    Maintenant, j'au une macro "Honda", si on la lance, on ouvre l'userform "ajouterhonda" et la macro "...initialize" appèle la macro "MesTags" qui assigne ce numéro au tag des controls (et plus tard éventuellement aussi des autres propriétés, par exemple pour vérifier si la valeur doit être positif ou ...). Et pour ce teste, il active aussi le bouton "ajouter".

    Bon, si vous ajoutez maintenant des infos pour certains textboxes et/ou comboboxes et puis vous poussez le bouton "ajouter", (pour le moment sans aucune vérification) les valeurs sont ajouté dans une nouvelle ligne du TS. Vous voyez, la macro "CB_Ajouter_Click()" est vraiment simple. Si plus tard, vous insérez ou supprimez des colonnes ou des controls, vous n'avez qu'à modifier le TS de la feuille "blad1", la macro, on ne la modifie plus.

    Maintenant, il y a 45 textboxes et comboboxes, je crois, donc c'est plus facile de créer une macro paramétrée qui fonctionne pour x controls au lieu d'écrire x macros individuelles.

    1. pour le moment, il n'y a plus ces "on error goto 0" ou "on error resume next", j'essaie à éviter ces constructions. https://learn.microsoft.com/fr-fr/office/vba/language/reference/user-interface-help/on-error-stateme...

    2. le tableau de la feuille "blad1" est utilisé à l'initialisation de l'userform pour assigner les numéros des colonnes à certains textboxes et comboboxes.

    3. il n'y a pas encore des vérifications pour des lettres ou virgules/points, mais cela est assez facile à appliquer.

    OK me revoilà. Je me lève alors je prends mon p'tit dej et je suis à vous 2.

    Rechercher des sujets similaires à "intialiser nombre decimales afficher userform"