XL 2013 Formulaire VBA plantage d'Excel

jptaz15

XLDnaute Nouveau
Bonjour à tous, j'espère que quelqu'un pourra m'aider.

J'ai un formulaire excel qui contient plusieurs textbox, dont certaines où on doit entrer des dates au format aaaa/mm/jj. Or tout fonctionnait très bien vendredi dernier et au retour de la fin de semaine un nouveau problème semble être apparu... Lorsque j'ouvre le formulaire (avec le bouton "nouveau") une première fois et que j'essais d'entrer par exemple la date de naissance, tout fonctionne. Si je ferme excel en sauvegardant, que je l'ouvre à nouveau et que j'essais d'entrer une date, excel plante. J'ai essayé de faire un peu de ménage, mais ça ne semble pas régler le problème. J'ai lu qu'on pouvait utiliser un logiciel du genre "code cleaner", est-ce que ça pourrait fonctionner? J'ai essayer d'en installer un au travail, mais je n'ai pas les droits d'administrateur. Les anciennes version de mon fichier (même les très anciennes) ont également le problème alors que tout fonctionnait bien avant vendredi...

ps : j'ai le même problème avec excel 2010 et 2013

merci d'avance si vous pouvez m'aider ou m'éclairer

Jp
 

Pièces jointes

  • Formulaire d'évaluation.xlsm
    430.8 KB · Affichages: 16
Solution
C
jptaz15

Dommage que tu ne connaisse pas les modules de classe, cela t'aurait évité beaucoup de code

Voici ton fichier avec le code optimisé et réduit avec module de classe pour la saisie des dates

Apparemment le problème ne se reproduit plus

Pour info, quand dans un contrôle tu as un événement "Change" et que dans cet événement tu change justement la valeur du contrôle, il faut faire un test de sortie... sinon tu as une boucle infernale

Tu feras également attention au remplissage de ton ENORME tableau lorsque tu clique sur "Continuer", il me semble que tu as des contrôles qui ne vont pas au bon endroit

Edit : 21/05, correctif code pour "Text_TA_repos_ini et Text_sign_ini"

@+

jptaz15

XLDnaute Nouveau
Bonjour jptaz15

Je ne rencontre pas ce soucis après la création de 4 fiches

Etrange et peu intuitif la saisie des dates au format américain :eek:
Bonjour BrunoM45,

merci pour ta réponse et pour avoir testé. As-tu essayé de sauvegarder et rouvrir le document. Généralement ça marche pour moi lors d'une première ouverture, puis ça plante lors de la saisie d'une date après réouverture du document.

Pour la date nous sommes habitué dans mon établissement à l'écrire comme cela hihi (au Canada :p)

jp
 
C

Compte Supprimé 979

Guest
jptaz15

Dommage que tu ne connaisse pas les modules de classe, cela t'aurait évité beaucoup de code

Voici ton fichier avec le code optimisé et réduit avec module de classe pour la saisie des dates

Apparemment le problème ne se reproduit plus

Pour info, quand dans un contrôle tu as un événement "Change" et que dans cet événement tu change justement la valeur du contrôle, il faut faire un test de sortie... sinon tu as une boucle infernale

Tu feras également attention au remplissage de ton ENORME tableau lorsque tu clique sur "Continuer", il me semble que tu as des contrôles qui ne vont pas au bon endroit

Edit : 21/05, correctif code pour "Text_TA_repos_ini et Text_sign_ini"

@+
 

Pièces jointes

  • Jptaz45_Formulaire d'évaluation vBM45_1.1.xlsm
    451.7 KB · Affichages: 14
Dernière modification par un modérateur:

jptaz15

XLDnaute Nouveau
jptaz15

Dommage que tu ne connaisse pas les modules de classe, cela t'aurait évité beaucoup de code

Voici ton fichier avec le code optimisé et réduit avec module de classe pour la saisie des dates

Apparemment le problème ne se reproduit plus

Pour info, quand dans un contrôle tu as un événement "Change" et que dans cet événement tu change justement la valeur du contrôle, il faut faire un test de sortie... sinon tu as une boucle infernale

Tu feras également attention au remplissage de ton ENORME tableau lorsque tu clique sur "Continuer", il me semble que tu as des contrôles qui ne vont pas au bon endroit

@+
Wow vraiment merci, ça fonctionne!! Je n'aurais jamais pu faire ça moi-même (je débute en VBA), c'est de la programmation de haut niveau ;) Merci pour les explications c'est très apprécié!
J'ai modifié quelques contrôles pour que tout se classe au bon endroit dans mon tableau et c'est bon.

