TextBox, Arrondi et nombres imposés

Bonjour,

Voici mon problème, j'ai un userform comprenant une TextBox (TextBox1) dans lequel je récupère un nombre correspondant à une puissance (Par exemple 17,5).

Dans une seconde TextBox (TextBox2), j'aimerais afficher la puissance normalisée par rapport à la puissance de ma TextBox1.

Les puissances normalisées étant 3 ; 6 ; 9 ; 12 ; 15 ; 18 ; 24 ; 30 ; 36, pour cet exemple, la puissance normalisée à afficher serais 18.

Est ce qu'il y à un code permettant ceci ?

Je vous remercie d'avance pour vos réponses !

Bonjour Valentin, bonjour le forum,

Essaie comme ça :

Option Base 1 'décalre la limite inférieure des tableau égale à 1 (au lieu de zéro)

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) 'à l'appui sur une touche dans la textBox1
If KeyAscii = 46 Then KeyAscii = 44: Exit Sub 'si on appuie sur le point ".", c'est remplacé par une virgule, sort de la procédure
If KeyAscii = 44 Then Exit Sub 'si on appuie sur la virgule ",", sort de la procédure
If KeyAscii < 47 Or KeyAscii > 58 Then KeyAscii = 8 'touche autre touche que {0, 1, 2, 3, 4, 5, 6, 7, 8 ou 9} est effacée
End Sub

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'à la sortie de la TextBox1
Dim PN As Variant 'déclare la variable PN (tableau des Puissances Normalisées)
Dim VT As Double 'déclare la variable VT (Valeur de la TextBox1)
Dim TD(1 To 9) 'déclare la variable TD (Tableau des différences)

If Me.TextBox1.Value = "" Then VT = 0 Else VT = CDbl(Me.TextBox1.Value) 'définit la variable VT
PN = Array(3, 6, 9, 12, 15, 18, 24, 30, 36) 'définit le tableau PN des puissances normalisées
For I = 1 To 9 'boucle sur les 9 puissance normalisée
    TD(I) = Abs(PN(I) - VT) 'attribue à la variable indéxée TD(I) la valeur absolue de la différence entre la valeur de la TextBox1 et celle de la puissance normalisée de la boucle
Next I 'prochaine puissance normalisée de la boucle
For I = 1 To 9 'boucle sur les 9 éléments du tableau des différences TD
    'si l'élément est le plus petit de tous, renvoie dans la TextBox2 la puissance normalisée correspondante à l'index de TD, sort de la procédure
    If TD(I) = Application.WorksheetFunction.MIN(TD) Then Me.TextBox2.Value = PN(I): Exit Sub
Next I
End Sub

Le premier code a pour but de ne permettre que des valeurs numériques (décimales ou pas) dans la TextBox1.

Le second fait le job à la sortie de la TextBox1.

Bonjour ThauThème,

Merci beaucoup pour ton code, il fonctionne très bien et surtout ce qui est important c'est que tout est bien détaillé pour comprendre le déroulement. Etant débutant en VBA ça me permet de progresser beaucoup plus facilement.

Par contre j'ai une question concernant la ligne suivante :

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)

