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

  1. #1
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 696
    Points
    6 696
    Par défaut Approche d'une résolution de besoin en VBA - niveau débutant - Obliger une saisie numérique dans un
    Bonjour,

    Ci-dessous, le lien vers un nouveau tutoriel :
    « Approche d'une résolution de besoin en VBA - niveau débutant - Obliger une saisie numérique dans une TextBox »

    Le but de ce tutoriel est :

    • De présenter une bonne approche de la résolution d’un problème simple en VBA.
    • D’expliciter en détail la démarche employée pour arriver à la solution voulue.
    • D’expliciter les instructions VBA retenues à cette fin.
    • De proposer un fichier téléchargeable qui présente une solution à un problème qui est source de fils de questions récurrentes.


    Lien vers ce tutoriel

    Vos commentaires et remarques seront les bienvenus dans l'esprit de nos forums.

    cordialement,

    Didier
    Didier Gonard

    Dernier tutoriel :
    Le VBA qu'est ce que c'est ?
    Tutoriels : Voir la liste de mes tutoriels Excel & VBA et mon site pro sur ma Page DVP
    Cours et tutoriels pour apprendre Excel
    N'oubliez pas de mettre : ..quand c'est le cas !

  2. #2
    Membre éclairé
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2006
    Messages
    542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 542
    Points : 712
    Points
    712
    Par défaut
    Bonjour à tous
    Bonjour Ormonth

    Il m'est toujours agréable de lire les tutos de ce site, mais, surtout, à chaque fois je découvre et j'apprends encore et encore.

    Merci pour ce travail

    Eric

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Ayant eut la chance de lire ce tuto, j'ai adoré l'approche qui est faite pour résoudre un problème

    Philippe

  4. #4
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Février 2012
    Messages : 49
    Points : 18
    Points
    18
    Par défaut
    Bonjour DIDIER,
    J'ai lu votre tutoriel il est très intéressant c'est un travail de Pro.
    Mais qu'on est il pour une VSFlexGrid. Comment peut on exploiter le tutoriel pour une VSFlexGrid en cellule courante du tableur?
    J'ai essayé de l'appliquer mais je me suis bloqué sur l'instruction en rouge (voir code ci aprés) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub VSFlexGrid_KeyPressEdit(ByVal Row As Long, ByVal Col As Long, KeyAscii As Integer)
    If InStr("1234567890.", Chr(KeyAscii)) = 0 Or (InStr(VSFlexGrid.????, ".") <> 0 And Chr(KeyAscii = ".")) Then
     KeyAscii = 0: Beep
    End If
    End Sub
    Cordialement

  5. #5
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 696
    Points
    6 696
    Par défaut
    Bonjour,

    Je n'ai pas ce contrôle et ne l'ai jamais utilisé, à première vue, il est sous licence payante et je n'ai pas ce projet d'acquisition.

    Bref, je ne peux donc pas tester quelque-chose....

    désolé,

    Didier
    Didier Gonard

    Dernier tutoriel :
    Le VBA qu'est ce que c'est ?
    Tutoriels : Voir la liste de mes tutoriels Excel & VBA et mon site pro sur ma Page DVP
    Cours et tutoriels pour apprendre Excel
    N'oubliez pas de mettre : ..quand c'est le cas !

  6. #6
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Février 2012
    Messages : 49
    Points : 18
    Points
    18
    Par défaut
    Bonjour,
    Ce Control n'est pas sous licence payante, au moins dans mon poste.
    J'ai résolut le problème à mon niveau. Consulté ce lien :
    http://www.developpez.net/forums/d12...d/#post7020796

  7. #7
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 696
    Points
    6 696
    Par défaut
    Citation Envoyé par davido84
    Bonjour,
    après être tombé sur votre tutoriel, l'avoir étudié et adapté à mes besoins, je me permets de vous contacter afin de vous remercier pour ce travail et vous signaler les 2 points suivants :
    1) le code proposé dans le Private Sub txtEcritFeuille_KeyPress permet de saisir une virgule avant tout chiffre, ce qui fait qu'une saisie telle que ",123" est acceptée. Même si une telle saisie dans une feuille de calcul est acceptée et automatiquement modifiée en "0,123", la Sub txtEcritFeuille_BeforeUpdate la rejette puisque la fonction ChainePasOK ne l'accepte pas.
    J'ai personnellement modifié l'événement KeyPress comme suit afin d'empêcher ce type de saisie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       If InStr("1234567890,-", Chr(KeyAscii)) = 0 Or txtEcritFeuille.SelStart > 0 And Chr(KeyAscii) = "-" _
         Or (InStr(txtEcritFeuille.Value, ",") <> 0 Or txtEcritFeuille.SelStart = 0) And Chr(KeyAscii) = "," Then
          KeyAscii = 0: Beep
       End If
    2) l'ayant adapté pour des saisies de latitude et de longitude je me suis aperçu que la fonction ChainePasOK rejetait des données numériques dont le nombre de chiffres après la virgule dépassait 13, ce qui était problématique dans certains cas (la partie "If Len(CStr(Val(strpass))) <> Len(strpass)" fait barrage).
    J'ai personnellement résolu le problème en utilisant une expression rationnelle à la place de cette fonction.
    Comme ceci dépasse peut-être le cadre de votre tutoriel puisqu’il s'adresse aux débutants, je ne vous détaille pas l'expression utilisée mais si cela vous intéresse je pourrai vous la communiquer.
    Ce type de travail étant à encourager, je me suis donc permis ce petit retour.
    Merci encore !
    Cordialement
    Bonjour,

    Je vous remercie de ce retour, effectivement comme annoncé dans le titre « Approche d'une résolution de besoin en VBA niveau débutant Obliger une saisie numérique dans une TextBox », ce Tuto est orienté débutant et sur l'approche de résolution de problème, il vise à dire que pour arriver à ses fins, on ne se jette pas sur le code, mais on construit d’abord ce qu’on pourrait appeler un cahier des charges.

    Donc, comme vous l’avez si bien fait, si le besoin est proche du sujet traité, il convient d’en réécrire certaines parties au niveau liste des besoins et d’adapter ensuite les code aux besoins.

    Sinon,

    Pour ce qui est de l’entrée d’un nombre à virgule sans chiffre devant, c’est le fonctionnement de la fonction VAL (comme ci-dessous) qui en est responsable comme vous le montrerait l’ajour d’une ligne du genre Mavar = Val(strpass) et la visualisation de MaVAr dans la fenêtre variable locale.Le rajout du zéro fait que les longueurs de chaînes sont différentes.

    Pour ce qui des 13 décimales, en fait 14 passent aussi genre « 1,23456789123456 », la limite n’est pas sur les décimales, mais, en simplifiant, sur le nombre de chiffres significatifs liés au Double retourné par la fonction Val qui est de 15. De toutes façons, c’est aussi la limite des chiffres significatifs dans une cellule Excel, au-delà on passe dans la gestion des grands nombres (cf articles y afférents). En VBA en utilisant le type Decimal, on peut monter à 28 chiffres et faire des pirouettes après.
    Comme vous le dites cela dépasse le cadre de ce tutoriel, mais votre approche peut intéresser des lecteurs et faire l’objet d’un post dans le forum contribuez, sur les grands nombres, si ceci n’a pas déjà été traité.

    cordialement,

    Didier

    PS : merci de ne pas traiter de sujets techniques par MP
    Didier Gonard

    Dernier tutoriel :
    Le VBA qu'est ce que c'est ?
    Tutoriels : Voir la liste de mes tutoriels Excel & VBA et mon site pro sur ma Page DVP
    Cours et tutoriels pour apprendre Excel
    N'oubliez pas de mettre : ..quand c'est le cas !

  8. #8
    Candidat au Club
    Homme Profil pro
    Chargé d'études
    Inscrit en
    Mai 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chargé d'études
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2017
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Merci pour ce tutoriel, qui répond parfaitement à mon besoin (obliger la saisie de chiffres pour des infos clients ex: numéro de téléphone, numéro SIRET,etc.)

    Je rencontre un problème sur un champ où l'utilisateur renseigne le chiffre d'affaires prévus pour le nouveau client, les lettres / symboles renvoient bien un message d'erreur;
    En revanche le symbole € donne le message d'erreur suivant : "Erreur d'exécution '5': Argument ou appel de procédure incorrect".

    J'ai repris votre code presque tel quel en ajoutant une msgbox en cas d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub CTR3_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If InStr("1234567890", Chr(KeyAscii)) = 0 Then KeyAscii = 0: MsgBox "Saisie non valide", vbCritical
     
    End Sub
    J'ai essayé en téléchargeant le fichier disponible dans le tutoriel et j'obtiens la même erreur.

    Avez vous une idée de l'origine du bug ?

    Merci beaucoup

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Autre
    Inscrit en
    Août 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Août 2014
    Messages : 7
    Points : 7
    Points
    7
    Par défaut Affectation à plusieurs Textbox?
    Bonjour!
    J'ai beaucoup apprécié votre tutoriel Je suis de niveau débutant en VBA. J'aimerais svp savoir s'il est possible d'affecter votre code à plus d'une TextBox? Par exemple, j'ai 34 textbox. J'ai tenté d'inscrire Textbox(1,2,3, etc.)_KeyPress, mais ça ne fonctionne pas... Le message d'erreur est Erreur de compilation : Attendu : identificateur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub textbox2_KeyPress(ByVal KeyAscii As MSFORMS.ReturnInteger)
            If InStr("1234567890,-", Chr(KeyAscii)) = 0 Then KeyAscii = 0: Beep
    end sub
    Je vous remercie grandement pour avoir pris le temps de lire cette question et peut-être même d'y répondre

    Bonne journée!

  10. #10
    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 orestie

    tu melange les sujets
    ce que tu cherche c'est a genérer un meme evenement keypress pour tes 34 textboxs ca n'a rien voir

    je te propose d'ouvrir ton propre post a fin de ne pas poluer la discussion et je te parlerais de module classe qui servent (justement et entre autre a ca )
    a bientot dans ton post
    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

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Votre tutoriel est très intéressant.

    En testant ce dernier je me suis rendu compte que lorsque l'on rentre un nombre avec virgule qui se termine par 0 (exemple: 1,10), la saisie ressort en non valide.
    Ce problème de validation proviendrait, dans la Fonction ChainePasOk, de If Len(CStr(Val(strpass))) <> Len(strpass) Then ChainePasOK = True.

    Je ne parviens pas à voir ce que je peux faire pour qu'une saisie avec un chiffre à virgule se terminant par 0 ne renvoie pas une erreur.

    Quelqu'un peut il me fairte par de ces lumières .

    Merci

    Fabien

  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
    bonjour
    je ne vois pas en quoi un nombre décimal terminant par zéro devrait te renvoyer une erreur

    au pire pour un nombre décimal tu peux remplacer la"," par un "."
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If KeyAscii = 44 Then KeyAscii = 46  'point/virgule
    If KeyAscii = 46 And TextBox1 Like "*.*" Then KeyAscii = 0 'un seul séparateur autorisé
    If InStr("1234567890.", Chr(KeyAscii)) = 0 Then KeyAscii = 0 'blocage des autre caractère
    End Sub
    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
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    je ne vois pas en quoi un nombre décimal terminant par zéro devrait te renvoyer une erreur
    Aucune erreur, mais une déclaration indue de chaîne non OK
    Et pour cause : --->>
    (puisque après remplacement de "," par ".")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox Len("4.20") & vbCrLf & Len(CStr(Val("4.20")))
    Il y a là un "val" de trop ou encore utiliser Str et non Cstr -->> Didacticiel à corriger.

    PS : j'aurais personnellement utilisé une autre démarche pour éviter cette embuche, mais le propos n'est ici que celui d'appeler l'attention sur cette faille et non de remettre en cause l'ensemble.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  14. #14
    Membre à l'essai
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Transports

    Informations forums :
    Inscription : Février 2019
    Messages : 24
    Points : 24
    Points
    24
    Par défaut
    Bonjour, et merci pour ce tutoriel, très agréable à lire et facile à comprendre.

    Depuis sa publication, je pense qu'il y a eu des mises à jour office qui ont impactés au moins une chose.
    En effet, la procédure "xxx_BeforeUpdate" ne prend pas en compte le coller, il faut désormais passer par la procédure "xxx_BeforeDropOrPaste"

    Et du coup, utiliser "Data.GetText" à la place de "txtEcritFeuille.Value"

    Ce qui donne pour l'intégralité de cette procédure modifiée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Private Sub txtEcritFeuille_BeforeDropOrPaste(ByVal Cancel As MSForms.ReturnBoolean, ByVal Action As MSForms.fmAction, ByVal Data As MSForms.DataObject, ByVal X As Single, ByVal Y As Single, ByVal Effect As MSForms.ReturnEffect, ByVal Shift As Integer)
       Dim strpass As String
       strpass = Data.GetText
       If ChainePasOK(strpass) = True Then Cancel = True: txtEcritFeuille.Value = "": Beep: MsgBox "Saisie non valide !"
    End Sub

Discussions similaires

  1. Tester une saisie numérique dans un textbox
    Par david 417 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/02/2018, 14h32
  2. Obliger une saisie numérique dans une VSFlexGrid?
    Par GOLDINGMAROC dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/12/2012, 12h23
  3. [PHP-JS] Forcer une saisie numérique
    Par Empty_body dans le forum Langage
    Réponses: 9
    Dernier message: 04/10/2011, 18h46
  4. rendre une saisie obligatoire dans un formulaire
    Par heteroclite dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 17/09/2006, 23h26

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