merci encore

Jean-Philippe
 

jptaz15

XLDnaute Nouveau
jptaz15

Dommage que tu ne connaisse pas les modules de classe, cela t'aurait évité beaucoup de code

Voici ton fichier avec le code optimisé et réduit avec module de classe pour la saisie des dates

Apparemment le problème ne se reproduit plus

Pour info, quand dans un contrôle tu as un événement "Change" et que dans cet événement tu change justement la valeur du contrôle, il faut faire un test de sortie... sinon tu as une boucle infernale

Tu feras également attention au remplissage de ton ENORME tableau lorsque tu clique sur "Continuer", il me semble que tu as des contrôles qui ne vont pas au bon endroit

@+
Bonjour Bruno, désolé de te demander encore conseil. Dans le code que tu m'as donné il semble que les contrôles suivants : Text_TA_repos_ini et Text_sign_ini ne se formatent pas au format ###/### et ####/##/## comme les autres. J'ai changé le nom du dernier afin d'inclure le mot "date" dedans et ça fonctionne, mais je ne sais pas quoi faire pour l'autre (Text_TA_repos_ini).

Voici le code pour rappel

Merci beaucoup pour ton temps si tu as une solution

bonne journée

Jean-Philippe

VB:
' Utilisation d'un module de classe pour tous les controls contenant le terme "date"
Private Sub UserForm_Initialize()
  Dim Ctl As Control, Ind As Long, Ind7 As Integer
  Ind = 0: Ind7 = 0
  ' Pour chaque control de l'UserForm
  For Each Ctl In Me.Controls
    ' Si son nom contient "date"
    If InStr(1, Ctl.Name, "date", vbTextCompare) > 1 Or _
      InStr(1, "Text_sign_ini,Text_sign_fin", Ctl.Name) > 1 Then
      ' Définir une classe pour ce control
      ' Saisie d'une date de 10 caractères
      Ind = Ind + 1
      ReDim Preserve TbxDate(1 To Ind)
      Set TbxDate(Ind).TbxDate = Ctl
    End If
    ' 2 control avec saisi d'une date de 7 caractères
    If InStr(1, "Text_TA_repos_ini,Text_TA_repos_fin", Ctl.Name) > 1 Then
      Ind7 = Ind7 + 1
      ReDim Preserve Tbx7(1 To Ind7)
      Set Tbx7(Ind7).Tbx7 = Ctl
    End If
  Next Ctl
End Sub
 
C

Compte Supprimé 979

Guest
Salut jptaz15 ;-)

Je suis en train de voir que j'ai fait une boulette dans le code :eek:
En fait il faut faire
Code:
If Instr() > 0 Then
Il n'y a pas lieu de les renommer, sinon tu vas entrer dans la procédure des dates !

Car "Text_TA_repos_ini" est trouvé en 1ère position
De plus on peut ajouter l'option "vbTextCompare" qui évite un potentiel problème de majuscule/minuscule

Voici le code qui devrait fonctionner ;)
VB:
' Utilisation d'un module de classe pour tous les controls contenant le terme "date"
Private Sub UserForm_Initialize()
  Dim Ctl As Control, Ind As Long, Ind7 As Integer
  Ind = 0: Ind7 = 0
  ' Pour chaque control de l'UserForm
  For Each Ctl In Me.Controls
    ' Si son nom contient "date"
    If InStr(1, Ctl.Name, "date", vbTextCompare) > 0 Or _
      InStr(1, "Text_sign_ini,Text_sign_fin", Ctl.Name) > 0 Then
      ' Définir une classe pour ce control
      ' Saisie d'une date de 10 caractères
      Ind = Ind + 1
      ReDim Preserve TbxDate(1 To Ind)
      Set TbxDate(Ind).TbxDate = Ctl
    End If
    ' 2 control avec saisi d'une date de 7 caractères
    If InStr(1, "Text_TA_repos_ini,Text_TA_repos_fin", Ctl.Name, vbTextCompare) > 0 Then
      Ind7 = Ind7 + 1
      ReDim Preserve Tbx7(1 To Ind7)
      Set Tbx7(Ind7).Tbx7 = Ctl
    End If
  Next Ctl
End Sub

@+
 
Dernière modification par un modérateur:

jptaz15

XLDnaute Nouveau
Salut jptaz15 ;-)

Je suis en train de voir que j'ai fait une boulette dans le code :eek:
En fait il faut faire
Code:
If Instr() > 0 Then
Il n'y a pas lieu de les renommer, sinon tu vas entrer dans la procédure des dates !

