Arrêt de VBA lors de la modification d'un CodeName par VBA

à tout hasard : Theze  a comme moi Excel 2007 ; tu as Excel 2013 ; alors peut-être que le problème rencontré est dû à la différence des deux versions, et en particulier celle concernant les interfaces (SDI vs MDI) 

Possible en effet, mais difficile à comprendre alors pourquoi le code donné par Theze fonctionne chez Daddy-Daniel et moi... le mystère reste entier

PE

Bonjour,

Je joint un exemple tiré du code de Theze et qui fonctionne avec Excel 2016, PE_67 as-tu l'occasion de le tester et au besoin de l'ajuster à ton besoin pour voir si ça marche.

Je continue à travailler dessus pour voir ce qui entraîne la fermeture de nos usf !

Cordialement.

Daddy

4codenametest1.xlsm (16.12 Ko)

Bonjour,

J'ai trouvé ces notes sur https://docs.microsoft.com/fr-fr/office/vba/api/excel.workbook.codename :

Propriété Workbook.CodeName (Excel)

Renvoie le nom de code de l’objet. String (en lecture seule).

Remarques

La valeur que vous voyez dans la cellule à droite de (nom) dans la fenêtre propriétés est le nom de code de l’objet sélectionné. Au moment de la conception, vous pouvez modifier le nom de code d’un objet en modifiant cette valeur. Vous ne pouvez pas modifier par programme cette propriété au moment de l’exécution................

Au moment de la dite conception, n'est t'il pas possible "d'imposer" à excel d'utiliser un "CodeName" stocké dans une variable ?

Peut-être une piste !

Pour info : j'ai déplacé ma ligne de code

ActiveSheet.Parent.VBProject.VBComponents(ThisWorkbook.Sheets(1).CodeName).Properties("_CodeName") = osCNsh & Format(osIdFeuil, "00")

à la fin dans celui du bouton "Sortir" juste avant

Unload Me

usfMenuPrincipal.Show 0

Résultat : le "CodeName" est changé, mon "usfSaisie" se ferme et mon "usfMenuPrincipal" apparaît une demi-seconde avant que tout se ferme !

Bon dimanche

DD

Bonjour,

Pourquoi faire simple :

ThisWorkbook.VBProject.VBComponents(Feuil1.CodeName).Name = osCNsh & Format(osIdFeuil, "00")

quand on peut faire compliqué :

ActiveSheet.Parent.VBProject.VBComponents(ThisWorkbook.Sheets(1).CodeName).Properties("_CodeName") = osCNsh & Format(osIdFeuil, "00")

Au moment de la conception, vous pouvez modifier le nom de code d’un objet en modifiant cette valeur. Vous ne pouvez pas modifier par programme cette propriété au moment de l’exécution

Cela signifie que tu ne peux pas faire directement la modif car la propriété directe de l'objet est en lecture seule, il te faut passer par la collection d'objets "VBComponents()". :

Feuil1.CodeName = osCNsh & Format(osIdFeuil, "00") '<--- n'est pas autorisé !

Postes ton fichier avec des explications pour pouvoir faire des tests !

Re bonjour,

Merci Theze, mes connaissances en VBA ne sont pas aussi pointues que les tiennes et je ne maîtrise pas bien « VBComponents ».

Le fait d’avoir utilisé « .Parent » n’est qu’un test parmi tant d’autre pour voir si j’observais un comportement différent. Ma ligne est en fait :

ThisWorkbook.VBProject.VBComponents(Sheets(1).CodeName).Name = osCNsh & Format(osIdFeuil, "00")

"Sheets(1)" car lors de la création d'une nouvelle année je la déplace en pole position.

"osCNsh" n'est autre que "Feuil".

"osIdFeuil" l'ID de ma feuille stocké par sécurité dans un fichier *.INI

"Format(mavariable,"00")" car j'oblige Excel à classer mes objets dans un ordre chronologique pur (Feuil01 ... Feuil99).

Mon projet est une assistance comptable avec 17 feuilles et des données confidentielles. Je vais préparer une mouture vierge et allégée sans données et la joindre lors d'un prochain message.

Cordialement

DD

Bonsoir;

Après moultes recherches j’ai fini par trouver ce qui clochait dans mes codes et qui entraînait la fermeture des "userforms" en modifiant le CodeName d’une feuille nouvellement créée.

Je déclarais mes "userforms" en mode "non modal" (Mon_UserForm.Show 0) ! En effet je souhaitais conserver la possibilité d’intervenir sur mes feuilles avec l’usf ouvert.

J’ai fais des essais avec le mode "modal" (Mon_UserForm.Show) et là surprise , il n’y a plus d’arrêt de VBA et par la même occasion mes usf restent ouvertes !

Je vais tout remettre mes codes en place et vous tiens informé du résultat.

J'invite PE_67 à vérifier ses UserForm.Show pour voir si ça fonctionne chez lui.

DD

Re-Bonsoir,

J'ai remis mes codes à jour dans mon projet principal et tout fonctionne correctement.

Je vous joint le fichier "Test" qui m'a permis de détecter l'erreur et tester les solutions.

Merci à tous, j'attend vos retours.

Cordialement.

Daddy

Bonjour,

Je joint un exemple tiré du code de Theze et qui fonctionne avec Excel 2016, PE_67 as-tu l'occasion de le tester et au besoin de l'ajuster à ton besoin pour voir si ça marche.

Je continue à travailler dessus pour voir ce qui entraîne la fermeture de nos usf !

Cordialement.

Daddy

CodeNameTest1.xlsm

Bonjour Daddy-Daniel,

Désolé pour la réponse tardive. Effectivement ton fichier fonctionne également chez moi sans fermeture de l'USF !

J’ai fais des essais avec le mode "modal" (Mon_UserForm.Show) et là surprise , il n’y a plus d’arrêt de VBA et par la même occasion mes usf restent ouvertes !

Comme tu l'indiques dans ton dernier post, il faut donc être en mode Modal (bien vu !!). Mais dans mon cas ce n'est pas envisageable, je dois toujours avoir la main sur mes feuilles en même temps que mes Userform sont ouvertes... alors j'ai tenté de modifier le mode en Modal avant la ligne de code de modification du CodeName puis de remettre le mode "non Modal", mais ça ne suffit pas visiblement... tant pis pour moi ! Je continue de me débrouiller sans modifier le CodeName, ça me va bien aussi.

Nota : sur ton fichier en début du message, j'ai également testé en changeant la propriété ShowModal de l'USF, et bonne nouvelle ça fonctionne également ! mais pas sur mon fichier... Du coup je ne comprends plus rien Pas grave, je laisse tomber pour le CodeName !

PE_67

Bonjour PE_67,

Le problème de CodeName qui arrête intempestivement VBA après la procédure de renommage est donc identifié et vient bien du mode "modal" qui coince.

Je ferais le même essai que toi sur ShowModal pour voir.

==> J'essaierais aussi si, sans fermer l'usf de Saisie "Non Modal", à l'étape de renommage du CodeName, d'ouvrir une nouvelle "usfModal" avec simplement :

a)le code de renommage dans le "sub UserForm_Initialize()",

b)le message "L'exercice xxxx a été généré !" dans un label,

c)un simple bouton "ok" pour sortir de cette usf et retourner à l'usf de Saisie.

comme s'il s'agissait d'un simple msgbox.

Je te tiendrais informé du résultat.

Cdt

Daddy

Rechercher des sujets similaires à "arret vba lors modification codename"