Microsoft 365 vba format numérique textBox

Piment

XLDnaute Occasionnel
Bonjour le Forum,
J'ai un soucis de format numérique de TextBox:
mes TextBox de l'USF "Modifier ou Ajouter Dépenses Mensuelles" lors de la validation ne renvoi pas le bon format numérique dans les cellules. Lorsque je rentre un nombre via l'USF, si j'utilise le point du pavé numérique pour les décimales, j'ai un beug: "incompatibilité de type". Or, j'ai vérifié et toutes les cellules du tableau sont en format "Nombre".
Si j'utilise la virgule du clavier, il m'insère le nombre saisi mais sans les décimales.
Ci-joint fichier test.
Si quelqu'un pouvais y jetais un œil et m'aider.
Merci beaucoup de m'accorder quelques instants.
 

Pièces jointes

  • Essai Contrôle Facturation.xlsm
    155.1 KB · Affichages: 14
Solution
Bonjour Roblochon
qu y a til de compliqué dans le code ? qui ne serait pas abordable après moins d'une heure d’apprentissage sur les éléments clé d'une classe
vu le code du userform a la base je pense quand même qu'il est au niveau de comprendre 6 lignes
par ce que c'est exactement ça 6 lignes ;)
a moins que ça ne soit pas lui qui ai codé l'userform au quel cas là on y peu rien
si mr se contente de coller des codes dans les modules sans les comprendre
je n'es donc pas , moi de mon coté a prendre cela en considération
et le forum est la pour ça on comprends pas on pose des questions c'est facile

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

En haut du module du userform Modifier vous trouverez cette sub générique du calcul du montant annuel, qui en même temps remplacera les points (".") par le séparateur décimal du système
souvent on fait cette opération de remplacement sur évènement key_press mais dans votre case, puisque vous utilisez afterUpdate, on peut s'en passer.
VB:
'
' Méthode personnalisée du calcul du montant annuel
Private Sub SetMontantAnnuel()
    Dim i%, mem As Double
    Dim sep As String: sep = Application.DecimalSeparator
    For i = 2 To 13
        With Me.Controls("TextBox" & i)
            If .Value <> "" Then
                .Value = Replace(.Text, ".", sep)
                mem = mem + CDbl(.Value)
            End If
        End With
    Next i
    Me.TextBox14 = mem
End Sub

Cette méthode est appelée à chaque évènement After_Update des textbox.

Il vous restera à modifier votre sub d'enregistrement en remplaçant les Val(TextBoxX) par Cdbl(TextBoxX)
Val accepte le point comme séparateur décimal mais pas la virgule. Val s'arrête au premier caractère non reconnu par lui.
Cdbl() n'accepte que le séparateur décimal du système.

Cordialement
 

Pièces jointes

  • Essai Contrôle Facturation.xlsm
    158.7 KB · Affichages: 14

patricktoulon

XLDnaute Barbatruc
bonjour
tu prend tout le code de ton userform tu le supprime et tu lui recolle celui ci
j'en ai profité pour classer les 12 textbox qui faisaient la meme chose
CA fait une réduction de code importante
tu peux te servir du point du pavé numerique comme décimal il est modifier automatiquement en virgule
et pour finir on prend pas val(ton textbox) mais cdbl(tontextbox)(qu'il y est un decimal ou pas )
Bonne journée ;)
VB:
Option Explicit
Dim Ws As Worksheet
Dim SelectedIndex As Integer
Public WithEvents TxtB As MSForms.TextBox
Dim cls(1 To 15) As New Modifier
Private Sub Quitter_Click()
Unload Me 'Ferme le Formulaire
Accueil.Show 0
End Sub


Private Sub TxtB_change()
  Dim i%, mem As Double
  If Right(TxtB.Value, 1) = "." Then TxtB.Value = Replace(TxtB.Value, ".", ",")
  For i = 2 To 13
     If Modifier.Frame1.Controls("TextBox" & i).Value <> "" Then
      mem = mem + Modifier.Frame1.Controls("TextBox" & i).Value
    End If
  Next i
  Modifier.Frame1.TextBox14 = mem

