2010-10-01 24 views
23

Tengo un código muy simple que agrega una nueva hoja de cálculo, después de las hojas de trabajo actuales, a un documento de Excel y luego cambia su nombre a uno ingresado en un cuadro de texto en una forma de usuario. Funciona bien en un nuevo libro de trabajo, sin embargo, en un libro de trabajo que tiene varias hojas de cálculo existentes, crea la nueva hoja de trabajo, pero no la renombra.Creando y nombrando hojas de cálculo en Excel VBA

Esto sólo ocurre la primera vez que se ejecuta este código, la próxima vez que se ejecuta bien. Lo que lo hace aún más extraño es que si abres el editor de VBA para intentar depurarlo, también funciona bien. Obviamente, esto hace que encontrar el error sea bastante difícil.

El código que estoy usando es aquí:

 Dim WS As Worksheet 

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

bastante simple. Me pregunto si este problema es que está intentando cambiar el nombre de la hoja antes de que se cree correctamente. ¿Hay una mejor manera de escribir este código?

Actualización: he empezado depuración esto utilizando msgboxes, como abrir el depurador hace la parada problema, y ​​parece que sólo deja de procesar el código de la mitad de:

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 tiene muchas maneras de mantener entretenido.A menudo no puedes hacer nada al respecto. Pruebe varias cosas relativamente inútiles, como usar la colección 'Worksheets' en lugar de' Sheets' o asignar 'txtSheetName.value' primero a una variable de cadena. – GSerg

+0

Parece que está configurando el nombre antes de que esté en txtSheetName. ¿Está ejecutando este código fuera del evento txtSheetName_Change? Si no, eso probablemente arreglaría el problema. –

+0

@Marc el evento se ejecuta desde un evento de botón, que valida si el cuadro de texto se ha establecido –

Respuesta

27

http://www.mrexcel.com/td0097.html

Dim WS as Worksheet 
Set WS = Sheets.Add 

No tiene que saber dónde está ubicado, o cómo se llama, simplemente se refiere a él como WS.
Si todavía quiere hacer esto de la manera "antigua", intente esto:

Sheets.Add.Name = "Test" 
+0

¿Cómo es eso diferente a lo que está haciendo OP? – GSerg

+0

No escribí el artículo, lo señalé a una fuente. cuando probé el código en el artículo, específicamente [Sheets.Add.Name = "test"], funcionó a la perfección. – Sage

+4

Sí, lo he intentado. El problema es que funciona perfectamente la segunda vez, o si abre el depurador o la hoja está en blanco, o la luna está en el tercer trimestre ... –

0

¿Estás cometiendo la célula antes de pulsar el botón (pulsando Enter)? El contenido de la celda debe almacenarse antes de poder usarse para nombrar una hoja.

Una forma mejor de hacerlo es abrir un cuadro de diálogo y obtener el nombre que desea utilizar.

+0

Toma el nombre de un cuadro de texto en un formulario de usuario. –

2

¿Está utilizando un controlador de errores? Si ignora los errores y trata de nombrar una hoja como una hoja existente o un nombre con caracteres no válidos, podría pasar por alto esa línea. Véase la función CleanSheetName aquí

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

para obtener una lista de caracteres no válidos que es posible que desee comprobar.

actualización

Otras cosas para probar: Fully referencias cualificadas, lanzando en un DOEVENTS, limpieza de código. Este código califica su referencia de Sheets a ThisWorkbook (puede cambiarlo a ActiveWorkbook si le conviene). También agrega mil DoEvents (sobreestimación estúpida, pero si algo tarda un poco en completarse, esto lo permitirá; es posible que solo necesite un DoEvents si esto realmente soluciona algo).

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 

Por último, cada vez que tengo un problema de VBA tonto que simplemente no tiene sentido, yo uso CodeCleaner de Rob Bovey. Es un complemento que exporta todos sus módulos a archivos de texto y luego los vuelve a importar. Puedes hacerlo manualmente también. Este proceso limpia cualquier código p corrupto que esté dando vueltas.

+0

Lamentablemente no, no estoy ignorando los errores, y el nombre funciona la segunda vez que lo ejecuta, lo que me dice que está bien. –

Cuestiones relacionadas