Creazione e denominazione di un foglio di lavoro in VBA di Excel

Ho un codice molto semplice che aggiunge un nuovo foglio di lavoro, dopo i fogli di lavoro correnti, a un documento Excel, quindi cambia il suo nome in uno inserito in una casella di testo su un modulo utente. Funziona bene su una nuova cartella di lavoro, tuttavia in una cartella di lavoro che ha un numero di fogli di lavoro esistenti crea il nuovo foglio di lavoro, ma non la rinomina.

Questo accade solo la prima volta che si esegue questo codice, la volta successiva verrà eseguito correttamente. La cosa che rende ancora più strano è che se apri l’editor VBA per provarlo e eseguirne il debug, allora funziona egregiamente. Questo ovviamente rende difficile trovare l’errore.

Il codice che sto usando è qui:

Dim WS As Worksheet Set WS = Sheets.Add(After:=Sheets(Worksheets.count)) WS.name = txtSheetName.value 

Abbastanza semplice. Mi chiedo se questo problema è che sta cercando di rinominare il foglio prima che sia creato correttamente? C’è un modo migliore per scrivere questo codice?

Aggiornamento: ho iniziato a eseguire il debugging utilizzando msgbox, poiché l’apertura del debugger interrompe il problema e sembra che interrompa l’elaborazione del codice a metà:

  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 

Non devi sapere dove si trova, o come si chiama, ti riferisci semplicemente a WS.
Se vuoi ancora farlo nel modo “vecchio stile”, prova questo:

 Sheets.Add.Name = "Test" 

Stai usando un gestore di errori? Se stai ignorando gli errori e provi a nominare un foglio come un foglio esistente o un nome con caratteri non validi, potrebbe semplicemente saltare su quella linea. Vedere la funzione CleanSheetName qui

http://www.dailydoseofexcel.com/archives/2005/01/04/naming-a-sheet-based-on-a-cell/

per un elenco di caratteri non validi che potresti voler controllare.

Aggiornare

Altre cose da provare: referenze complete, lancio di un Doevents, pulizia del codice. Questo codice qualifica il tuo riferimento di Fogli a ThisWorkbook (puoi cambiarlo in ActiveWorkbook se ciò si addice). Aggiunge anche un migliaio di DoEvents (stupido overkill, ma se c’è bisogno di un po ‘di tempo per farlo, questo lo permetterà – potreste aver bisogno di un solo DoEvents se questo effettivamente risolve qualsiasi cosa).

 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 

Infine, ogni volta che ho un problema VBA stupido che non ha senso, uso il CodeCleaner di Rob Bovey. È un componente aggiuntivo che esporta tutti i tuoi moduli in file di testo e li reimporta. Puoi farlo anche manualmente. Questo processo elimina ogni p-code corrotto che gira intorno.

Stai accettando la cella prima di premere il pulsante (premendo Invio)? Il contenuto della cella deve essere memorizzato prima di poter essere utilizzato per denominare un foglio.

Un modo migliore per farlo è aprire una finestra di dialogo e ottenere il nome che si desidera utilizzare.