Arrêt de VBA lors de la modification d'un CodeName par VBA Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
T
Theze
Passionné d'Excel
Passionné d'Excel
Messages : 3'513
Appréciations reçues : 242
Inscrit le : 26 janvier 2011
Version d'Excel : 2007

Message par Theze » 21 janvier 2019, 06:40

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
Il vaut mieux un qui sait que cent qui cherchent :wink:

Ce forum étant un lieu de partage, je n'accepte pas les messages privés !
D
Daddy-Daniel
Jeune membre
Jeune membre
Messages : 10
Inscrit le : 20 janvier 2019
Version d'Excel : 2016 FR

Message par Daddy-Daniel » 21 janvier 2019, 17:11

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
Avatar du membre
eriiic
Passionné d'Excel
Passionné d'Excel
Messages : 8'685
Appréciations reçues : 292
Inscrit le : 7 février 2010
Version d'Excel : 2010fr

Message par eriiic » 21 janvier 2019, 17:42

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.
En essayant continuellement, on finit par réussir.
Donc plus ça rate, plus on a de chances que ça marche.
(les Shadoks)

En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
D
Daddy-Daniel
Jeune membre
Jeune membre
Messages : 10
Inscrit le : 20 janvier 2019
Version d'Excel : 2016 FR

Message par Daddy-Daniel » 21 janvier 2019, 17:57

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
Avatar du membre
PE_67
Nouveau venu
Nouveau venu
Messages : 9
Inscrit le : 11 janvier 2019
Version d'Excel : 2013

Message par PE_67 » 21 janvier 2019, 18:40

Daddy-Daniel a écrit :
20 janvier 2019, 19:15
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
T
Theze
Passionné d'Excel
Passionné d'Excel
Messages : 3'513
Appréciations reçues : 242
Inscrit le : 26 janvier 2011
Version d'Excel : 2007

Message par Theze » 22 janvier 2019, 06:59

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 !
Il vaut mieux un qui sait que cent qui cherchent :wink:

Ce forum étant un lieu de partage, je n'accepte pas les messages privés !
Avatar du membre
PE_67
Nouveau venu
Nouveau venu
Messages : 9
Inscrit le : 11 janvier 2019
Version d'Excel : 2013

Message par PE_67 » 22 janvier 2019, 23:14

Bonjour Theze,

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

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
Avatar du membre
dhany
Passionné d'Excel
Passionné d'Excel
Messages : 6'698
Appréciations reçues : 646
Inscrit le : 3 octobre 2017
Version d'Excel : 2007 FR

Message par dhany » 23 janvier 2019, 04:26

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 ... e-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
T
Theze
Passionné d'Excel
Passionné d'Excel
Messages : 3'513
Appréciations reçues : 242
Inscrit le : 26 janvier 2011
Version d'Excel : 2007

Message par Theze » 23 janvier 2019, 06:30

Bonjour, bonjour dhany (°v°)°,

Effectivement, il se peut que l'explication soit là !
Il vaut mieux un qui sait que cent qui cherchent :wink:

Ce forum étant un lieu de partage, je n'accepte pas les messages privés !
D
Daddy-Daniel
Jeune membre
Jeune membre
Messages : 10
Inscrit le : 20 janvier 2019
Version d'Excel : 2016 FR

Message par Daddy-Daniel » 23 janvier 2019, 19:00

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 :cry: 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 :cry: l'usf se ferme aussi !

Nous finirons par trouver .
Merci a tous pour ces contributions.
Daddy
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message