Car "Text_TA_repos_ini" est trouvé en 1ère position
De plus on peut ajouter l'option "vbTextCompare" qui évite un potentiel problème de majuscule/minuscule

Voici le code qui devrait fonctionner ;)
VB:
' Utilisation d'un module de classe pour tous les controls contenant le terme "date"
Private Sub UserForm_Initialize()
  Dim Ctl As Control, Ind As Long, Ind7 As Integer
  Ind = 0: Ind7 = 0
  ' Pour chaque control de l'UserForm
  For Each Ctl In Me.Controls
    ' Si son nom contient "date"
    If InStr(1, Ctl.Name, "date", vbTextCompare) > 0 Or _
      InStr(1, "Text_sign_ini,Text_sign_fin", Ctl.Name) > 1 Then
      ' Définir une classe pour ce control
      ' Saisie d'une date de 10 caractères
      Ind = Ind + 1
      ReDim Preserve TbxDate(1 To Ind)
      Set TbxDate(Ind).TbxDate = Ctl
    End If
    ' 2 control avec saisi d'une date de 7 caractères
    If InStr(1, "Text_TA_repos_ini,Text_TA_repos_fin,Text_sign_ini,Text_sign_fin", Ctl.Name, vbTextCompare) > 0 Then
      Ind7 = Ind7 + 1
      ReDim Preserve Tbx7(1 To Ind7)
      Set Tbx7(Ind7).Tbx7 = Ctl
    End If
  Next Ctl
End Sub

@+
Merci infiniment pour ton aide, c'est vraiment très apprécié. Ça fonctionne très bien. Je te souhaite une excellente fin de journée!!
 

jptaz15

XLDnaute Nouveau
Salut jptaz15 ;-)

Je suis en train de voir que j'ai fait une boulette dans le code :eek:
En fait il faut faire
Code:
If Instr() > 0 Then
Il n'y a pas lieu de les renommer, sinon tu vas entrer dans la procédure des dates !

Car "Text_TA_repos_ini" est trouvé en 1ère position
De plus on peut ajouter l'option "vbTextCompare" qui évite un potentiel problème de majuscule/minuscule

Voici le code qui devrait fonctionner ;)
VB:
' Utilisation d'un module de classe pour tous les controls contenant le terme "date"
Private Sub UserForm_Initialize()
  Dim Ctl As Control, Ind As Long, Ind7 As Integer
  Ind = 0: Ind7 = 0
  ' Pour chaque control de l'UserForm
  For Each Ctl In Me.Controls
    ' Si son nom contient "date"
    If InStr(1, Ctl.Name, "date", vbTextCompare) > 0 Or _
      InStr(1, "Text_sign_ini,Text_sign_fin", Ctl.Name) > 0 Then
      ' Définir une classe pour ce control
      ' Saisie d'une date de 10 caractères
      Ind = Ind + 1
      ReDim Preserve TbxDate(1 To Ind)
      Set TbxDate(Ind).TbxDate = Ctl
    End If
    ' 2 control avec saisi d'une date de 7 caractères
    If InStr(1, "Text_TA_repos_ini,Text_TA_repos_fin", Ctl.Name, vbTextCompare) > 0 Then
      Ind7 = Ind7 + 1
      ReDim Preserve Tbx7(1 To Ind7)
      Set Tbx7(Ind7).Tbx7 = Ctl
    End If
  Next Ctl
End Sub

@+
Bonjour Bruno,

Tu vas me trouver casse-pied, je crois que la malchance me suit de près!! :eek::eek:
J'ai à nouveau le même problème qu'au début depuis cet après-midi et sans aucun changement dans le code qui fonctionnait bien depuis plusieurs jours. Ça se reproduit même dans le fichier original que tu m'as transféré et cela sans aucune modification... :confused: Chose un peu différente, j'ai eu 2 types d'erreurs qui se sont affichées à des moments différents depuis que je test, mais sans pouvoir les reproduire "erreur automation" et "Erreur : objet invoqué s'est déconnecté de ses clients"

Les étapes sont toujours les mêmes :

J'ouvre une première fois le fichier excel et le formulaire.
J'entre une date de naissance et généralement l'âge s'affiche sans bug.
Je ferme le formulaire soit avec "accepter" ou "annuler" et je quitte excel en sauvegardant.
J'ouvre excel à nouveau et j'essais d'entrer une date de naissance dans le formulaire et tout plante .
:oops:

Je commence à me trouver décourageant. Est-ce que ça serait mon ordinateur ou une autre boucle infinie??

