IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

VBA - Vérification de saisi de 2 textbox [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    alternant ingénieur production d'energie
    Inscrit en
    Août 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : alternant ingénieur production d'energie
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2018
    Messages : 4
    Points : 2
    Points
    2
    Par défaut VBA - Vérification de saisi de 2 textbox
    Bonjour à tous,

    Je suis confronté à un problème. Je réalise une macros de calcul de surface de formes (cercle, triangle, rectangle...). je souhaite vérifier si les textbox sont remplies ou pas lors du clic sur le bouton de calcul. Cela fonctionne très lorsque je n'ai qu'une seule textbox mais j'ai un message d'erreur lorsque j'en ai 2. en fait je cherche a dire "si une des textbox ou les 2 sont vides, afficher un message d'erreur". J'utilise ce code pour une autre macros avec un seule textbox à vérifier et ça fonctionne très bien. Je ne vois pas ou est l'erreur

    Voici mon code (c'est la partie en gras qui doit poser problème) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Private Sub CommandButton4_Click()
    
    Pi = WorksheetFunction.Pi
        If ComboBox1.Value = "Cercle" Then
            TextBox6.Value = (TextBox4.Value * TextBox4.Value) * Pi
            End If
        If ComboBox1.Value = "Carré" Then
            TextBox6.Value = TextBox4.Value * TextBox4.Value
            End If
        If ComboBox1.Value = "Triangle" Then
            TextBox6.Value = (TextBox4.Value * TextBox4.Value) / 2
            End If
        If ComboBox1.Value = "Rectangle" Then
            TextBox6.Value = TextBox4.Value * TextBox5.Value
            End If
        If ComboBox1.Value = "Losange" Then
            TextBox6.Value = (TextBox4.Value * TextBox5.Value) / 2
        End If
        If TextBox4.Value = "" Then
            MsgBox "Entrer une valeur numérique positive avant de convertir"
        Else
        If TextBox5.Value = "" Then
            MsgBox "Entrer une valeur numérique positive avant de convertir"
        Else
        If texbox4.Value = "" And TextBox5.Value = "" Then
            MsgBox "Entrer une valeur numérique positive avant de convertir"
        End If
    End Sub
    Il s'agit surement d'une petite chose à régler mais je suis assez novice dans le domaine et ne comprend pas pourquoi ça ne marche pas.

    Merci pour votre aide

    Etienne

  2. #2
    Membre chevronné
    Inscrit en
    Septembre 2007
    Messages
    1 132
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 132
    Points : 1 803
    Points
    1 803
    Par défaut
    bonjour,

    En remplaçant ton code en gras par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    If texbox4.Value = "" Or TextBox5.Value = "" Then
    MsgBox "Entrer une valeur numérique positive avant de convertir"
    End If
    cela devrait résoudre ton souci.

  3. #3
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Et surtout en procédant au calcul après le test...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    Private Sub CommandButton4_Click()
       If TexBox4.Value = "" Or TextBox5.Value = ""  Or ComboBox1.Value = "" Then
          MsgBox "Entrer une valeur numérique positive avant de convertir"
       Else
          TextBox6.Value = Calcule(TexBox4.Value, TextBox5.Value, ComboBox1.Value)
       End If
    End Sub
     
    Private Function Calcule(T4 As String, T5 As String, C1 As String) As Double
    Dim Pi As Single
       Pi = WorksheetFunction.Pi
       Select Case C1
          Case "Cercle"
             Calcule = Val(T4) * Val(T4) * Pi
          Case "Carré"
             Calcule = Val(T4) * Val(T4)
          Case "Triangle"
             Calcule = (Val(T4) * Val(T4)) / 2
          Case "Rectangle"
             Calcule = Val(T4) * Val(T5)
          Case "Losange"
             Calcule = (Val(T4) * Val(T5)) / 2
       End Select
    End Function
    Ne te restera qu'à tester que les valeurs saisies dans tes TextBox sont bien des nombres.
    Cordialement,
    Franck

  4. #4
    Candidat au Club
    Homme Profil pro
    alternant ingénieur production d'energie
    Inscrit en
    Août 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : alternant ingénieur production d'energie
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2018
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour anasecu, pijaku, et merci pour vos réponses.

    anasecu j'avais essayé cette opportunité mais ça ne fonctionne pas non plus.

    pijaku, j'ai testé ton code et ça fonctionne mais uniquement pour les cas ou tu choisis les formes comprenant plusieurs paramètres (losange, triangle, rectangle) mais ça ne fonctionne pas pour les formes avec un seul paramètre (carré et cercle). Il m'affiche le message si la case est vide mais il ne me calcul pas la valeur si il y a un chiffre dedans. je ne comprend pas pourquoi...

    voici mon programme dorénavant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    Private Sub CommandButton4_Click()
    
    If TextBox4.Value = "" Or TextBox5.Value = "" Then
          MsgBox "Saisir une valeur"
       Else
          TextBox6.Value = Calcule(TextBox4.Value, TextBox5.Value, ComboBox1.Value)
       End If
    End Sub
    
    Private Function Calcule(T4 As String, T5 As String, C1 As String) As Double
       Pi = WorksheetFunction.Pi
       Select Case C1
          Case "Cercle"
             Calcule = Val(T4) * Val(T4) * Pi  --> Ici il ne calcul pas 
          Case "Carré"
             Calcule = Val(T4) * Val(T4) --> Et la non plus
          Case "Triangle"
             Calcule = (Val(T4) * Val(T5)) / 2
          Case "Rectangle"
             Calcule = Val(T4) * Val(T5)
          Case "Losange"
             Calcule = (Val(T4) * Val(T5)) / 2
       End Select
    End Function
    
    Private Sub TextBox4_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    'Ne permet d'autorisé que les caractères en 0 et 9 (numériques)
        If Not ((KeyAscii >= 48 And KeyAscii <= 57) Or KeyAscii = 8) Then
        MsgBox "Saisir une valeur numérique positive"
        KeyAscii = 0
      End If
    End Sub
    
    Private Sub TextBox5_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    'Ne permet d'autorisé que les caractères en 0 et 9(numériques)
        If Not ((KeyAscii >= 48 And KeyAscii <= 57) Or KeyAscii = 8) Then
        MsgBox "Saisir une valeur numérique positive"
        KeyAscii = 0
      End If
    End Sub

    Comme tu peux le voir j'ai rajouté les fonctions qui font que les textbox 4 et 5 n'acceptent que les caractères entre 0 et 9. Le problème peut venir d'ici car pour les cas "carré" et "cercle" j'ai initialement rendu invisible la textbox5 étant donné que je n'ai besoin que d'un seul paramètre pour calculer la surface, je ne peux donc pas les modifier.

    Merci de votre aide

    PS : Je ne sais pas comment mettre le code la fenêtre prévue a cet effet dsl !

  5. #5
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Tu n'as pas dit non plus que TextBox5 était facultatif...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Private Sub CommandButton4_Click()
    If ComboBox1.Value <> "" Then
       If TextBox4.Value = "" Then
          MsgBox "Saisir une valeur"
       ElseIf TextBox4.Value <> "" And TextBox5.Value <> "" Then
          TextBox6.Value = Calcule(ComboBox1.Value, TextBox4.Value, TextBox5.Value)
       Else
          TextBox6.Value = Calcule(ComboBox1.Value, TextBox4.Value)
       End If
    End If
    End Sub
     
    Private Function Calcule(C1 As String, T4 As String, Optional T5 As String) As Double
       Pi = WorksheetFunction.Pi
       Select Case C1
          Case "Cercle"
             Calcule = Val(T4) * Val(T4) * Pi --> Ici il ne calcul pas 
          Case "Carré"
             Calcule = Val(T4) * Val(T4) --> Et la non plus
          Case "Triangle"
             Calcule = (Val(T4) * Val(T5)) / 2
          Case "Rectangle"
             Calcule = Val(T4) * Val(T5)
          Case "Losange"
             Calcule = (Val(T4) * Val(T5)) / 2
       End Select
    End Function
    Pour mettre le code en forme, il faut :
    > le sélectionner,
    > cliquer sur l'icône # dans l'éditeur de message.
    Cordialement,
    Franck

  6. #6
    Candidat au Club
    Homme Profil pro
    alternant ingénieur production d'energie
    Inscrit en
    Août 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : alternant ingénieur production d'energie
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2018
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    En même temps que tu me répondais j'ai trifouillé un peu de mon coté et j'ai réussis à résoudre ce petit détail. j'ai repris ton code en y rajoutant juste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Private Sub CommandButton4_Click()
    If ComboBox1.Value = "Cercle" Or ComboBox1.Value = "Carré" Then
    TextBox5.Value = 1         J'ai fixé T5 a 1 par defaut pour "carré" et "cercle" et ça a fonctionné parfaitement
    End If
    If TextBox4.Value = "" Or TextBox5.Value = "" Then
          MsgBox "Entrer une valeur numérique positive avant de convertir"
       Else
          TextBox6.Value = Calcule(TextBox4.Value, TextBox5.Value, ComboBox1.Value)
       End If
    End Sub
    Private Function Calcule(T4 As String, T5 As String, C1 As String) As Double
       Pi = WorksheetFunction.Pi
       Select Case C1
          Case "Cercle"
             Calcule = Val(T4) * Val(T4) * Pi
          Case "Carré"
             Calcule = Val(T4) * Val(T4)
          Case "Triangle"
             Calcule = (Val(T4) * Val(T5)) / 2
          Case "Rectangle"
             Calcule = Val(T4) * Val(T5)
          Case "Losange"
             Calcule = (Val(T4) * Val(T5)) / 2
       End Select
    End Function
    Ta méthode fonctionne très bien aussi. Merci de ton aide et bonne continuation

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re une version un peu differente
    j'arrive un peu apres la bataille
    val te donne si je ne me trompe pas l'entier tu ne peux donc pas faire l'opération avec des nombres decimaux j'ai corrigé cela
    et j'ai ajouté un 3° argument indiquent combien tu veux de chiffres dans les decimal du resultat
    t5 et nbdecimal sont optional
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Private Sub ComboBox1_Change()
        For i = 4 To 6: Me.Controls("TextBox" & i) = "": Next
    End Sub
    '
    '
    Private Sub CommandButton4_Click()
        Select Case ComboBox1.Value
        Case "Triangle", "Lozange", "Rectangle"
            If TextBox4.Value = "" Or TextBox5.Value = "" Then MsgBox "Saisir une valeur" Else TextBox6.Value = Calcule(ComboBox1.Value, TextBox4.Value, TextBox5.Value, 1)
        Case "Cercle", "Carré"
            If TextBox4.Value = "" Then MsgBox "Saisir une valeur" Else TextBox6.Value = Calcule(ComboBox1.Value, TextBox4.Value, , 2)
        End Select
    End Sub
    '
    '
    Private Function Calcule(C1 As String, T4 As String, Optional T5 As String = "0", Optional nbdecimale = 10) As Double
        Dim tbis4#, tbis5#
        tbis4 = CDbl(Replace(T4, ".", ",")): tbis5 = CDbl(Replace(T5, ".", ","))
        Pi = WorksheetFunction.Pi
        Select Case C1
        Case "Cercle", "Carré": Calcule = (tbis4 * tbis4) * IIf(C1 = "Cercle", Pi, 1)
        Case "Triangle", "Lozange", "Rectangle": Calcule = (tbis4 * tbis5) / IIf(C1 <> "Rectangle", 2, 1)
        End Select
        Calcule = Round(Calcule, nbdecimale)
    End Function
    '
    '
    Private Sub UserForm_Activate()
        ComboBox1.List = Array("Cercle", "Carré", "Triangle", "Lozange", "Rectangle")
    End Sub
    Fichiers attachés Fichiers attachés
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  8. #8
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 524
    Points
    14 524
    Par défaut
    Bonjour,

    Citation Envoyé par patricktoulon Voir le message
    val te donne si je ne me trompe pas l'entier tu ne peux donc pas faire l'opération avec des nombres decimaux j'ai corrigé cela
    Il faudrait vérifier...
    Val prend le point en séparateur de décimale, quelque soit les paramètres régionaux.

  9. #9
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    exact Arkham je viens de verifier
    ca fait rien c'est pour le cas ou c'est une virgule(testé aussi) qui est injectée
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  10. #10
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 524
    Points
    14 524
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    re
    exact Arkham je viens de verifier
    ca fait rien c'est pour le cas ou c'est une virgule(testé aussi) qui est injectée
    Oui mais dans ton code, cdbl lui utilise les paramètres régionaux.
    Si le séparateur décimales est défini en point, le replace de point en virgule n'aura pour seul effet de provoquer une erreur.

    Mais comme il précisé qu'il n'est possible de saisir de que chiffres, il n'y a donc que des entiers à gérer...

  11. #11
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Salut,
    Val, contrairement à CDbl, réagit plutôt pas mal à une valeur nulle...
    Testez CDbl(0)...
    Cordialement,
    Franck

  12. #12
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    non non Arkham, virgule ou point dans les t4 et t5 c'est du pareil au meme il le prends (testé!)
    val n'accepte que le point
    cdbl accepte que la virgule
    cdbl(replace machin) donne un double de toute les manieres

    val(22,5) = 22
    val(22.5)=22.5
    cdbl(replace("22.5",".",","))=22.5
    cdbl(replace("22,5",".",","))=22.5
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  13. #13
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 524
    Points
    14 524
    Par défaut
    Je parlais des paramètres régionaux windows.

  14. #14
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    peut etre jouer alors avec "Application.DecimalSeparator"puisque c'est avec ca que l'application tourne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tbis4 = CDbl(Replace(T4, ".", Application.DecimalSeparator)): tbis5 = CDbl(Replace(T5, ".", Application.DecimalSeparator))
    @pijaku
    cdbl(0) donne 0 chez moi
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  15. #15
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 524
    Points
    14 524
    Par défaut
    Là tu codes encore pour un cas particulier : celui où ton séparateur décimales est paramétré en virgule. Si c'est le point et qu'on saisit une virgule ?
    Pour des données saisies on utilise habituellement cDbl sans faire de replace. On saisit avec la bonne décimale directement.
    Pour le cas particulier des données externes dont on ne connaîtrait pas le séparateur, le plus simple est d'utiliser un replace de , en . Et d'utiliser Val.
    Il faut juste bien regarder ce que fait Val, qui a un fonctionnement particulier.

    De toute façon ici le problème est résolu et ne nécessite pas plus de complexité vu les prérequis (saisie d'entiers) .

  16. #16
    Candidat au Club
    Homme Profil pro
    alternant ingénieur production d'energie
    Inscrit en
    Août 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : alternant ingénieur production d'energie
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2018
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour à tous,

    En effet patricktoulon merci d'avoir levé ce problème de décimale, ne n'avais pas pensé à tester les nombres à virgule. Alors j'ai essayé pas mal de solutions pour palier à ça et je pense avoir résolu le problème de la manière ci dessous :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    Private Sub CommandButton4_Click()
     
    If ComboBox1.Value = "Cercle" Or ComboBox1.Value = "Carré" Then
    TextBox5.Value = 1
    End If
    If TextBox4.Value = "" Or TextBox5.Value = "" Then
          MsgBox "Saisir une valeur"
       Else
          TextBox6.Value = Calcule(TextBox4.Value, TextBox5.Value, ComboBox1.Value)
       End If
    End Sub
     
    Private Function Calcule(T4 As String, T5 As String, C1 As String) As Double
     
       Pi = WorksheetFunction.Pi
       Select Case C1
          Case "Cercle"
             Calcule = Val(T4) * Val(T4) * Pi
          Case "Carré"
             Calcule = Val(T4) * Val(T4)
          Case "Triangle"
             Calcule = (Val(T4) * Val(T5)) / 2
          Case "Rectangle"
             Calcule = Val(T4) * Val(T5)
          Case "Losange"
             Calcule = (Val(T4) * Val(T5)) / 2
       End Select
    End Function
     
    Private Sub TextBox4_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
     
    TextBox4.Text = Replace(TextBox4.Text, ",", ".")
        If Not ((KeyAscii >= 48 And KeyAscii <= 57) Or KeyAscii = 8 Or KeyAscii = 44 Or KeyAscii = 46) Then
        MsgBox "Saisir une valeur numérique positive"
        KeyAscii = 0
      End If
    End Sub
     
    Private Sub TextBox5_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
     
        TextBox5.Text = Replace(TextBox5.Text, ",", ".")
        If Not ((KeyAscii >= 48 And KeyAscii <= 57) Or KeyAscii = 8 Or KeyAscii = 44 Or KeyAscii = 46) Then
        MsgBox "Saisir une valeur numérique positive"
        KeyAscii = 0
      End If
    End Sub
    En fait j'ai rajouté les caractères virgule et point au textbox_keypress, j'ai testé et il lisait bien les points mais pas les virgules donc j'ai utilisé le Replace pour remplacer les virgules par les points et du coup ça fonctionne.
    C'est peut être pas la plus belle des manières mais ça fonctionne a priori.

    Merci de votre intérêt pour mon post c'est vraiment très utile quand on est novice.

  17. #17
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bonjour
    tu t'enbete pourien avec les keypress
    tu peut faire un replace dans la fonction soit avec val soit avec cdbl

    a mettre au debut de la fonction
    avec val
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    t4=replace(t4,",","."):t5=replace(t5,",",".")
    pour cdbl j'ai deja montré

    et tu vire tes keypress

    pour reprendre mon exemple de fichier en post 7
    changer tout le code pour celui ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    Private Sub ComboBox1_Change()
        For i = 4 To 6: Me.Controls("TextBox" & i) = "": Next
    End Sub
    '
    '
    Private Sub CommandButton4_Click()
        Select Case ComboBox1.Value
        Case "Triangle", "Lozange", "Rectangle"
            ' si on veut toutes les decimales on ne met pas l'argument nbdecimale
            '
            'If TextBox4.Value = "" Or TextBox5.Value = "" Then MsgBox "Saisir une valeur" Else TextBox6.Value = Calcule(ComboBox1.Value, TextBox4.Value, TextBox5.Value)
            '
            'si on veut maitriser le nombre de decimales exemple ci dessous avec 2 decimales
            '
            If TextBox4.Value = "" Or TextBox5.Value = "" Then MsgBox "Saisir une valeur" Else TextBox6.Value = Calcule(ComboBox1.Value, TextBox4.Value, TextBox5.Value, nbdecimale:=2)
        Case "Cercle", "Carré"
            ' si on veut toutes les decimales on ne met pas l'argument nbdecimale
            '
            'If TextBox4.Value = "" Then MsgBox "Saisir une valeur" Else TextBox6.Value = Calcule(ComboBox1.Value, TextBox4.Value)
            '
            'si on veut maitriser le nombre de decimale exemple avec 2 decimales
            '
            If TextBox4.Value = "" Then MsgBox "Saisir une valeur" Else TextBox6.Value = Calcule(ComboBox1.Value, TextBox4.Value, nbdecimale:=2)
            '
        End Select
    End Sub
    '
    '
    Private Function Calcule(C1 As String, T4 As Variant, Optional T5 As Variant = "0", Optional nbdecimale As Long = 10) As Double
        T4 = Val(Replace(T4, ",", ".")): T5 = Val(Replace(T5, ",", "."))
        Pi = WorksheetFunction.Pi
        Select Case C1
        Case "Cercle", "Carré": Calcule = (T4 * T4) * IIf(C1 = "Cercle", Pi, 1)
        Case "Triangle", "Lozange", "Rectangle": Calcule = (T4 * T5) / IIf(C1 <> "Rectangle", 2, 1)
        End Select
        Calcule = Round(Calcule, nbdecimale)
    End Function
    '
    '
    Private Sub UserForm_Activate()
        ComboBox1.List = Array("Cercle", "Carré", "Triangle", "Lozange", "Rectangle")
    End Sub
    comme tu vois tu n'as pas besoins de manipuler le keypress

    quand on utilise une "function" c'est elle qui est sensée tout faire avec les données injectées et te retourner un resultat
    tu a en exemple en comentaire l'utilisation sans l'argument nbdecimale pour les 2 cas general (carré,cercle) et (triangle,lozange,rectangle) les sous cas (cercle/ rectangle) sont gérés aussi dans la fonction

    maintenant si tu veux vraiment pas gérer les decimales tu te sert de "Int" a la place d'un replace
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  18. #18
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 598
    Points : 34 286
    Points
    34 286
    Par défaut
    Salut,

    c'est encore mieux si on hardcode pas les séparateurs, et qu'on utilise les outils à disposition :
    https://jpcheck.developpez.com/tutor...ational/#LIV-7
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/04/2018, 15h06
  2. [XL-2010] Vérification de saisie TextBox
    Par tyndare36 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 25/01/2014, 09h55
  3. Cacher saisie dans un textbox VBA
    Par linkcr15 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 22/05/2012, 19h49
  4. VBA - Limiter la saisie d'une seule virgule ou point dans une TextBox
    Par natab dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 09/08/2011, 13h00
  5. [XL-2003] [VBA] Format de saisie DATE dans TextBox
    Par Teh Metil dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/12/2010, 11h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo