Soucis de code erreur à la fermeture volontaire de l'userform

Résolu
gilles52300 Messages postés 36 Statut Membre -  
gilles52300 Messages postés 36 Statut Membre -
Bonjour,
Question que je n'arrive pas à élucider,
j'ouvre l'userform, et je me rend compte que je n'ai pas toutes les données. je décide de le fermer sans avoir rentré aucune donnée dedans et là il me fait un message d'erreur qui me renvoie sur le débogueur.

message
Erreur d'exécution 13
incompatibilité de type

Quand j'ouvre le debogueur, c'est cette ligne qui est surligné

DateReception = UserForm3.TextBox1.Text

j'ai mis en place un bouton pour le fermer en condamnant le bouton rouge de fermeture.

Unload unserform3

mais rien n'y fait.

si vous avez une idée.
je voudrais éviter que les personnes qui vont utiliser ce dossier puissent rentrer dans vba.

10 réponses

  1. Mike-31 Messages postés 18203 Date d'inscription   Statut Contributeur Dernière intervention   5 147
     
    Salut,

    Il serait intéressant d'avoir ton fichier sans note confidentielle que tu peux joindre avec ce lien

    https://www.cjoint.com/
    0
  2. gilles52300 Messages postés 36 Statut Membre
     
    Bonsoir Mike,
    Merci de t'intéresser à mon cas.
    voici le lien du fichier. https://www.cjoint.com/?0EtumVrzDcf
    c'est avec l'userform3 et le module 4 que j'ai ce problème.
    il est existant avec l'userform " aecraser" et le module 1 qui le concerne.
    toutes les données sur le fichiers sont des données test.
    merci encore.
    cordialement
    0
  3. Mike-31 Messages postés 18203 Date d'inscription   Statut Contributeur Dernière intervention   5 147
     
    Re,

    il faudrait que je comprenne ce que tu cherches faire ce qui risque être assez long vu l'importance du code, mais si tu sécurises cette ligne
    DateReception = UserForm3.TextBox1.Text
    l'erreur se retrouve également sur la ligne suivant

    en attendant que je trouve mieux, essaye de sécuriser ces deux lignes comme ceci

    If TextBox1 <> "" Then DateReception = UserForm3.TextBox1.Text
    If TextBox2 <> "" Then DatePrelevement = UserForm3.TextBox2.Text

    ou mieux sans toucher aux lignes ajoute simplement une gestion d'erreur après l'ouverture de l'userform3

    UserForm3.Show
    On Error Resume Next

    teste le fichier et tu reviens me dire

    tu as le même problème avec ce code,
    Sub ecrasement()

    sur lequel je te conseille d'ajouter la même gestion d'erreur après l'ouverture de l'userform

    aecraser.Show
    On Error Resume Next

    A+
    Mike-31

    Une période d'échec est un moment rêvé pour semer les graines du savoir.
    0
  4. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    et pourquoi n'utilises-tu pas UserForm3.hide ?

    eric
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. gilles52300 Messages postés 36 Statut Membre
     
    Merci Mike pour ton aide.

    On Error Resume Next
    fonctionne parfaitement et je n'ai plus ce message d'erreur.

    En ce qui concerne la longueur du code, c'est du trompe l'oeil car il y a de la répétition. juste 4 fois le premier passage est répété avec seulement 2 lignes qui changent à chaque fois. et ensuite c'est l'ensemble qui est répété 3 fois.
    je suis en train de regarder pour le simplifier avec quelqu'un.
    Merci bien pour la solution. J'ai testé plein de truc mais pas ça!
    pourquoi faire simple quand on veut essayer de faire compliqué!

    Bonjour Eric,
    userform3.hide je l'utilise losque mon userform est rempli.
    et en plus il me fait quand même l'erreur.

    là c'est dans le cas ou je veux le fermer sans le remplir. Oui c'est idiot, pourquoi l'ouvrir?
    avec mac, j'ai pas la possibilité ou pas encore trouver la possibilité de mettre l'userform en mode 'non modale' aussi si j'ai pas pris toutes mes infos, je suis obligé de le fermer sans l'avoir rempli.
    0
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      et en plus il me fait quand même l'erreur.
      Ca ne faisait plus l'erreur chez moi sans rien toucher d'autre, c'est pour ça...
      Ce qui n'est pas illogique puisqu'il se contente de le masquer.
      eric
      0
    2. gilles52300 Messages postés 36 Statut Membre
       
      Si j'arrivais à comprendre.... tout a l'heure j'avais un code sans erreur. je le copie et le met à la suite sans rien changer hormis les ranges..... et là il ne fonctionnait plus.
      Quand je vois comment je me casse la tête dès fois pour une ligne de code....
      Mais je reconnais que ta solution aurait pu m'arranger.
      0
  7. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Re,

    Dim DateReception As Date
    DateReception = UserForm3.TextBox1.Text

    Je pense que ce qu'il n'aime pas c'est une chaine vide...
    Essayer de tester pour toutes les dates :
    if UserForm3.TextBox1.Text <>"" then DateReception = UserForm3.TextBox1.Text
    Ou mieux, mettre un contrôle date&time picker qui contrôlera la validité des dates car tu auras le même soucis si qcq'un fait une faute de frappe et fournit une date non valide.

    Je te laisse tester ;-)

    eric

    Jamais tu ne répondras à un mp non sollicité...
    Bon, ça c'est fait.
    0
    1. gilles52300 Messages postés 36 Statut Membre
       
      C'est une bonne idée ta reflexion sur la fausse date. Je n'y avais pas songé mais tu as entièrement raison.
      Je vais me pencher sur ce problème et vous tiens informé de l'avancé de la résolution du problème.
      Je te remercie de ton aide.
      0
    2. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      et on peut se demander pourquoi ton programme va trainer sur ces lignes là puisque qu'on est sensés quitter sans traitement (?)
      eric
      0
    3. gilles52300 Messages postés 36 Statut Membre
       
      Ah non on est sensé les traités, mais dans ce cas précis, c'est suite à fausse manip.
      Autrement tous les combo et text sont à remplir avec les bonnes données. donc effectivement si la date n'est pas bonne (fausse date comme le 29/2) il faut le signaler car cela va influer sur le reste de l'exécution du traitement des données.
      Dans ce cas précis, je ne saurais te dire pourquoi il n'obéit pas à l'ordre de tout stopper.
      0
    4. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Oui, en marche normale quand on valide.
      Mais si on abandonne il ne devrait pas passer par ces lignes.

      Après ton UserForm3.Show tu ne devrais plus rien avoir.
      Et avoir tes calculs sur le bouton de validation, et en final le .hide si toutes les saisies sont correctes et les calculs effectués.
      En résumé sur le bouton de validation :
      - contrôle des saisies
      - si non correctes : message d'erreur et exit sub pour rester sur le formulaire.
      - si correctes on calcule et .hide

      Sur le bouton d'annulation (et tu peux remettre la croix de fermeture, tu cherchais à cacher la poussière sous le tapis là) :
      .hide

      eric
      0
    5. gilles52300 Messages postés 36 Statut Membre
       
      Ok je vois ce que tu veux dire. Je vais apporter la modification. Car effectivement le reste de mes calculs se font à la suite de userform.show
      Pour la poussière sur le tapis, je reconnais..... mea culpa!!!!!
      0
  8. Mike-31 Messages postés 18203 Date d'inscription   Statut Contributeur Dernière intervention   5 147
     
    Re,

    en décortiquant ton code, sur l'userform3 le bouton Fermeture et Enter ont la même fonction fermer l'userform un avec Hide l'autre Unload donc il est normal que l'on retrouve ce message d'erreur sur les deux.

    Ensuite le code à mon sens est mal placé et devrait être exemple sous un bouton Enter ou enregistrer etc ... parce qu'Excel se trouve avec un ordre sans aboutissement d'où erreur qu'il faut gérer ou il faut revoir ton code qui semble un mix
    0
  9. gilles52300 Messages postés 36 Statut Membre
     
    Je te remercie pour tes conseils Mike.
    Je suis un novice en VBA. j'ai débuté vba en 2006 (fichier de stock, création d'annonce en csv pour import sur le net, facturation...) et depuis plus rien jusqu'à ces jours.
    alors j'ai une petite base (toute petite) et je ne fini pas de découvrir la puissance et la complexité de vba. Je prend des morceau de code pour ce que je veux faire et je les assemble et fait en sorte que cela fonctionne.
    Donc je prend tous les conseils que l'on me donne et les appliques.
    C'est vrai que pour l'appel de l'userform j'ai toujours fait comme ça, mais c'est plus judicieux comme tu dis.
    A+
    Gilles
    0
  10. Mike-31 Messages postés 18203 Date d'inscription   Statut Contributeur Dernière intervention   5 147
     
    Re,

    C'est que j'ai remarqué, des bout de code pas toujours harmonieux, une sorte d'empilement.

    en fait je reprendrai les codes à zéro depuis la première action, mais bon si ça marche comme cela
    0
  11. Normad Messages postés 112 Date d'inscription   Statut Membre Dernière intervention   40
     
    C'est que ton code s'exécute alors qu'il ne devrait pas, est-ce que tu l'aurais mis dans l'évenènement Terminate par Hasard ?
    0
    1. gilles52300 Messages postés 36 Statut Membre
       
      Je n'avais pas mis mon code dans le bouton "enter"
      donc en fait mon code s'exécutait quand même dans tous les cas.
      merci pour ton info.
      0