Microsoft 365 Vba affichage Numérique TextBox

974RE

XLDnaute Occasionnel
Soan, Le Forum,
Je rencontre un problème d'affichage sur des TextBox de l'USF Modifier: après avoir saisie un nombre, les textBox (2 à 13 donc Janvier à Décembre) n'affichent pas les décimales si elles sont à 0 ( saisie: 20,10 affichage textBox = 20,1). Apparemment, il y aurait un problème sur les codes concernant ces TexBox: impossible de forcer le format.
J'ai également un "beug" qui intervient après la validation du montant saisie: si les cellules du tableau (Janvier à Décembre) sont vides: "Incompatibilité de Type" sur les lignes "Range("E" & Ligne).Value = CDbl(TextBox3.Value). Il est nécessaire que les cellules soient vides, car cela me permet de voir que j'ai loupé la saisie d'une ligne. Si la consommation est à 0, cela signifie qu'il n'y a pas de loupé: la consommation est à 0,00.
Ci-joint le fichier.
Avec tous mes remerciements.
 

Pièces jointes

  • Essai Contrôle Facturation Mai 2021.xlsm
    159.4 KB · Affichages: 48

Piment

XLDnaute Occasionnel
Patrick je ne comprends pas: j'ouvre l'UsF Modifier ou Ajouter, je vais sur le mois de juin, je tape 100.00 il actualise ma TextBox14 au fur et à mesure que je tape les chiffres, ma TextBox14 s'actualise et le mois de Juin m'affiche bien 100.00, quand je valide il me met bien 100.00 dans la cellule Juin du tableau et ma TextBox15 m'affiche bien le total. Un peu plus haut tu me disais que le format fmt1 et fmt2 n'est pas numérique, j'ai un cherché et j'ai trouvé des sites qui me disent que ce format est la ligne de code VBA pour le numérique: #,##0.00 pour des nombres à deux décimales.
Tu comprends la confusion qui est la mienne!🤣🤣😇
 

patricktoulon

XLDnaute Barbatruc
je vais etre un peu plus explicit
voila ton code initial event classe txtb
VB:
Private Sub TxtB_change()
  Dim i%, tmpVal, mem As Double, tmp As String
  If Right(TxtB.Value, 1) = "." Then TxtB.Value = Replace(TxtB.Value, ".", ",")
  For i = 2 To 13
    If Frame1.Controls("TextBox" & i) < 0 Or Frame1.Controls("TextBox" & i) = 0 Then
    Frame1.Controls("TextBox" & i) = Format(Frame1.Controls("TextBox" & i), "-0.00")
    Else
    Frame1.Controls("TextBox" & i) = Format(Frame1.Controls("TextBox" & i), "0.00")
    End If
    tmpVal = Modifier.Frame1.Controls("TextBox" & i).Value
    If tmpVal <> "" And IsNumeric(tmpVal) Then
        mem = mem + Modifier.Frame1.Controls("TextBox" & i).Value
    End If
   Next i
 
  Modifier.Frame1.TextBox14 = mem
 
End Sub
dis mois qu'est ce qu'est sensée faire cette ligne d’après toi au moment ou tu tape un chiffre (juste un!!)dans un événement change
VB:
  Frame1.Controls("TextBox" & i) = Format(Frame1.Controls("TextBox" & i), "0.00")
maintenant met un apostrophe devant pour la bloquer et recommence le test
tu vois une différence toi ?
 

patricktoulon

XLDnaute Barbatruc
d'accords fichier post 41
même question
Private Sub TxtB_change()
Dim chn$, mem#, i As Byte
If Right$(TxtB, 1) = "." Then TxtB = Replace$(TxtB, ".", ",")
For i = 2 To 13
With Modifier.Frame1.Controls("TextBox" & i)
chn = .Value: If IsNumeric(chn) Then mem = mem + CDbl(chn)
End With
Frame1.Controls("TextBox" & i) = Format(chn, fmt1)
Next i
Modifier.Frame1.TextBox14 = mem
End Sub
avec la ligne!!!!
demo7.gif



