VBA Excel demande aide

Bonsoir à tous,
voila mon problème, j'ai crée un userform dans lequel j'ai plusieurs textbox dont certaines ne doivent être remplies que par des chiffres.J'ai utilisé l'instruction if not isnumeric then... puis j'affiche un message et remet la textbox à vide avec l'instruction textbox1.text = "". Et c'est maintenant que çà se corse car lorsque j'ai rempli toutes mes textbox et que je valide mes données et que normalement mes textbox se vident, j'ai mon message de rentrer un nombre dans les textbox "numérique" qui vient et je ne sais pas comment éviter de lancer cette instruction à la validation des données.
C'est peut etre un peu confus mais si il y a quelqu'un qui veut bien m'aider je pourrai lui envoyer mon classeur xl
Merci en attendant

23 réponses

Résumé de la discussion

Le problème porte sur un formulaire VBA où certaines TextBox doivent accepter uniquement des chiffres et où IsNumeric déclenche des messages même après la vidange des champs lors de la validation. Des solutions préconisent de réinitialiser l’ensemble des contrôles après la saisie et d’enregistrer les données dans une feuille dédiée, en utilisant un bloc With pour vider TextBox1 à TextBox11 et ComboBox1. D’autres interventions insistent sur la suppression éventuelle du lien direct ContrôleSource et sur le contrôle de la logique de validation afin que l’erreur ne soit plus déclenchée au moment de l’enregistrement. En complément, certains échanges évoquent les difficultés liées à l’activation et à l’écriture dans la feuille Moteurs et à la gestion des contrôles qui alimentent les cellules.