Je joins ton fichier original, ainsi que le plus récent sur lequel j'ai travaillé. Si tu as encore un peu de temps ça serait très gentil.

merci!!

Jean-Philippe
 

Pièces jointes

  • Jptaz45_Formulaire d'évaluation vBM45.xlsm
    445.9 KB · Affichages: 10
  • Formulaire - 1.3.xlsm
    953.1 KB · Affichages: 10
C

Compte Supprimé 979

Guest
Salut jptaz45

Vraiment navré pour toi :( ça vient de ton USF :confused:
Je l'ai exporté puis importé dans un classeur vide et je rencontre le même plantage

En revanche, si j'isole la 1ère page de ton USF en supprimant le code superflu (pour la 1ère page)
je n'ai plus de souci

Ca ne vient pas du code, car le code supprimé, sauf pour la date de naissance, même problème de plantage.
 

jptaz15

XLDnaute Nouveau
Salut jptaz45

Vraiment navré pour toi :( ça vient de ton USF :confused:
Je l'ai exporté puis importé dans un classeur vide et je rencontre le même plantage

En revanche, si j'isole la 1ère page de ton USF en supprimant le code superflu (pour la 1ère page)
je n'ai plus de souci

Ca ne vient pas du code, car le code supprimé, sauf pour la date de naissance, même problème de plantage.
Bonjour Bruno, merci pour le suivi.

Est-ce donc dire que le bug provient de la partie de code qui me permet d'obtenir l'âge en entrant la date de naissance et qu'en enlevant cette boîte de texte, ainsi que le code pour l'âge, cela devrait régler le problème?

Est-ce que le fait que l'âge en question (jumelé à la valeur du "sexe") soit associée à un autre contrôle à la 3e page dans les facteurs de risque (par exemple, pour un homme de plus de 45 ans, le risque est plus grand et s'affiche donc dans le contrôle)?

Je pourrais probablement me passer de l'âge dans la situation où il n'y aurait rien à faire, mais à ton avis existe-t-il un moyen d'obtenir une valeur d'âge (et donc un facteur de risque) sans faire planter tout le document?

Merci pour ta réponse c'est très apprécié

JP
 
C

Compte Supprimé 979

Guest
RE,

Est-ce donc dire que le bug provient de la partie de code qui me permet d'obtenir l'âge en entrant la date de naissance et qu'en enlevant cette boîte de texte, ainsi que le code pour l'âge, cela devrait régler le problème?
Non, justement cela ne vient pas du code, enfin je pense, mais d'un contrôle foireux sur une autre page

Est-ce que le fait que l'âge en question (jumelé à la valeur du "sexe") soit associée à un autre contrôle à la 3e page dans les facteurs de risque (par exemple, pour un homme de plus de 45 ans, le risque est plus grand et s'affiche donc dans le contrôle)?
Non, ça ne vient pas de ça

Je pense que tu ne pourras pas résoudre ton souci simplement :(

Ce qu'il faudrait faire, dupliquer l'USF pour test
1) Garder uniquement la 1ère page dans un et tester... si ok, tu continues
2) Tu ajoutes une autre page avec tous les contrôles, tu testes, si tu continues point 2
Cela te permettra de déterminer à partir de quelle page quand ça "déconne"
Si c'est à partir de la page 3, il faudra juste garder la page 1 et la 3 et tester
Si ca ne passe pas, c'est bien qu'un de tes contrôles foire, reste à trouver lequel ;-)

J'espère que cela pourra t'aider

@+
 

jptaz15

XLDnaute Nouveau
RE,


Non, justement cela ne vient pas du code, enfin je pense, mais d'un contrôle foireux sur une autre page


Non, ça ne vient pas de ça

Je pense que tu ne pourras pas résoudre ton souci simplement :(

Ce qu'il faudrait faire, dupliquer l'USF pour test
1) Garder uniquement la 1ère page dans un et tester... si ok, tu continues
2) Tu ajoutes une autre page avec tous les contrôles, tu testes, si tu continues point 2
Cela te permettra de déterminer à partir de quelle page quand ça "déconne"
Si c'est à partir de la page 3, il faudra juste garder la page 1 et la 3 et tester
Si ca ne passe pas, c'est bien qu'un de tes contrôles foire, reste à trouver lequel ;-)

J'espère que cela pourra t'aider

@+
Bonjour Bruno,

merci pour ton aide, je vais tester cela!

bonne journée

JP
 

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 941
Membres
101 846
dernier inscrit
Silhabib