2010-10-01 25 views
23

Ho un codice molto semplice che aggiunge un nuovo foglio di lavoro, dopo i fogli di lavoro correnti, a un documento Excel e quindi ne cambia il 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.Creazione e denominazione di un foglio di lavoro in Excel VBA

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 utilizzando è 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 il debug questo utilizzando MsgBoxes, come l'apertura del debugger rende la fermata problema, e sembra che semplicemente interrompe 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 
+1

Excel ha molti modi per farti divertire.Spesso non puoi farci nulla. Prova varie cose relativamente inutili, come usare la raccolta 'Worksheets' invece di' Sheets' o assegnare 'txtSheetName.value' a una variabile stringa prima. – GSerg

+0

Sembra che tu stia impostando il nome prima che sia in txtSheetName. Stai eseguendo questo codice dall'evento txtSheetName_Change? In caso contrario, probabilmente risolverebbe il problema. –

+0

@Marc l'evento viene eseguito da un evento button, che convalida se la casella di testo è stata impostata –

risposta

27

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 si desidera continuare a fare questo il "vecchio stile" modo, provate questo:

Sheets.Add.Name = "Test" 
+0

Com'è diverso da ciò che l'OP sta facendo? – GSerg

+0

Non ho scritto l'articolo, gli ho indicato una fonte. quando ho testato il codice nell'articolo, in particolare [Sheets.Add.Name = "test"] ha funzionato perfettamente. – Sage

+4

Sì, ci ho provato. Il problema è che funziona la seconda volta in modo impeccabile, oppure se apri il debugger o il foglio è vuoto, o la luna è nel terzo trimestre ... –

0

Stai commettendo la cellula prima di premere il pulsante (premere 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.

+0

Sta prendendo il nome da una casella di testo su un modulo utente. –

2

Si sta utilizzando un gestore 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 si consiglia di verificare la presenza di.

Aggiornamento

Altre cose da provare: Completamente riferimenti qualificati, gettando in un DoEvents, la 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 goofy VBA che proprio non ha senso, io uso 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.

+0

Purtroppo no, non sto ignorando gli errori, e il nome funziona la seconda volta che lo esegui, il che mi dice che va bene. –

Problemi correlati