End Sub

Private Sub UserForm_Activate()
Dim J As Long
    Dim i As Integer, ctrl, a&
        ComboBox2.ColumnCount = 1 'Pour la liste Civilité
    ComboBox2.List() = Array("Civilité", "Mr", "Mme")
    Set Ws = Sheets("Controle") 'Correspond au nom de l'onglet dans le fichier Excel
    With Me.ComboBox1
     For J = 2 To Ws.Range("A" & Rows.Count).End(xlUp).Row
        .AddItem Ws.Range("C" & J) & " - " & Format(Ws.Range("A" & J), "0# ## ## ## ##")
    Next J
End With
For Each ctrl In Me.Frame1.Controls
If TypeName(ctrl) = "TextBox" And ctrl.Name <> "TextBox14" Then
a = a + 1: Set cls(a).TxtB = ctrl
End If
Next

End Sub


Private Sub ComboBox1_Change()
    Dim Ligne As Long
    Dim i As Integer
    SelectedIndex = Me.ComboBox1.ListIndex
    If Me.ComboBox1.ListIndex = -1 Then
        ComboBox2.ListIndex = -1
        For i = 1 To 14
            Me.Controls("TextBox" & i) = ""
        Next i
    Else
        Ligne = Me.ComboBox1.ListIndex + 2
        ComboBox2 = Ws.Cells(Ligne, "B")
        For i = 1 To 14
            Me.Controls("TextBox" & i) = Ws.Cells(Ligne, i + 2)
        Next i
        End If
    
End Sub


Private Sub Valider_Click()
'Correspond au programme du bouton Modifier
    Dim Ligne As Long
    Dim i As Integer
    Dim L As Long
    If MsgBox("Etes-vous certain de vouloir mofifier la fiche?", vbYesNo, "Demande de confirmation") = vbYes Then
        If SelectedIndex = -1 Then Exit Sub
      
        Ligne = SelectedIndex + 2
        Ws.Cells(Ligne, "B") = ComboBox2
        For i = 1 To 14
      
            If Me.Controls("TextBox" & i).Visible = True Then
                Ws.Cells(Ligne, i + 2) = Me.Controls("TextBox" & i)
                End If
        Range("D" & Ligne).Value = CDbl(TextBox2.Value)
        Range("E" & Ligne).Value = CDbl(TextBox3.Value)
        Range("F" & Ligne).Value = CDbl(TextBox4.Value)
        Range("G" & Ligne).Value = CDbl(TextBox5.Value)
        Range("H" & Ligne).Value = CDbl(TextBox6.Value)
        Range("I" & Ligne).Value = CDbl(TextBox7.Value)
        Range("J" & Ligne).Value = CDbl(TextBox8.Value)
        Range("K" & Ligne).Value = CDbl(TextBox9.Value)
        Range("L" & Ligne).Value = CDbl(TextBox10.Value)
        Range("M" & Ligne).Value = CDbl(TextBox11.Value)
        Range("N" & Ligne).Value = CDbl(TextBox12.Value)
        Range("O" & Ligne).Value = CDbl(TextBox13.Value)
        Range("P" & Ligne).Formula = "=SUM(D" & Ligne & ":O" & Ligne & ")"
        
            Next i
            
        End If
      
End Sub
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour @patricktoulon ,

Ne pensez-vous pas que laisser progresser le demandeur à son rythme et lui laisser trouver son style d'écriture serait préférable à la grosse artillerie. Ceci en accord avec le point ci-dessous de la charte du forum :
3 - Dans la mesure du possible, les contributeurs auront une approche pédagogique afin d’expliquer leur démarche en se mettant au niveau du demandeur. Les solutions exposées en 2 mots telles que « Solution dans la pièce jointe », « Va voir sur ce lien » sont à éviter. N’oublions pas que très souvent les débutants ne connaissent rien au VBA, et ne savent même pas comment activer l’onglet « développeur ».