Bobot (l’IA à votre service)
  1. Pas de problème, c'est quand tu veux et/ou quand tu peux !!!!!
    En fait j'aimerais commencer à faire les nouveaux rapports 2006 avec ce classeur donc fais à ton aise.
    J'ai continué à bosser sur le classeur: nouveaux userform...donc j'ai assez de boulot dessus pour pouvoir attendre.
    Merci @+
    0
    1. J'ai oublier la formule pour calculer le débit:
      débit en m3/h; vitesse en m/s ; surface en m²

      débit = vitesse x surface x 3600
      0
      1. Modérateur
        C'est urgent ou ça peut attendre demain?
        0
    2. Salut,
      toutes remarques sont bonnes à prendre lorsqu'elles sont constructives.
      Pas de problème et merci pour la liste , c'est vrai que c'est plus facile lorsque tout est "nommé".
      Voila ce que j'aimerai, dans le userform feuilledesaisieCTA:
      dans la frame gainage le choix doit se faire sur un type de gaine : ronde ou carrée: si le bouton rond est sélectionné alors on doit pouvoir rentrer un diametre (en mm) et ne plus pouvoir rentrer des valeurs dans hauteur et largeur; si on choisit le bouton carrée, alors le champ diamètre doit etre inaccessible et on rentre des valeurs dans largeur et hauteur (en mm).La valeur dans surface effective doit s'y mettre automatiquement en fonction de la valeur diametre ou largeur x hauteur (en m² mais sans unité).
      Dans la frame désiré: on entre le débit(valeur qui est connue), automatiquement la vitesse doit apparaitre dans le champ vitesse désirée.
      Dans la frame mesuré: on entre la vitesse (cette vitesse est mesurée sur chantier avec un appareil de mesure), automatiquement le débit s'inscrit dans débit mesuré.
      J'espère que c'est assez explicite ??
      @+ merci
      0
      1. Bonjour lami20j,
        problème du jour (si çà ne te dérange pas et surtout si tu veux bien),
        j'ai créé un nouveau Userform (feuillesaisieCTA) dans lequel j'ai 2 Optionbutton qui doivent me permettrent l'accés à 3 textbox dans lesquelles il faudrait faire des calculs ????
        je te met le classeur en copie , et si tu veux bien y regarder.
        Merci d'avance

        http://cjoint.com/?mupGf6rMP4
        0
        1. Modérateur
          Salut,

          Il faut que tu me dise ce que tu veux faire avec la nouvelle Feuille.

          Je vois que tu as travaillé, tu as nommé tes "objets", cependant tu as exageré

          Par exemple pour la feuille "Feuilledesaisiemoteurs" tu devais la nommé plutôt frmMoteurs

          Il faut eviter aussi les accents les espaces.

          Exemple:

          la zone de texte TxtRéglageThermique
          plutôt txtReglTherm

          Désolé pour les remarques mais le but c'est de simplifier les choses.

          En général le préfixes tu le mets en minuscules.
          Voilà une liste que tu peus utiliser pour préfixer les noms de tes "objets" :
          cbo - ComboBox
          chk - CheckBox
          cmd - CommandButton
          fra - Frame
          frm - UserForm
          img - Image
          lbl - Label
          lst - ListBox
          opt - OptionButton
          txt - TextBox
          0
      2. Modérateur
        j'ai mis la colonne tension en dernier dans ma feuille, si je veux la déplacer par exemple en colonne D, je suppose que je dois modifier toutes les lignes dans le code pour tous les reports d'information??

        Oui il faut faire corespondre Cells(r, la_colonne) aux zones de texte (voilà pourquoi c'était mieux de nommer les zones de texte.

        Pour l'impression tu peux arranger le tableau sous excel. La mise en forme de classeur n'affecte pas la saisie dans les cellules, tant que les adresses de cellules ne changent pas.

        Si tu insères une colonne par exemple les adresses de cellules change donc il faut modifier dans le code.
        0
        1. OK, compris
          Je vais arranger tout çà et renommer textbox et boutons, puis créer les autres userform et essayer de rendre les tableaux présentable à l'impression.
          Je te remercie pour ton aide , c'est vraiment sympa de ta part.
          Bonne soirée.
          @+
          0
      3. 0
        1. Modérateur
          Dit ce que tu veux. Comment tu veux utiliser les options.
          Sinon je ne sais pas quoi faire.
          0
        2. Dans la feuille moteurs, j'ai rajouté la colonne " tension".
          Dans le userform j'ai créer les 2 optionbutton " 230 Volts et 400Volts".
          Ce que j'aimeari c'est que si on choisit 230 il faut que dans la feuille moteurs s'affiche 230 et idem avec 400
          0
        3. @lami20jMerci lami20j,
          c'est OK.
          Petite question, j'ai mis la colonne tension en dernier dans ma feuille, si je veux la déplacer par exemple en colonne D, je suppose que je dois modifier toutes les lignes dans le code pour tous les reports d'information??
          Ce que je voudrais, c'est faire une impression un peu plus présentable que le tableau de la feuille , donc peut etre qu'il n'ai pas nécessaire que je déplace toutes les données??
          Que dois je utiliser pour une impression pour pouvoir donner le dossier au client ??export vers un autre programme ??sous excel ??
          0
      4. Salut lami20j,
        je te l'avais dit que j'aurai encore besoin de tes connaissances.
        J'ai rajouté 2 optionbutton pour faire un choix mais j'ai un problème avec la syntaxe.
        Si tu veux bien y jeter un oeil dis le moi, je posterais le classeur comme hier.
        Merci d'avance.
        0
        1. Modérateur
          envoie ton classeur
          0
      5. en fait dans les textbox intensite absorbée phase 1 / phase 2 et phase 3 on a dit qu'il ne fallait que des chiffres mais lorsque que j'ai des moteurs monophasés , je n'ai qu'une seule intensité absorbée qui peut etre rentrée en ph1 ph 2 ou ph3 tout dépend du cablage donc il faudrait prévoir de pouvoir utiliser le caractere --- pour dire qu'il n'y a pas de valeur dans 2 textbox
        OK ????
        0
        1. Modérateur
          Si j'ai bien compris les zones phase 1, 2 et 3 doivent accepter soit un nombre soit ---

          C'est ça?
          0
        2. @lami20jOui, c'est bien çà
          0
        3. @lami20jBonjour lami20j,
          J'ai récupéré ta dernière modif, elle fonctionne,pas de problème.
          Moi j'étais parti sur une instruction OR différent de.
          Maintenant je suis au boulot jusque 17h et ce soir j'ai vais "encore" modifié la feuille de saisie moteurs pour y rajouter la tension. Et après je pense qu'elle devrait être OK pour utilisation.
          Encore une fois, je te renouvelle mes remerciements car sans toi, je pense que pour arriver a ce résultat j'aurai mis plusieurs semaines.
          Bonne journée à toi.
          Merci encore!!
          Ciao
          0
      6. Par contre je ne sais pas si tu as remarqué mais quand tu valide avec le bouton OK dans le userform, il y a le bouton "retour feuille de saisie" qui apparait à droite du userform ???
        problème avec les instructions visible ????
        0
        1. @lami20jC'est impeccable!!!!
          T'es super sympa!!!
          Grace à toi mon projet a fait un grand pas aujourd'hui et ne vais pas abuser de ta gentillesse pour ce soir.
          Est ce que je peux encore compter sur toi si j'ai d'autres soucis (cela sera surement le cas)???
          Merci encore et je te souhaite une bonne nuit.
          Quand à moi, pour ce soir c'est fini , demain boulot à 5h.
          Encore un grand merci et a bientôt.
          0
        2. Modérateur
          @pkli54J'ai fait une erreur dans le dernier fichier que j'ai envoyé (la position de End If). Voilà la dernière version http://cjoint.com/?mswwJvLJze

          Il faut que tu explique ce que tu veux en ce qui concerne les valeurs qui peuvent contenir -.
          0
      7. Modérateur
        avec OK du Userform çà bloque le userform ????
        Il faut spécifier ce que tu saisies ou ce que tu fait pour savoir chercher l'erreur. Je n'ai pas des erreurs donc je ne sais pas où est le problème.

        Essaie pour l'instant une saisie normale, pour voir le comportement de ta ligne 2
        http://cjoint.com/?msvzFYgCRs

        pouvoir utiliser le caractere - Donne un exemple de valeur que tu veux saisir.
        0
        1. Cà semble fonctionner correctement, les valeurs de la ligne 2 restent maintenant.
          Ta fait quoi ?
          0
        2. Modérateur
          @pkli54Reponse N°18

          J'ai remarqué aussi que tu as la propriètes ControlSource positionnée sur certaines cellules pour les zones de texte et combobox. Vérifie si ça sers à quelque chose dans ton cas. Moi j'ai supprimé.

          Donc j'ai supprimé la ligne 2 ou tu avais dans la cellule B2 la marque Wilo.

          Ensuite j'ai supprimé les propriètes ControlSource de tes zones de texte et CompoBox. ControlSource était positionné pour chaque zone de texte et la combobox à Moteurs!A2.......
          0
      8. C'est sympa de ta part de continué à m'aider.
        Entretemps j'ai fait quelques modifs et certainement des erreurs.
        J'ai rajouter tes instructions mais j'ai toujours une erreur à la ligne 2 de la feuille moteurs et aussi quand je valide avec OK du Userform çà bloque le userform ????
        Il faudrait aussi pouvoir utiliser le caractere - car je peux avoir des moteurs en mono donc les textbox isnumeric doivent pouvoir accepter le -.
        Je te met le classeur entier modifié à l'adresse ci dessous.
        Merci et bonne soirée
        http://cjoint.com/?msvcZd0pOP
        0
        1. Modérateur
          Par ordre d'entrée :

          remplace ce code
              Worksheets("Moteurs").Activate
              Rows(2).Select
              Selection.Insert
              Rows(2).Select
              Selection.Insert
              With Feuilledesaisiemoteurs
                  .TextBox1.Text = ""
                  .TextBox2.Text = ""
                  .TextBox3.Text = ""
                  .TextBox4.Text = ""
                  .TextBox5.Text = ""
                  .TextBox6.Text = ""
                  .TextBox7.Text = ""
                  .TextBox8.Text = ""
                  .TextBox9.Text = ""
                  .TextBox10.Text = ""
                  .ComboBox1.Text = ""
                  .Textbox11.Text = ""
              End With
          avec
              Worksheets("Moteurs").Activate
              r = Range("A65536").End(xlUp).Row + 1
              Cells(r, 1) = Textbox11.Text
              Cells(r, 2) = ComboBox1.Text
              Cells(r, 3) = TextBox1.Text
              Cells(r, 4) = TextBox2.Text
              Cells(r, 5) = TextBox3.Text
              Cells(r, 6) = TextBox4.Text
              Cells(r, 7) = TextBox5.Text
              Cells(r, 8) = TextBox6.Text
              Cells(r, 9) = TextBox7.Text
              Cells(r, 10) = TextBox8.Text
              Cells(r, 11) = TextBox9.Text
              Cells(r, 12) = TextBox9.Text
              
              With Feuilledesaisiemoteurs
                  .TextBox1.Text = ""
                  .TextBox2.Text = ""
                  .TextBox3.Text = ""
                  .TextBox4.Text = ""
                  .TextBox5.Text = ""
                  .TextBox6.Text = ""
                  .TextBox7.Text = ""
                  .TextBox8.Text = ""
                  .TextBox9.Text = ""
                  .TextBox10.Text = ""
                  .ComboBox1.Text = ""
                  .Textbox11.Text = ""
              End With

          En ce cas tu auras le

          ligne 2 - moteur1 ( la 1ère saisie)
          ligne 3 - moteur2
          .
          .
          .
          ligne n - moteur n ( la dérnière saisie)

          J'ai remarqué aussi que tu as la propriètes ControlSource positionnée sur certaines cellules pour les zones de texte et combobox. Vérifie si ça sers à quelque chose dans ton cas. Moi j'ai supprimé.
          0
          1. Merci, çà marche maintenant et pour classer par ordre d'entrée
            moteur 1
            .
            .
            moteur n
            je fais quoi ???????????et comment
            merci
            désolé de te déranger mais pour l'instant t'es le seul qui ai bien voulu m'aider donc j'en profite ( encore un peu)
            0
            1. c'est exactement çà:
              moteur 1
              .
              .
              moteur n

              est çà çà bloque:
              Private Sub CommandButton4_Click()
              Feuilledesaisiemoteurs.Hide
              Load Worksheets("Moteurs") <<<<çà me met une erreur
              Worksheets("Moteurs").Show <<<<çà me met une erreur
              0
              1. Modérateur
                C'est normal que tu as des messages d'erreur.

                Il faut que tu comprennes ce que c'est un objet VBA et ce que c'est les objets Excel.

                Avec Load tu peux charger une UserForm mais pas un classeur Excel.

                Pour les classeurs tu utilises Worksheets("jkj").Activate par exemple.
                0
            2. Modérateur
              Quand tu dis de créer une feuille visualisation, çà serai une copie de la feuille moteurs ????

              Oui pour les zones de texte et les libellés. Mais pour les boutons ça change.

              Précédant, Suivant, Le 1er enregistrement, Le dernier enregistrement, Recherche, Editer, Annuler, Supprimer....

              Pour le petit service. Je ne comprends pas ce que tu veux.

              Tu veux le données comme ça

              moteur n
              .
              .
              .
              moteur 1

              ?

              ou

              moteur 1
              .
              .
              moteur n

              ?
              0
              1. Quand tu dis de créer une feuille visualisation, çà serai une copie de la feuille moteurs ????
                En principe , il ne dois pas y avoir de modifs sauf si on vient a changer un moteur, mais bon on ne sais jamais.
                Pour l'instant je vais essayé de terminer sans les boutons de recherche(précédent et suivant trop compliqué)
                Encore un petit service: lorsque que je rentre les données dans la feuille moteurs j'insère le nouveau moteur et ceux rentrer auparavant descende d'une ligne, je voudrais renter le nouveau à la suite des autres quel instruction dois je mettre au lieu de :Rows(2).Select
                Selection.Insert

                merci
                0
                1. Modérateur
                  Au début je voulais créer 2 autres boutons pour voir les enregistrements précédent et suivant mais je ne sais pas si c'est faisable.

                  Bien sûr que c'est faisable. Mais en ce cas c'est mieux de créer une autre feuille pour Visualisation et pourquoi pas pour Editer (le cas où tu veux apporter des modifications à tes données).
                  0
                  1. Modérateur
                    D'abord quelques conseils:

                    Essaie de donner des noms à tes objects (zone de texte, boutons, feuille...)

                    TextBox2 ce n'est pas très clair et tu vois ça quand il faut corriger ou ajouter dans le code

                    Comme TextBox2 c'est le champ pour Intensité nominale tu pourras nommé ta zone : txtIntesiteNominale ou txtIntensNom, etc...

                    prefix txt pour savoir qu'il s'agit d'une zone de texte
                    IntensitéNominale tu sais à quoi se réfère ta zone de texte.

                    Des prefixes

                    cmd pour CommandButton (cmdOk, cmdAnnuler - mieux que CommandButton1,...)
                    lst pour ListBox
                    opt pour OptionButton, etc....

                    Revenons à ton code.

                    Que veut qu'il se passe quand tu fait clic sur le bouton Annuler?

                    Je vois dans ton code que tu caches la feuille de saisie et tu supprimes la ligne 2. Pourquoi? Tu veux annuler la dernière saisie?
                    Si tu te contentes de cacher la feuille, sache qu'elle reste en mémoire. Il faut la déchargée. Par exemple avec UnloadMe ou Unload Ta_Feuille.

                    Pour quitter l'application crée un bouton avec le libellé Fin et tu le nomme cmdFin et tu ajoutes ce bout de code
                    Private Sub cmdFin_Click()
                        Worksheets("Page de garde").Activate
                        Unload Me
                    End Sub


                    Voilà le code avec le bouton Fin ajouté
                    Private Sub cmdFin_Click()
                        Worksheets("Page de garde").Activate
                        Unload Me
                    End Sub
                    
                    Private Sub CommandButton2_Click()
                    Feuilledesaisiemoteurs.Hide
                    Rows(2).Select
                    Selection.Delete
                    End Sub
                    
                    
                    
                    'Private Sub TextBox2_Change()
                    'If Not IsNumeric(TextBox2.Text) Then
                    'MsgBox "Vous devez entrer un nombre."
                    'TextBox2.Text = ""
                    'End If
                    'End Sub
                    '
                    '
                    'Private Sub TextBox3_change()
                    'If Not IsNumeric(TextBox3.Text) Then
                    'MsgBox "Vous devez entrer un nombre."
                    'TextBox3.Text = ""
                    'End If
                    'End Sub
                    '
                    '
                    'Private Sub TextBox4_Change()
                    'If Not IsNumeric(TextBox4.Text) Then
                    'MsgBox "Vous devez entrer un nombre."
                    'TextBox4.Text = ""
                    'End If
                    'End Sub
                    '
                    'Private Sub TextBox5_Change()
                    'If Not IsNumeric(TextBox5.Text) Then
                    'MsgBox "Vous devez entrer un nombre."
                    'TextBox5.Text = ""
                    'End If
                    'End Sub
                    
                    
                    Private Sub CommandButton1_Click()
                    
                    If Not IsNumeric(TextBox2.Text) Then
                            MsgBox "Vous devez entrer un nombre dans le champ - Intensité nominale."
                            TextBox2.Text = ""
                            TextBox2.SetFocus
                            Exit Sub
                    ElseIf Not IsNumeric(TextBox3.Text) Then
                            MsgBox "Vous devez entrer un nombre dans le champ - Phase 1."
                            TextBox3.Text = ""
                            TextBox3.SetFocus
                            Exit Sub
                    ElseIf Not IsNumeric(TextBox4.Text) Then
                            MsgBox "Vous devez entrer un nombre dans le champ - Phase 2."
                            TextBox4.Text = ""
                            TextBox4.SetFocus
                            Exit Sub
                    ElseIf Not IsNumeric(TextBox5.Text) Then
                            MsgBox "Vous devez entrer un nombre dans le champ - Phase 3."
                            TextBox5.Text = ""
                            TextBox5.SetFocus
                            Exit Sub
                    Else
                    
                        Worksheets("Moteurs").Activate
                        Rows(2).Select
                        Selection.Insert
                        Rows(2).Select
                        Selection.Insert
                        With Feuilledesaisiemoteurs
                            .TextBox1.Text = ""
                            .TextBox2.Text = ""
                            .TextBox3.Text = ""
                            .TextBox4.Text = ""
                            .TextBox5.Text = ""
                            .TextBox6.Text = ""
                            .TextBox7.Text = ""
                            .TextBox8.Text = ""
                            .TextBox9.Text = ""
                            .TextBox10.Text = ""
                            .ComboBox1.Text = ""
                            .Textbox11.Text = ""
                        End With
                    
                    End If
                    End Sub
                    
                    
                    
                    0
                    1. Re,
                      en fait j'ai commencé a faire ce userform par hasard et suivi quelque tutoriel sur le net donc je ne suis pas un grand specialiste, j'avais vu que l'on pouvait renommer les boutons ...mais m'était dis que de toute façon je n'irais pas trés loin dans la programmation et c'est pour çà que je n'ai presque rien renommé, mais comme je constate que c'est assez prenant et avec l'aide de personne comme toi, je crois que je vais essayé d'aller au terme de ce petit projet.
                      Voila ce que j'aimerai faire: page de garde: je crois qu'elle est OK: appelle des différents userform pour renter les données.
                      userform saisie moteurs comme tu l'a tres bien compris ici je veux rentrer mes différents moteurs: 1 bouton pour valider les données qui envoie ces valeurs dans la feuille moteurs (mais ne la fait pas apparaitre) ,vide toute les textbox, ainsi je peux rentrer tous mes moteurs.
                      Le bouton annuler pour effacer la dernière ligne rentrer ?????(nécessaire ou pas ???)
                      Au début je voulais créer 2 autres boutons pour voir les enregistrements précédent et suivant mais je ne sais pas si c'est faisable.
                      Je dois créer plusieurs userform car on a plusieurs types de controle a effectuer et a acter.
                      Voila en gros ce que je dois faire.
                      En tous cas merci pourt'inquiéter de mon sort.
                      A plus
                      0
                  2. Modérateur
                    Ok, j'ai compris ce que tu veux.

                    Dès que j'ai fait les modif je t'envoie le code.
                    0
                    1. c'est sympa, je fait des test de mon coté
                      à plus
                      merci encore
                      0
                  3. Re,
                    OK pour la ligne supplémentaire, mais j'ai du mal m'expliquer:
                    quand je suis dans le userform, j'ai peut etre une dizaine de moteurs à rentrer et je voudrais éviter à chaque fois que je clique sur ok de revenir à la page de garde >nouveau moteur>rentrer les données ect ect...
                    je devrais rajouter un bouton dans le userform pour valider les données et rester dans le userform puis avec un autre bouton sortir du userform ??
                    qu'en penses tu ???
                    comment faire pour écrire les données dans la bonne feuille sans quitter le userform et sans faire apparaitre en fond la feuille moteurs ???
                    merci
                    0
                    • 1
                    • 2