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

Bonjour le forum,

Voici le premier message que je poste, étant tout nouveau membre. ,

Je suis bloqué sur une ligne d'une procédure qui crée et manipule un Worksheet qui est la suivante :

ThisWorkbook.Worksheets(Nom_Onglet).Parent.VBProject.VBComponents(Worksheets(Nom_Onglet).CodeName).Properties("_CodeName") = Nouveau_Nom_Onglet

Ce qui se passe concrètement, c'est que les Userform qui étaient affichées disparaissent, exactement comme si je cliquais sur le bouton STOP de l'éditeur de Visual Basic (sauf que les lignes de codes qui suivent sont bien exécutées, donc ce n'est pas le bouton STOP).

Je suppose que ceci est dû à la manipulation du VBA par code...?

Après faire des essais pour chercher à comprendre le comportement de VBA, je confirme qu'il ne s'agit pas d'une fermeture du formulaire (les événements QueryClose et Terminate de l'Userform ne sont pas détectés). En revanche c'est exactement le même comportement qui se produit si je clique sur le bouton STOP de Visual Basic ("Réinitialiser").

Auriez-vous déjà rencontré ce phénomène et existe-t-il une solution pour l'éviter, et ainsi conserver les Userform chargée ?

Je précise qu'à part ce phénomène, la procédure fonctionne sans planter, et que le résultat est bon. L'ennui c'est uniquement ce qui se passe avec cette fermeture de Userform...

Merci par avance,

PE

Bonjour PE, bienvenue sur le forum!

à tester,

ThisWorkbook.VBProject.VBComponents(.Worksheets("ancien_nom").CodeName).Name = "NouveauNom"

Bonjour i20100,

Merci de t'être penché sur mon problème. Je suis bien d'accord avec toi, ma ligne de code était maladroite ! quelque chose me faisait un peu mal aux yeux en la voyant mais ça n'avait pas fait tilte pour autant...

Cela dit, mon problème ne vient pas de là, les userform continuent de disparaître malgré la correction.

Une autre idée peut- être ?

Merci d'avance

PE

Bonjour PE,

sans voir ton fichier, il est difficile de voir ce qui cause problème

Bonjour,

Par contre, ce que je ne comprend pas, c'est la nécessité de renommer le module de la feuille ?

Bonjour,

Je joins un extrait du fichier, afin de mieux comprendre ce qu'il se passe. Il faut :

  • aller sur l'onglet "RECAP",
  • cliquer sur afficher usf (qui ne servira pas pour la manipulation)
  • cliquer sur "CREER ONGLET" (cellule C15), qui aura pour effet de créer une feuille (duplicata de la feuille TYPE masquée) et de modifier son Name et son CodeName.
  • L'USF disparaîtra ensuite.

Par contre, ce que je ne comprend pas, c'est la nécessité de renommer le module de la feuille ?

Dans mon code initiale je n'agissais que sur les Name, mais je me suis dit qu'il était préférable de prendre en compte les risques de modification de nom des onglets par les utilisateurs, c'est pour ça que j'ai décidé d'appeler mes feuilles par leur CodeName. Par ailleurs ça me permet d'utiliser le CodeName comme "mémoire" du Name : si le Name est modifié, je peux faire un contrôle avec la valeur du CodeName pour décider de la suite à donner.

Je trouvais aussi plus "propre" de travailler avec les CodeName, mais c'est peut-être une idée reçue....

Si jamais vous avez une autre idée, je suis preneur, et sinon il me faudra éviter de passer par le CodeName !

Bonne journée à tous,

PE

Re-bonjour à tous,

J'ai avancé sur mon problème, et les conclusions se précisent ; j'ai deux solutions :

  • soit je crée une feuille dans un autre classeur auquel je change le CodeName par VBA, avant de le ramener dans ThisWorkbook,
  • soit je ne touche pas au CodeName et j'utilise la racine du CodeName issue de celui de la feuille source

Je vais retenir la seconde, car plus simple et largement suffisante pour atteindre mon résultat. Le CodeName de la feuille dupliquée sera alors le suivant : d'une part la racine (CodeName) issue de la feuille type, et d'autre part par l'indice générée lors de la copie.

A savoir que il ne faut pas modifier les propriétés de projet VBA par code, car ceci peut avoir des effets indésirables sur le VBA, d'où mon problème initial, je présume.

Je considère le post résolu, merci encore pour votre implication.

PE

Bonjour,

tu aurais dû tenter le changer le codename une fois l'UF fermé.

eric

Bonjour Eric,

tu aurais dû tenter le changer le codename une fois l'UF fermé.