et en bloquant la ligne
demo7.gif


c'est bonnet blanc blanc bonnet ;) ;) ;)
et c'est partout comme ça dans ton code
 

Piment

XLDnaute Occasionnel
Tu veux dire qu'il faut faire de manière à entrer que deux décimale? Amener le curseur sur la le nom me permet d'aller chercher dans le tableau le nom de l'agent pour lequel je vais ajouter ou modifier le montant du mois. Ce qui me permet de vérifier qu'il s'agit bien de cet agent. La sélection du nom ne sert qu'à cela.
 

patricktoulon

XLDnaute Barbatruc
ben en fait je regarde depuis toute a l'heure il faut modifier partout 🤣
en l'etat si on ne regarde pas le nombre de décimales l'event peut rester comme suit
VB:
Private Sub TxtB_change()
    Dim mem#, i As Byte
    If Right$(TxtB, 1) = "." Then TxtB = Replace$(TxtB, ".", ",")
      For i = 2 To 13
    With Modifier.Frame1.Controls("TextBox" & i)
         If IsNumeric(.Value) Then mem = mem + CDbl(.Value)
    End With
      Next i
    Modifier.Frame1.TextBox14 = mem
End Sub
 

patricktoulon

XLDnaute Barbatruc
re
VB:
'j'ai viré les deux events textbox14 et 15 il ne sont pas necéssaires

Private Sub TxtB_change()
    Dim mem#, i As Byte
    If Right$(TxtB, 1) = "." Then TxtB = Replace$(TxtB, ".", ",")
    If UBound(Split(TxtB, ",")) > 1 Then TxtB = ""    'punition si tu tape deux fois  un  separateur( on efface le textbox )
    For i = 2 To 13
        With Modifier.Frame1.Controls("TextBox" & i)
            If IsNumeric(.Value) Then mem = mem + CDbl(.Value)
        End With
    Next i
    Modifier.Frame1.TextBox14 = Format(mem, fmt1)
End Sub

VB:
Private Sub UserForm_Activate()
    Dim ctrl, J&, a&
    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("B" & J) & "-" & Ws.Range("A" & J).Text
        Next J
    End With
    For Each ctrl In Frame1.Controls    'j'exclu aussi le textbox15 de la classe ça posait probleme aussi plus tard
        If TypeName(ctrl) = "TextBox" And Not " TextBox15 TextBox14 " Like "*" & ctrl.Name & "*" Then
            a = a + 1: Set cls(a).TxtB = ctrl
        End If
    Next ctrl
    TextBox15 = Format(WorksheetFunction.Sum(Range("Tableau1[Total]")), fmt1)    'la somme directe avec la fonction adéquoite
End Sub

VB:
Private Sub ComboBox1_Change()
    Dim i As Byte
    With ComboBox1
        If .ListIndex = -1 Then
            For i = 1 To 13: Controls("TextBox" & i) = "": Next i
        Else
            Textbox1 = Ws.Cells(.ListIndex + 2, "B")
            For i = 2 To 13: Controls("TextBox" & i) = Format(Ws.Cells(.ListIndex + 2, i + 1), fmt1): Next i
            Cells(.ListIndex + 2, 2).Select
        End If
    End With