Sachant que ma TextBox1 récupère une valeur automatiquement (Elle n'est pas rentrée à la main) du coup la déclaration "Exit" ne m'est pas très pratique. J'ai essayé de modifier et mettre la déclaration "Change" mais du coup le code ne fonctionne plus, surement pas adapter à cette fonction ?..

Aurais-tu une solution à cela ?

Re,

Comment la TextBox1 est-elle alimenté (quel est le code) ?

Il y a plein d'autres possibilités à tester

  • BeforeUpdate (TextBox1)
  • Enter (TextBox2)
  • 1 CommandButton

Mais pour te proposer la plus adéquate il me faudrait le fichier exemple.

Alors la TextBox est alimentée via le choix d'une comboBox et ensuite le code va chercher la valeur de la bonne cellule dans mon tableau.

Private Sub ComboBox1_Change()
Ligne15 = [A15].Offset(ComboBox1.ListIndex, 0).Row
Me.TextBox1.Text = Sheets("Compteurs").Cells(Ligne15, 3)
Range("A15").Offset(ComboBox1.ListIndex, 0).Select

J'ai une base de donnée correspondant à des compteurs avec différentes informations. Dans ma Combobox1, je choisi le compteur, ce qui envoi ensuite dans la TextBox1 la puissance souscrite.

Si jamais ce n'est pas assez clair, j'essayerai de faire un petit fichier exemple car je ne peux malheureusement pas t'envoyer le fichier complet.

Bonjour,

Dans le même esprit que ThauThème mais avec une fonction que tu appelles depuis ton évènement "Change" du ComboBox.

La fonction :

Function PuissanceNomalisee(Valeur As String) As Integer

    Dim TblPN
    Dim I As Integer
    Dim PU As Single
    Dim P As Integer
    Dim PN As Integer

    TblPN = Array(3, 6, 9, 12, 15, 18, 24, 30, 36)

    'utilise le séparateur décimal du système
    Valeur = Replace(Valeur, ".", Format(0, "."))
    Valeur = Replace(Valeur, ",", Format(0, "."))

    'passage à la variable Single
    PU = CSng(Valeur)

    'boucle en partant du haut
    For I = UBound(TblPN) To 0 Step -1

        PN = CInt(TblPN(I)) 'converti

        'teste si supérieur ou égal à la puissance en cours
        If PU >= PN Then

            'si supérieur...
            If PU > PN Then

                'vérifie que ce ne soit pas au dessu de la puissance max
                'si c'est le cas, message et fin !
                If PN = TblPN(UBound(TblPN)) Then

                    MsgBox "Puissance en dehors de la plage !"
                    Exit Function

                End If

                'si c'est OK, étant supérieur, retourne la puissance de dessus
                P = CInt(TblPN(I + 1))

            'si c'est égal retourne la puissance en cours
            ElseIf PU = PN Then

                P = CInt(TblPN(I))

            End If

            Exit For

        End If

    Next I

    If P = 0 Then P = 3

    PuissanceNomalisee = P

End Function

L'appel :

Private Sub ComboBox1_Change()

    Ligne15 = [A15].Offset(ComboBox1.ListIndex, 0).Row

    Me.TextBox1.Text = PuissanceNomalisee(Sheets("Compteurs").Cells(Ligne15, 3))

    'Me.TextBox1.Text = Sheets("Compteurs").Cells(Ligne15, 3)

    Range("A15").Offset(ComboBox1.ListIndex, 0).Select

End Sub

Bonjour Valentin, Theze, bonjour le forum,

Tu peux aussi intégrer le code dans la procédure Change de la ComboBox1. Ça donnerait :

Option Base 1 'déclare la limite inférieure des tableau égale à 1 (au lieu de zéro)

Private Sub ComboBox1_Change()
Dim PN As Variant 'déclare la variable PN (tableau des Puissances Normalisées)
Dim VT As Double 'déclare la variable VT (Valeur de la TextBox1)
Dim TD(1 To 9) 'déclare la variable TD (Tableau des différences)

Ligne15 = [A15].Offset(ComboBox1.ListIndex, 0).Row
Me.TextBox1.Text = Sheets("Compteurs").Cells(Ligne15, 3)
Range("A15").Offset(ComboBox1.ListIndex, 0).Select
'...
If Me.TextBox1.Value = "" Then VT = 0 Else VT = CDbl(Me.TextBox1.Value) 'définit la variable VT
PN = Array(3, 6, 9, 12, 15, 18, 24, 30, 36) 'définit le tableau PN des puissances normalisées
For I = 1 To 9 'boucle sur les 9 puissance normalisée
    TD(I) = Abs(PN(I) - VT) 'attribue à la variable indéxée TD(I) la valeur absolue de la différence entre la valeur de la TextBox1 et celle de la puissance normalisée de la boucle
    Next I 'prochaine puissance normalisée de la boucle
    For I = 1 To 9 'boucle sur les 9 éléments du tableau des différences TD
    'si l'élément est le plus petit de tous, renvoie dans la TextBox2 la puissance normalisée correspondante à l'index de TD, sort de la procédure
    If TD(I) = Application.WorksheetFunction.Min(TD) Then Me.TextBox2.Value = PN(I): Exit Sub
Next I
End Sub

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) 'à l'appui sur une touche dans la textBox1
If KeyAscii = 46 Then KeyAscii = 44: Exit Sub 'si on appuie sur le point ".", c'est remplacé par une virgule, sort de la procédure
If KeyAscii = 44 Then Exit Sub 'si on appuie sur la virgule ",", sort de la procédure
If KeyAscii < 47 Or KeyAscii > 58 Then KeyAscii = 8 'touche autre touche que {0, 1, 2, 3, 4, 5, 6, 7, 8 ou 9} est effacée
End Sub

Bonjour Theze, Thauthème,

Je tiens à vous remercier pour votre aide ! Sa fonctionne parfaitement et c'est très clair donc un grand merci !

Rechercher des sujets similaires à "textbox arrondi nombres imposes"