web-dev-qa-db-fra.com

Créer et nommer une feuille de calcul dans Excel VBA

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
28
Sam Cogan

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"
35
Sage

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.

3
Dick Kusleika

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.

0
Sprague