End Sub
et enfin
VB:
Private Sub Valider_Click()
'Correspond au programme du bouton Modifier
    Dim MaSomme#, MC%, Ligne&, MPL&, MDL&

    If MsgBox("Etes-vous certain de vouloir modifier la Fiche?", vbYesNo, "Demande de confirmation") = vbYes Then
       With ComboBox1: If .ListIndex = -1 Then Exit Sub Else Ligne = .ListIndex + 2: End With
        Ws.Cells(Ligne, 2) = Textbox1
        Ws.Columns("C:N").NumberFormat = fmt1
        Ws.Columns("O").NumberFormat = fmt2
        On Error Resume Next
        For i = 2 To 13
            With Controls("TextBox" & i)
                If .Value <> "" Then
                    Ws.Cells(Ligne, i + 1).Value = Trim(.value) * 1
                Else
                    Ws.Cells(Ligne, i + 1).Value = ""
                End If
            End With
        Next

       ' Ws.Range("C" & Ligne).Value = Trim(TextBox2) * 1
        'Ws.Range("D" & Ligne).Value = Trim(TextBox3) * 1
       ' Ws.Range("E" & Ligne).Value = Trim(TextBox4) * 1
        'Ws.Range("F" & Ligne).Value = Trim(TextBox5) * 1
        'Ws.Range("G" & Ligne).Value = Trim(TextBox6) * 1
        'Ws.Range("H" & Ligne).Value = Trim(TextBox7) * 1
        'Ws.Range("I" & Ligne).Value = Trim(TextBox8) * 1
        'Ws.Range("J" & Ligne).Value = Trim(TextBox9) * 1
        'Ws.Range("K" & Ligne).Value = Trim(TextBox10) * 1
        'Ws.Range("L" & Ligne).Value = Trim(TextBox11) * 1
        'Ws.Range("M" & Ligne).Value = Trim(TextBox12) * 1
        'Ws.Range("N" & Ligne).Value = Trim(TextBox13) * 1
        'Ws.Range("O" & Ligne).Formula = "=SUM(C" & Ligne & ":N" & Ligne & ")"
        'Err.Clear

        'If (TextBox2) = "" Then Range("C" & Ligne).ClearContents
        'If (TextBox3) = "" Then Range("D" & Ligne).ClearContents
        'If (TextBox4) = "" Then Range("E" & Ligne).ClearContents
        'If (TextBox5) = "" Then Range("F" & Ligne).ClearContents
        'If (TextBox6) = "" Then Range("G" & Ligne).ClearContents
        'If (TextBox7) = "" Then Range("H" & Ligne).ClearContents
        'If (TextBox8) = "" Then Range("I" & Ligne).ClearContents
        'If (TextBox9) = "" Then Range("J" & Ligne).ClearContents
        'If (TextBox10) = "" Then Range("K" & Ligne).ClearContents
        'If (TextBox11) = "" Then Range("L" & Ligne).ClearContents
        'If (TextBox12) = "" Then Range("M" & Ligne).ClearContents
        'If (TextBox13) = "" Then Range("N" & Ligne).ClearContents
    End If

    'MC = 15    'Ma Colonne
    'MPL = 2    ' Ma Première Ligne
    'MDL = Cells(Rows.Count, "O").End(xlUp).Row - 1    'Ma Dernière Ligne
    'MaSomme = 0

    'For Ligne = MPL To MDL
        'MaSomme = MaSomme + Cells(Ligne, MC).Value
    'Next Ligne
    'TextBox15 = MaSomme
  TextBox15 = Format(WorksheetFunction.Sum(Range("Tableau1[Total]")), fmt1)    'la somme directe avec la fonction adéquoite

    Worksheets("Top10Conso").Select: Tri
    Worksheets("Controle").Select
End Sub
;)
 
Dernière édition:

Piment

XLDnaute Occasionnel
re
VB:
'j'ai viré les deux events textbox14 et 15 il ne sont pas necéssaires

Private Sub TxtB_change()
    Dim mem#, i As Byte
    If Right$(TxtB, 1) = "." Then TxtB = Replace$(TxtB, ".", ",")
    If UBound(Split(TxtB, ",")) > 1 Then TxtB = ""    'punition si tu tape deux fois  un  separateur( on efface le textbox )
    For i = 2 To 13
        With Modifier.Frame1.Controls("TextBox" & i)
            If IsNumeric(.Value) Then mem = mem + CDbl(.Value)
        End With
    Next i
    Modifier.Frame1.TextBox14 = Format(mem, fmt1)
End Sub

