J'ai un code très simple qui ajoute une nouvelle feuille de calcul, après les feuilles de calcul actuelles, à un document Excel, puis change son nom pour celui qui est entré dans une zone de texte d'un formulaire utilisateur. Fonctionne correctement sur un nouveau classeur. Toutefois, dans un classeur comportant un certain nombre de feuilles de calcul existantes, il crée la nouvelle feuille de calcul sans le renommer.
Cela ne se produit que la première fois que vous exécutez ce code, la prochaine fois qu'il fonctionnera correctement. Ce qui le rend encore plus étrange, c'est que si vous ouvrez l'éditeur VBA pour essayer de le déboguer, tout se passera bien également. Cela rend évidemment l’erreur assez difficile à trouver.
Le code que j'utilise est ici:
Dim WS As Worksheet
Set WS = Sheets.Add(After:=Sheets(Worksheets.count))
WS.name = txtSheetName.value
Assez simple. Je me demande si le problème est qu'il essaie de renommer la feuille avant qu'elle ne soit correctement créée. Y a-t-il une meilleure façon d'écrire ce code?
Mise à jour: J'ai commencé le débogage à l'aide de msgboxes, car l'ouverture du débogueur arrête le problème et semble arrêter le traitement du code à mi-parcours:
Dim WS As Worksheet
MsgBox (WS Is Nothing)
Set WS = Sheets.Add(After:=Sheets(Worksheets.count))
'***** Nothing after this point gets processed *******
MsgBox (WS Is Nothing)
MsgBox WS.name
WS.name = txtSheetName.value
MsgBox WS.name
http://www.mrexcel.com/td0097.html
Dim WS as Worksheet
Set WS = Sheets.Add
Vous n'avez pas besoin de savoir où il se trouve, ni comment il s'appelle, vous vous référez simplement à WS.
Si vous voulez toujours faire cela à l'ancienne, essayez ceci:
Sheets.Add.Name = "Test"
Utilisez-vous un gestionnaire d'erreurs? Si vous ignorez les erreurs et essayez de nommer une feuille de la même manière qu'une feuille existante ou un nom avec des caractères non valides, il peut s'agir simplement de sauter cette ligne. Voir la fonction CleanSheetName ici
http://www.dailydoseofexcel.com/archives/2005/01/04/naming-a-sheet-based-on-a-cell /
pour une liste de caractères non valides que vous voudrez peut-être vérifier.
Mettre à jour
Autres choses à essayer: références complètes, lancer un Doevents, nettoyer le code. Ce code qualifie votre référence Sheets à ThisWorkbook (vous pouvez le changer en ActiveWorkbook si cela convient). Il ajoute également un millier de événements (débordement stupide, mais si quelque chose prend beaucoup de temps, cela vous le permettra - vous n'aurez peut-être besoin que d'un seul événement si cela corrige réellement quelque chose).
Dim WS As Worksheet
Dim i As Long
With ThisWorkbook
Set WS = .Worksheets.Add(After:=.Sheets(.Sheets.Count))
End With
For i = 1 To 1000
DoEvents
Next i
WS.Name = txtSheetName.Value
Enfin, chaque fois que j'ai un problème maladroit avec VBA qui n'a pas de sens, j'utilise CodeCleaner de Rob Bovey. C'est un complément qui exporte tous vos modules dans des fichiers texte, puis les réimporte. Vous pouvez aussi le faire manuellement. Ce processus élimine tout code p corrompu qui traîne.
Engagez-vous la cellule avant d'appuyer sur le bouton (en appuyant sur Entrée)? Le contenu de la cellule doit être stocké avant de pouvoir utiliser le nom d'une feuille.
Une meilleure façon de faire est d’afficher une boîte de dialogue et d’obtenir le nom que vous souhaitez utiliser.