2010-10-01 8 views
23

J'ai un code très simple qui ajoute une nouvelle feuille de calcul, après les feuilles de calcul en cours, à un document Excel, puis change son nom en un entré dans une zone de texte sur un userform. Fonctionne correctement sur un nouveau classeur, mais dans un classeur qui a un certain nombre de feuilles de calcul existantes, il crée la nouvelle feuille de calcul, mais ne le renommer pas.Création et nommage de feuille de calcul dans Excel VBA

Cela ne se produit que la première fois que vous exécutez ce code, la prochaine fois qu'il fonctionnera correctement. La chose qui le rend encore plus étrange est que si vous ouvrez l'éditeur VBA pour essayer de le déboguer, il fonctionne bien aussi. Cela rend évidemment la recherche de l'erreur assez difficile.

Le code 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 ce 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 cela en utilisant msgboxes, comme l'ouverture du débogueur fait l'arrêt de problème, et il semble que juste arrête de traiter le code à mi-chemin:

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 
+1

Excel a plusieurs façons de vous amuser.Souvent, vous ne pouvez rien faire à ce sujet. Essayez diverses choses relativement inutiles, telles que l'utilisation de la collection 'Worksheets' au lieu de' Sheets' ou l'affectation de 'txtSheetName.value' à une variable de chaîne en premier. – GSerg

+0

Il semble que vous définissiez le nom avant qu'il ne soit dans txtSheetName. Exécutez-vous ce code hors de l'événement txtSheetName_Change? Sinon, cela réglerait probablement le problème. –

+0

@Marc l'événement est exécuté à partir d'un événement de bouton, qui valide si la zone de texte a été définie –

Répondre

27

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, ou quel est son nom, vous l'appelez simplement WS.
Si vous voulez toujours faire la « ancienne » façon, essayez ceci:

Sheets.Add.Name = "Test" 
+0

En quoi est-ce différent de ce que fait le PO? – GSerg

+0

Je n'ai pas écrit l'article, je l'ai pointé vers une source. quand j'ai testé le code dans l'article, en particulier le [Sheets.Add.Name = "test"] il a fonctionné parfaitement. – Sage

+4

Oui, j'ai essayé ça. Le problème est, il fonctionne parfaitement la deuxième fois, ou de vous ouvrir le débogueur ou la feuille est vide, ou la lune est dans le troisième trimestre ... –

0

Êtes-vous commettaient la cellule avant d'appuyer sur le bouton (appuyez sur Entrée)? Le contenu de la cellule doit être stocké avant de pouvoir être utilisé pour nommer une feuille.

Une meilleure façon de faire est de faire apparaître une boîte de dialogue et d'obtenir le nom que vous souhaitez utiliser.

+0

Il prend le nom d'une zone de texte sur un formulaire utilisateur. –

2

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 se peut que vous ignoriez 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 des caractères non valides que vous voudrez peut-être vérifier.

Mise à jour

Autres choses à essayer: références entièrement qualifiées, jetant dans un DOEVENTS, nettoyage de code. Ce code qualifie votre référence Sheets à ThisWorkbook (vous pouvez le changer en ActiveWorkbook si cela vous convient). Il ajoute également un millier de DoEvents (stupide overkill, mais si quelque chose prend du temps à se faire, cela lui permettra de - vous pourriez avoir besoin d'un seul DoEvents si cela corrige 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 VBA loufoque qui vient n'a pas de sens, j'utiliser CodeCleaner Rob Bovey. C'est un complément qui exporte tous vos modules dans des fichiers texte, puis les réimporte. Vous pouvez le faire manuellement aussi. Ce processus nettoie tout code p corrompu qui traîne.

+0

Malheureusement non, je n'ignore pas les erreurs, et le nom fonctionne la deuxième fois que vous l'exécutez, ce qui me dit que c'est ok. –