VB:
Private Sub UserForm_Activate()
    Dim ctrl, J&, a&
    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("B" & J) & "-" & Ws.Range("A" & J).Text
        Next J
    End With
    For Each ctrl In Frame1.Controls    'j'exclu aussi le textbox15 de la classe ça posait probleme aussi plus tard
        If TypeName(ctrl) = "TextBox" And Not " TextBox15 TextBox14 " Like "*" & ctrl.Name & "*" Then
            a = a + 1: Set cls(a).TxtB = ctrl
        End If
    Next ctrl
    TextBox15 = Format(WorksheetFunction.Sum(Range("Tableau1[Total]")), fmt1)    'la somme directe avec la fonction adéquoite
End Sub

VB:
Private Sub ComboBox1_Change()
    Dim i As Byte
    With ComboBox1
        If .ListIndex = -1 Then
            For i = 1 To 13: Controls("TextBox" & i) = "": Next i
        Else
            Textbox1 = Ws.Cells(.ListIndex + 2, "B")
            For i = 2 To 13: Controls("TextBox" & i) = Format(Ws.Cells(.ListIndex + 2, i + 1), fmt1): Next i
            Cells(.ListIndex + 2, 2).Select
        End If
    End With
End Sub
et enfin
VB:
Private Sub Valider_Click()
'Correspond au programme du bouton Modifier
    Dim MaSomme#, MC%, Ligne&, MPL&, MDL&

    If MsgBox("Etes-vous certain de vouloir modifier la Fiche?", vbYesNo, "Demande de confirmation") = vbYes Then
       With ComboBox1: If .ListIndex = -1 Then Exit Sub Else Ligne = .ListIndex + 2: End With
        Ws.Cells(Ligne, 2) = Textbox1
        Ws.Columns("C:N").NumberFormat = fmt1
        Ws.Columns("O").NumberFormat = fmt2
        On Error Resume Next
        For i = 2 To 13
            With Controls("TextBox" & i)
                If .Value <> "" Then
                    Ws.Cells(Ligne, i + 1).Value = Trim(.value) * 1
                Else
                    Ws.Cells(Ligne, i + 1).Value = ""
                End If
            End With
        Next

       ' Ws.Range("C" & Ligne).Value = Trim(TextBox2) * 1
        'Ws.Range("D" & Ligne).Value = Trim(TextBox3) * 1
       ' Ws.Range("E" & Ligne).Value = Trim(TextBox4) * 1
        'Ws.Range("F" & Ligne).Value = Trim(TextBox5) * 1
        'Ws.Range("G" & Ligne).Value = Trim(TextBox6) * 1
        'Ws.Range("H" & Ligne).Value = Trim(TextBox7) * 1
        'Ws.Range("I" & Ligne).Value = Trim(TextBox8) * 1
        'Ws.Range("J" & Ligne).Value = Trim(TextBox9) * 1
        'Ws.Range("K" & Ligne).Value = Trim(TextBox10) * 1
        'Ws.Range("L" & Ligne).Value = Trim(TextBox11) * 1
        'Ws.Range("M" & Ligne).Value = Trim(TextBox12) * 1
        'Ws.Range("N" & Ligne).Value = Trim(TextBox13) * 1
        'Ws.Range("O" & Ligne).Formula = "=SUM(C" & Ligne & ":N" & Ligne & ")"
        'Err.Clear

        'If (TextBox2) = "" Then Range("C" & Ligne).ClearContents
        'If (TextBox3) = "" Then Range("D" & Ligne).ClearContents
        'If (TextBox4) = "" Then Range("E" & Ligne).ClearContents
        'If (TextBox5) = "" Then Range("F" & Ligne).ClearContents
        'If (TextBox6) = "" Then Range("G" & Ligne).ClearContents
        'If (TextBox7) = "" Then Range("H" & Ligne).ClearContents
        'If (TextBox8) = "" Then Range("I" & Ligne).ClearContents
        'If (TextBox9) = "" Then Range("J" & Ligne).ClearContents
        'If (TextBox10) = "" Then Range("K" & Ligne).ClearContents
        'If (TextBox11) = "" Then Range("L" & Ligne).ClearContents
        'If (TextBox12) = "" Then Range("M" & Ligne).ClearContents
        'If (TextBox13) = "" Then Range("N" & Ligne).ClearContents
    End If

    'MC = 15    'Ma Colonne
    'MPL = 2    ' Ma Première Ligne
    'MDL = Cells(Rows.Count, "O").End(xlUp).Row - 1    'Ma Dernière Ligne
    'MaSomme = 0

    'For Ligne = MPL To MDL
        'MaSomme = MaSomme + Cells(Ligne, MC).Value
    'Next Ligne
    'TextBox15 = MaSomme
  TextBox15 = Format(WorksheetFunction.Sum(Range("Tableau1[Total]")), fmt1)    'la somme directe avec la fonction adéquoite

    Worksheets("Top10Conso").Select: Tri
    Worksheets("Controle").Select