Sauf que dans mon cas j'ai besoin de faire cette manip avec l'USF ouverte, car les opérations ne sont pas terminées.

J'ai pu terminer la mise à jour de mon code selon la méthode citée

je ne touche pas au CodeName et j'utilise la racine du CodeName issue de celui de la feuille source

et ça y est, ça fonctionne aussi, et j'obtiens le même résultat

PE

Bonjour,

Je viens vers vous car j’ai la même contrainte a ce que mon USF reste ouverte après la modification du CodeName de la nouvelle feuille créée.

En effet, il est important que les feuilles nouvellement créées aient un classement précis.

Je ne comprend pas ta solution d’utiliser la ‘’racine du CodeName issue de celui de la feuille source’’

Peux-tu être plus explicit sur cette solution qui aurait solutionne ce problème.

D’avance merci.

Daddy

Bonjour,

Je ne vois toujours pas la nécessité de renommer le module de la feuille mais ceci fonctionne depuis un formulaire ouvert :

Private Sub CommandButton1_Click()

    Dim Fe As Worksheet

    Set Fe = Feuil1 'nom du module de la feuille chez moi nommée "Feuil1" (nom par défaut)

    Fe.Copy , Sheets(Sheets.Count) 'copie en bout de collection

    ThisWorkbook.VBProject.VBComponents(Sheets(Sheets.Count).CodeName).Name = "NouveauNom"

End Sub

Merci Theze pour cette réponse.

La nécessité de modifier le CodeName est de maintenir certaines feuilles en ordre chronologique à partir de « Feuil1 » (Feuil01 pour ma part). Excel ayant la fâcheuse habitude de classer les feuilles avec le premier chiffre ex : Feuil1, Feuil11……Feuil19, Feuil2, Feuil21……Feuil29, Feuil3, Feuil31 ….

Dans mon classeur, toutes les feuilles « non utiles » à l’utilisateur sont cachées et démarrent à Feuil100.

Votre instruction : ThisWorkbook.VBProject.VBComponents(Sheets(Sheets.Count).CodeName).Name = "NouveauNom" fonctionne mais renvoi elle aussi un message d’erreur juste après son exécution

« Impossible d’entrer en mode d’arrêt maintenant » En cliquant sur [Continuer] la procédure stoppe l’USF en cours et continue jusque la fin.

J’espère que ces explications sont limpides.

Cordialement.

Daddy

Bonjour

« Impossible d’entrer en mode d’arrêt maintenant »

en général ce message veut dire qu'on ne peut pas exécuter cette partie en pas à pas, mais fonctionne en mode 'normal'.

Met un Stop plus loin si tu veux reprendre en pas à pas.

eric.

Re-Bonjour,

J'ai fais un classeur avec le code de Theze et ça fonctionne, de plus l'USF ne se ferme pas !

Mon message d'erreur venait du fait qu'il restait quelque part dans un code un point d'arrêt ! J'ai fait un Crtl+Maj+F9 pour effacer tous les point d'arrêt. Mea culpa !

Par contre, tout comme PE_67 mon USF se ferme toujours avec la modification du CodeName de la nouvelle feuille !

Si quelqu'un a une idée

Daddy

Bonjour,

Je viens vers vous car j’ai la même contrainte a ce que mon USF reste ouverte après la modification du CodeName de la nouvelle feuille créée.

En effet, il est important que les feuilles nouvellement créées aient un classement précis.

Je ne comprend pas ta solution d’utiliser la ‘’racine du CodeName issue de celui de la feuille source’’

Peux-tu être plus explicit sur cette solution qui aurait solutionne ce problème.

D’avance merci.

Daddy

Bonjour Daddy,

Force est de constater que modifier le CodeName par la macro a la fâcheuse tendance de présenter un comportement anormale, notamment avec la fermeture des USF ouverte, comme si l'on cliquait sur le bouton STOP de Visual Basic ("Réinitialiser").

Donc la solution dans mon cas était de gérer le CodeName non pas en le modifier, mais directement en récupérant la "racine" du CodeName de la feuille source, je m'explique :

  • Mon but étant de copier une feuille TYPE pour travailler ensuite dessus, j'ai renommé le CodeName de cette feuille par "Feuil_TYPE"
  • Ensuite, lorsque je duplique cette feuille par macro, le CodeName des feuilles dupliquées sera le suivant : "Feuil_TYPE1", "Feuil_TYPE2", "Feuil_TYPE3", etc. : la "racine" du CodeName (celui de la feuille source) suivi d'un indice numérique
  • Je peux ensuite savoir si la feuille est la source ou une copie de cette manière :
 If ActiveSheet.CodeName = Feuil_TYPE.CodeName Then
    MsgBox "Il s'agit de la feuille type"