cordialement
 

patricktoulon

XLDnaute Barbatruc
Bonjour Roblochon
qu y a til de compliqué dans le code ? qui ne serait pas abordable après moins d'une heure d’apprentissage sur les éléments clé d'une classe
vu le code du userform a la base je pense quand même qu'il est au niveau de comprendre 6 lignes
par ce que c'est exactement ça 6 lignes ;)
a moins que ça ne soit pas lui qui ai codé l'userform au quel cas là on y peu rien
si mr se contente de coller des codes dans les modules sans les comprendre
je n'es donc pas , moi de mon coté a prendre cela en considération
et le forum est la pour ça on comprends pas on pose des questions c'est facile
 

Piment

XLDnaute Occasionnel
Messieurs bonjour,
Avant tout merci de vous êtes penché sur mon problème. C'est très gentil à vous, j'apprécie.
Effectivement, je ne suis pas l'auteur de la totalité du codage de mon fichier. Par contre, je ne me contente pas de copier les codes, j'essaye de les comprendre; mais, malheureusement je ne comprends pas tout. C'est pourquoi je réclame de l'aide quand je n'y arrive pas. Etant novice en vba.
Il faut comprendre que pour vous ce qui semble évident, pour les néophytes comme moi, c'est une montagne à franchir. Aussi je vous remercie de votre indulgence.
Cette boite de dialogue va me faciliter grandement la vie (Plus de 150 données à saisir tous les mois dans ce tableau). Je vous laisse imaginer le travail que cela demande: chercher le nom et le N° de téléphone qui va avec, saisir les montants de la facture...
Pour revenir à mon fichier, je vais de ce pas regarder attentivement ce que vous avez proposé et essayer de comprendre le pourquoi du comment. Ce qui ne veut pas dire que je saurais faire. Je peux gratter quelques notes sur ma guitares, mais je ne pense pas que je deviendrais, comme vous, un virtuose, même pas faire un concert devant 3 personnes! Mais avec votre aide, à vous du Forum, je pourrais mettre en place quelques outils qui devraient me faciliter la vie. Merci d'exister!
A bientôt
 

Piment

XLDnaute Occasionnel
Messieurs bonjour,
Je suis désolé, mais je dois revenir vers vous afin de m'aider à résoudre deux problèmes:
1) J'aurais aimé qu'après avoir fait un choix dans la textBox "Recherche" qu'une recherche s'effectue dans le tableau et que le curseur se positionne sur le nom choisi dans la texte box (cela permettrait de vérifier qu'on est sur la bonne personne);
2) J'aurais aimé également qu'après le choix dans la textBox "Recherche", si Janvier est déjà renseigné, il se positionne sur février qui est vide.
Si vous voulez bien, j'ai un beug sur les codes "Range("D" & Ligne).Value = CDbl(TextBox2.Value)" si les cellule sont vides. Il me faut tout mettre à 0,00 et là sa marche. J'aurais aimé que les cellules reste vide (par rapport à ce qui précède).
Comme vous pourrez le constater, j'ai apporté quelques modification à mon fichier.
Vous voyez que je ne me contente pas de recopier les codes qu'on a la gentillesse de donner.
Les deux problèmes soulevés plus haut j'ai essayé de les résoudre, mais en vain.
Merci de bien vouloir m'accorder un peu de votre temps.
 

Pièces jointes

  • Essai Contrôle Facturation.xlsm
    161.3 KB · Affichages: 7

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Autre question autre fil de discussion :)

La charte du forum :
3 – Le titre de la question doit être clair et comporter explicitement le sujet de la demande. Cela sous-entend qu’une nouvelle demande fait l’objet d’un nouveau fil.

Pour ma part j'ai répondu à la demande initiale.

Cordialement
 

Statistiques des forums

Discussions
315 095
Messages
2 116 169
Membres
112 676
dernier inscrit
little_b