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 :

Vérification de la valeur d'une zone de texte [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Artisan
    Inscrit en
    Février 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Artisan
    Secteur : Services de proximité

    Informations forums :
    Inscription : Février 2012
    Messages : 32
    Par défaut Vérification de la valeur d'une zone de texte
    salut à tous,

    j'ai un formulaire de saisie de facturation sur lequel avant la validation d'une nouvelle ligne, je lui demande de vérifier certaines données (photo en pièce jointe).

    Après la sélection d'une référence dans le champ Désignation si la zone de texte ZtxtPrxUnit n'est pas vide, il doit obligatoirement y avoir une saisie donnée numérique entière ou décimale dans la zone de texte ZtxQte.

    Ces 2 zones une fois calculées donne le Montant total de la nouvelle ligne dans la zone de texte ZtxMontant

    Si cette condition n'est pas respectée la ligne ne peut pas être créée sur la facture. Un message d'erreur apparait "Vous ne pouvez pas valider une référence sans préciser sa quantité !" (ligne 25)

    Lorsque je mets une quantité de 1 ou une valeur supérieure cela fonction bien.
    Par contre si je saisie une valeur de 0.01 à 0.99, il considère que la zone est vide, donc message d'erreur et je ne peux pas valider la ligne. Aucun problème à signaler du côté du calcul.

    Si quelqu'un à une idée voici la partie du code en question :
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
     
    Private Sub CmdLSuiv_Click()
     
    Dim obj1 As String, obj2 As String, term As String, BaseD As String
    If Val(Range("V8")) = 1 Then
        obj1 = "la facture :"
        obj2 = "facture"
        term = "e"
        BaseD = "BD_FACTURES"
        ElseIf Val(Range("V8")) = 2 Then
        obj1 = "le devis :"
        obj2 = "devis"
        term = ""
        BaseD = "BD_DEVIS"
        Else
        Exit Sub
    End If
     
    Dim i, N, j
    For i = 1 To 3
        N = N + Controls("OptType" & i).Value
    Next i
     
    'Traiter la ligne en cours
    If Val(Me.ZtxtPrxUnit.Value) <> Empty And Val(Me.ZtxtQte.Value) = Empty Then  'Ne pas enregistrer ligne nulle
        Beep
        MsgBox "Vous ne pouvez pas valider une référence sans préciser sa quantité !", vbExclamation, "Action impossible !"
        Exit Sub
     
        ElseIf Val(Me.ZtxtPrxUnit.Value) <> Empty And Val(Me.ZtxtQte.Value) = 0 Then
        Me.ZtxtMontant = 0
     
        ElseIf Val(Me.ZtxtCode.Value) = 0 And Val(Me.ZtxtMontant.Value) <> 0 Then
        MsgBox "Vous ne pouvez pas enregistrer une référence sans préciser son code !", vbExclamation, "Action impossible !"
        Exit Sub
     
        ElseIf Val(Me.CboxDesignation.ListIndex) = -1 Then
        MsgBox "Vous devez sélectionner une référence pour pouvoir éditer une nouvelle ligne !", vbExclamation, "Action impossible !"
        Exit Sub
     
        'On teste les saisies...
        ElseIf Me.CboxIdClient.Text = Empty Then
            MsgBox "Vous devez impérativement entrer ou sélectionner un ID CLIENT !", vbExclamation, "Erreur de sélection !"
            CboxIdClient.SetFocus
        Exit Sub
     
     
        'On teste les options
        ElseIf N = 0 Then
            MsgBox "Vous devez impérativement sélectionner un type de " & obj2 & " !", vbExclamation, "Sélection obligatoire !"
        Exit Sub
     
        ElseIf Me.CboxDesignation.Text = Empty And Me.ZtxtNligne < 2 Then
            MsgBox "Vous devez impérativement sélectionner une référence pour éditer " & obj1 & " !", vbExclamation, "Sélection Manquante !"
            CboxDesignation.SetFocus
        Exit Sub
     
        ElseIf Val(Me.ZtxtRemise.Value) < 0 And Val(Me.ZtxtRemise.Value) > 100 Then
        MsgBox "Vous devez saisir une valeur comprise entre 0 et 100", vbInformation, "Information"
        Exit Sub
     
        Else 'enregistrer la ligne
            Cells(Range("V13").Value, 2) = Me.ZtxtNligne.Value
            Cells(Range("V13").Value, 6) = Me.CboxDesignation.Value
            Cells(Range("V13").Value, 14) = Me.ZtxtPrxUnit.Value
            Cells(Range("V13").Value, 16) = Me.ZtxtQte.Value
            Cells(Range("V13").Value, 19) = Me.ZtxtCode.Value
            Cells(Range("V13").Value, 23) = Me.ZtxtPref.Value
            Cells(Range("V13").Value, 24) = Me.ZtxtRef.Value
        End If
     
        'Passer à la ligne suivante
        If Me.CboxDesignation.ListIndex <> -1 Then
            Range("V13").Value = Range("V13").Value + 1
            Else
            Exit Sub
        End If
     
        'Info nombre de ligne max atteint
        If Val(ZtxtNligne.Value) = 28 Then
            MsgBox "Vous avez édité le nombre maximum de lignes," & Chr(10) & "pouvant être contenues dans la facture.", vbInformation, "Maximum atteint"
        End If
     
        'Initialiser les champs
        If Cells(Range("V13").Value, 1) <> "" Then
            'Édition de ligne existante
            Me.ZtxtNligne.Value = Cells(Range("V13").Value, 2)
            Me.CboxDesignation.Value = Cells(Range("V13").Value, 6)
            Me.ZtxtPrxUnit.Value = Cells(Range("V13").Value, 14)
            Me.ZtxtQte.Value = Cells(Range("V13").Value, 16)
            Me.ZtxtCode.Value = Cells(Range("V13").Value, 19)
            Me.ZtxtPref.Value = Cells(Range("V13").Value, 23)
            Me.ZtxtRef.Value = Cells(Range("V13").Value, 24)
            Call InitialiseTotaux
        Else
        Call NouvelleLigne
    End If
    Me.CboxDesignation.SetFocus 'Activer le 1er champ
     
    'On affecte leur valeur
    Dim IdFact As String
     
    For Each j In FrmDevisFacture.TypeFacture.Controls
    If j = True Then IdFact = j.Caption
    Next j
     
    If Me.ZtxtNligne.Value >= 1 And Me.ZtxtNligne.Value <= 28 And Me.ZtxtNligne.Enabled = True Then
    'On envoi les données sur la Facture
    With Sheets("Devis_Facture")
        .Range("W6").Value = Me.ZtxtNumFact.Value
        .Range("U2").Value = Me.ZtxtFormeJuridique.Value
        .Range("V2").Value = Me.ZtxtRaisonSociale.Value
        .Range("W2").Value = Me.ZtxtCivilite.Value
        .Range("U8").Value = Me.ZtxtFonction.Value
        .Range("Y2").Value = Me.ZtxtNom.Value
        .Range("X2").Value = Me.ZtxtPrenom.Value
        .Range("Z2").Value = Me.ZtxtAdresseL1.Value
        .Range("AA2").Value = Me.ZtxtAdresseL2.Value
        .Range("U4").Value = Me.ZtxtCodePostal.Value
        .Range("V4").Value = Me.ZtxtVille.Value
        .Range("U6").Value = Me.CboxIdClient.Value
        .Range("Z6").Value = Me.ZtxtDate.Value
        .Range("V6").Value = IdFact
        .Range("P50").Value = Me.ZtxtAcompte.Value
        If Me.ZtxtRemise.Value <> Empty Then
            .Range("T48").Value = Me.ZtxtRemise.Value / 100
            Else
            .Range("T48").Value = Me.ZtxtRemise.Value
        End If
    End With
    End If
    Call InitialiseTotaux
    End Sub
    Merci
    Images attachées Images attachées  

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour Rattus34

    Perso, je ferais plutôt un test de valeur numérique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Val(Me.ZtxtPrxUnit.Value) <> Empty And Not IsNumeric(Me.ZtxtQte.Value) Then
    A+

  3. #3
    Membre averti
    Homme Profil pro
    Artisan
    Inscrit en
    Février 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Artisan
    Secteur : Services de proximité

    Informations forums :
    Inscription : Février 2012
    Messages : 32
    Par défaut
    Bonjour BrunoM45,

    Merci de t'intéresser à mon problème, j'ai mis en place ta proposition, et elle donne le même résultat que si je vérifie le contenu du montant.

    L'opération se déroule bien, le calcul s'effectue, mais lors de l'enregistrement sur la feuil, la ligne est vide d'écriture. Pourtant elle a bien été créée, puisque l'on passe à la numéro 2, sans beep ou message d'erreur.

    Je vais faire une copie complète de mon projet, avec une base de données fictive, je pense que l'erreur est entretenue par une autre commande dans le formulaire.

    Mais là ça dépasse un peu mes compétence en la matière, je ne baisse pas les bras et je continue de chercher de mon côté.

    Voici le fichier complet avec une base de données modifiées.
    Une partie du projet, inutile au bon fonctionnement des formulaires, à été retirée, si non difficile de si retrouver. C'est presque une usine à gaz.

    Pour faire simple dézipez et copiez le fichier BaseTD.xlsm et les deux répertoires Factures et Devis sur votre bureau.

    Une fois copié ouvrez BaseTD.xlsm il faut changer les 4 chemins de sauvegarde dans la commande : Private Sub CmdEnregistrer_Click() et Private Sub CmdPDF_Click() du formulaire FrmDevisFacture

    Sur mon bureau le chemin est : C:\Users\Stéphane\Desktop\Factures\
    il vous suffit de remplacer Stéphane par le nom de votre session windows.

    Cette opération doit être répétée sur les 4 chemins contenus dans Private Sub CmdEnregistrer_Click() et Private Sub CmdPDF_Click().
    Fichiers attachés Fichiers attachés

  4. #4
    Invité
    Invité(e)
    Par défaut
    Re,

    Très joli boulot

    Quel est ton séparateur décimal sur ton PC !?
    Chez moi quand je suis dans la ZtxtQte, une virgule s'affiche, jamais un point

    A+

  5. #5
    Membre averti
    Homme Profil pro
    Artisan
    Inscrit en
    Février 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Artisan
    Secteur : Services de proximité

    Informations forums :
    Inscription : Février 2012
    Messages : 32
    Par défaut
    Merci du compliment, mais j'avoue que l'entreprendre est osé et cela m'a valu quelques déboires.

    Pour cette histoire de séparateur, moi aussi lorsque j'utilise le point de mon pavé c'est une virgule qui s'affiche et jamais un point.

    Ou souhaites-tu en venir?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Re,

    Citation Envoyé par rattus34 Voir le message
    Merci du compliment, mais j'avoue que l'entreprendre est osé et cela m'a valu quelques déboires.
    C'est souvent comme ça, mais il faut être tenace, le résultat n'en est que meilleurs

    Pour cette histoire de séparateur, moi aussi lorsque j'utilise le point de mon pavé c'est une virgule qui s'affiche et jamais un point.
    Je n'avais pas vu que c'est gérer par le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub ZtxtQte_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Donc impossible de tester tes problèmes mais c'est réglé

    Sinon j'ai changé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub ZtxtQte_Change()
      ' Si le PU est vide, ou si la Qt est vide, ou si la Qt n'est pas numérique
      If ZtxtPrxUnit.Value = Empty Or ZtxtQte.Value = Empty Or Not IsNumeric(ZtxtQte.Value) Then
        ' On ne calcul rien et on met le montant à zéro
        ZtxtMontant.Value = Empty
      Else
        ZtxtMontant.Value = ZtxtPrxUnit.Value * ZtxtQte.Value
      End If
    End Sub
    Sinon BUG quand tu supprimais la Qt ou si tu mets un caractère alphabétique

    Dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub CmdLSuiv_Click()
    J'ai testé avec ce que je t'avais donné
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      If Val(Me.ZtxtPrxUnit.Value) <> Empty And Not IsNumeric(Me.ZtxtQte.Value) Then  'Pour ne pas enregistrer une ligne nulle
        Beep
        MsgBox "Vous ne pouvez pas valider une référence sans préciser sa quantité !", vbExclamation, "Action impossible !"
        Exit Sub
    ' Etc....
    Chez moi ça fonctionne, j'ai testé en mettant un Exit Sub dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Private Sub ZtxtQte_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Exit Sub
    A+
    Dernière modification par Invité ; 27/01/2013 à 19h31.

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 28/02/2006, 09h36
  2. Convertir une valeur d'une zone de texte en date
    Par os_rasta dans le forum ASP
    Réponses: 17
    Dernier message: 27/02/2006, 15h56
  3. Réponses: 40
    Dernier message: 24/02/2006, 14h19
  4. Réponses: 1
    Dernier message: 02/12/2005, 05h18
  5. Réponses: 6
    Dernier message: 30/09/2005, 16h24

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