ElseIf Left(ActiveSheet.CodeName, Len("Feuil_TYPE")) = Feuil_TYPE.CodeName Then
    MsgBox "Il s'agit d'une copie de la feuille type"
End If

A savoir que les feuilles dupliquées seront alors classées dans l'ordre de création, selon le numéro généré derrière la "racine" du CodeName.

En espérant que mes explications pourront t'aider.

PE

Bonjour,

Un UserForm avec un bouton et un TextBox. Le code du bouton dans le module de l'UserForm :

Private Sub CommandButton1_Click()

    Dim Fe As Worksheet
    Dim NomFe As String
    Dim I As Integer
    Dim J As Integer
    Dim ID As Integer

    'nom du module du modèle qui va servir de racine à toutes les feuilles qui vont être crées
    NomFe = "ModeleType"

    'attribut à la variable le module de la feuille modèle, la feuille doit exister !
    Set Fe = ModeleType

    'création de 3 feuilles avec appel de la fonction d'indexation pour renommage de leur module avec formatage
    For I = 1 To 3

        ID = Indexation(NomFe)

        Fe.Copy , Sheets(Sheets.Count) 'copie en bout de collection
        ThisWorkbook.VBProject.VBComponents(Sheets(Sheets.Count).CodeName).Name = NomFe & Format(ID, "000")

    Next I

    'boucle entrant une valeur bidon dans le TextBox pour démontrer la non disparition de la Form
    'durant l'ajout de feuilles et renommage des modules
    For I = 1 To 100

        Me.TextBox1.Text = "Valeur " & I

        For J = 1 To 500: DoEvents

    Next J, I

    'de nouveau création de 3 feuilles avec appel de la fonction d'indexation pour renommage de leur module avec formatage
    For I = 1 To 3

        ID = Indexation(NomFe)

        Fe.Copy , Sheets(Sheets.Count) 'copie en bout de collection
        ThisWorkbook.VBProject.VBComponents(Sheets(Sheets.Count).CodeName).Name = NomFe & Format(ID, "000")

    Next I

    'inscrit le du module respectif dans la cellule A1 en renommant les feuilles du nom de leurs module
    For Each Fe In Worksheets

        If InStr(ThisWorkbook.VBProject.VBComponents(Fe.CodeName).Name, NomFe) <> 0 Then

            Fe.Name = Fe.CodeName
            Fe.Range("A1").Value = Fe.CodeName

        End If

    Next Fe

    'message de fin d'exécution
    MsgBox "Ajout de feuilles avec renommage de leur module respectif terminé !"

End Sub

Function Indexation(NomFe As String) As Integer

    Dim Fe As Worksheet
    Dim Max As Integer
    Dim I As Integer

    For Each Fe In Worksheets

        If InStr(ThisWorkbook.VBProject.VBComponents(Fe.CodeName).Name, NomFe) <> 0 Then Max = Max + 1

    Next Fe

    Indexation = Max

End Function

A aucun moment durant la création des feuilles avec renommage de leur module respectif, l'UserForm a disparu de l'écran ou sont code c'est arrêté, qu'il soit en Modal ou non Modal !

Bonjour Theze,

En effet ton code ne provoque pas la fermeture de l'USF, je n'y comprends plus rien... !!!

Pourtant c'est la même propriété qui est utilisée :

ThisWorkbook.VBProject.VBComponents(Sheets(Sheets.Count).CodeName).Name 

Dans tous les cas je fais en sorte de ne pas modifier le module des feuilles, mais l'explication m'intéresse, si tu as une idée !

PE

Bonjour,

à 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) :

https://docs.microsoft.com/fr-fr/office/vba/excel/concepts/programming-for-the-single-document-interface-in-excel

j'ai pas lu tout l'article, mais peut-être que la nouvelle gestion des fenêtres a une influence directe ou indirecte sur les UserForm ?

dhany

Bonjour, bonjour dhany ,

Effectivement, il se peut que l'explication soit là !

Bonsoir,

Pour ma part j'utilise 2016. J'ai realise l'appli de Theze et elle fonctionne sans fermeture de l'usf !

Fort de cela j'ai adapte ce code a mon projet et mon usf se ferme a la fin de la procedure !!

Ensuite j'ai cree un projet avec uniquement mon usf et le strict minimum de code et l'usf se ferme aussi !

Nous finirons par trouver .

Merci a tous pour ces contributions.

Daddy

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