End Sub
;)
Bonjour Patrick,
Merci d'avoir apporté ta contribution à mon projet. Dans la Sub Valider, j'avais un beug: variable non définie pour i. J'ai donc déclaré la variable pour i: i&. J'ai testé et ça marche, plus de beug. Je suppose donc que la définition de cette variable est correcte. J'ai aussi rajouté: WorkSheets("Controle").Select dans la Sub Activate de l'USF pour permettre d'être positionné sur la feuille Controle. Sans le rajout de ce code, si j'étais sur la feuille Top10Conso, l'UsF s'ouvrait, mais je restais sur la feuille Top10Conso. J'ai également rajouté du code dans le ThisWorkBook pour qu'à la fermeture du fichier, il se positionne sur la feuille Controle en cellule A1.
Ce qui devrait à l'ouverture me permettre d'être sur la feuille Controle. Je pourrais le mettre aussi à l'ouverture!
Si tu veux bien valider les modif ou me proposer autres chose, je suis preneur.
Merci pour ton aide
 

patricktoulon

XLDnaute Barbatruc
Bonjour
oui si tu veux l'activation de la feuille a l'ouverture de l'usf bien que normalement il doit pouvoir travailler dessus sans l'activer sauf effectivement comme tu sélectionne la ligne dans la combo il faut que le sheet soit actif
et oui la variable i en effet n’était pas déclarée dans valider tu peux aussi supprimer toutes celles qui ne sont plus nécessaires

après sur cet userform je vois pas trop ce que l'on pourrait faire de plus
 

Piment

XLDnaute Occasionnel
Je pense aussi que le travail sur cet userform est terminé et cela grâce à vos apports.
Merci à tous.
J'ai encore deux ou trois trucs à cogiter et je mettrais ensuite le fichier à disposition.
A bientôt et merci encore.
 

Piment

XLDnaute Occasionnel
Alors, j'ai essayé de relancer le Activate de l'userform en mettant à la fin de la Sub Valider: Unload Me, puis Modifier.Show.
Mais j'ai un problème que je ne comprends absolument pas: lorsque je fais "valider" il alimente bien la cellule du tableau mais j'ai un phénomène qui se produit, la cellule A1 du tableau est sélectionné, et il m'affiche les 4 premières lignes suivi de la ligne 34 et suivants. Ci-dessous image de ce qui apparait.
De plus, après avoir valider, l'UsF se vide bien, normal puisqu'il est fermé et réouvert, je saisi une nouvelle donnée, je valide et rien ne se passe. Je quitte (bouton Quitter) l'UsF et c'est à ce moment là qu'il met à jour la cellule modifiée, et il ferme l'UsF.
Je n'ai pas fait ce qu'il fallait apparemment:(:(
J'ai donc besoin de ton éclairage.
Merci à toi.
Sans titre.jpg
 

Discussions similaires

Réponses
7
Affichages
2 K