Saltar al contenido

Macro para sobreescribir nombre de hoja


rfm

Recommended Posts

publicado

Hola a todos y todas.

Como otras veces hice, acudo a este foro para solventar una duda, porque hasta ahora, me habéis ayudado rápidamente y siempre dando en el clavo.

Tengo un libro de excel y quiero que con una macro se copie la hoja en el mismo libro y con el nombre de unas celdas en concreto. La hice y hasta ahí todo bien. La dificultad se presenta cuando vuelvo a ejecutar la macro. Al intentar crear otra hoja con el mismo nombre, me da un error. Si le doy a depurar me resalta lo que sigue:

****************************************************

Sub Guardar_copia_convalor_celda()

'

' Guardar_copia_convalor_celda Macro

'

'

Sheets("Hoja1").Select

Sheets("Hoja1").Copy After:=Sheets(3)

Range("B2").Select

Selection.Copy

Sheets("Hoja1 (2)").Select

Sheets("Hoja1 (2)").Name = "CINCO"

Range("C2").Select

Application.CutCopyMode = False

Selection.Copy

Sheets("CINCO").Select

Sheets("CINCO").Name = "CINCO-AMARILLO" ******Esta es la línea que me resalta

End Sub

*******************************************

Entonces la pregunta es, ¿cómo puedo indicarle a excel que "sobreescriba" los datos de la hoja anteriormente generada con el mismo nombre? Es decir, lo que necesito es que si quiero generar una hoja y ya hay una con el mismo nombre, solamente se grabe la última, sobreescribiendo así la primera.

No sé si me he explicado bien.

Muchas gracias a todos y todas.

ejemplo-Sobreescribir.rar

publicado

Buenas, rfm

Lo que te ocurre es lo que suele pasar cuando se utiliza el grabador de macros y no se adapta posteriormente a lo que necesitas.

Efectivamente, no puedes crear una hoja con el mismo nombre de una ya existente pues te marcará el error del que hablas.

La lógica del código debería tener en cuenta cuál es el nombre que va a tener dicha hoja nueva y comprobar, previamente a su creación, si existe ya dicha hoja. De esa manera, podrías eliminar esa hoja y crear la nueva con el mismo nombre.

Mira a ver si te sirve como orientación.

De todos modos, debes detallar más el proceso de creación de hojas y las celdas que usas como referencia.

Un saludo,

Tese

publicado

Muchas gracias Tese1969.

Ando bastante verde en macros, por eso lo que hago es grabar una sencilla.

No sé muy bien a qué te refieres con "detallar más el proceso". Intentaré explicarme.

1.- Tengo una hoja con una lista desplegable y llena de datos.

2.- Cuando la cumplimento, quiero que se guarde una copia de esa hoja llena de datos con un nombre concreto. ¿Cuál? Los datos seleccionados de las dos listas desplegables. (ejemplo 1ºA-Lengua).

3.- Para grabar la macro, inicié la grabación, creé una copia de la hoja en cuestión y le cambié el nombre (derecho cambiar de nombre) copiando y pegando los dos datos de la lista delplegable.

4.- Problemas: si los datos cambian, la macro me da error porque al ejecutarla hay otra hoja como esa.

5.- Problemas: trasteando en la macro, me he dado cuenta de que solo sirve (aún dando error) para cuando la lista desplegable tiene una selección concreta (por ejemplo 1ºA). En cuanto le cambio la selección de la lista desplegable... falla.

6.- Hay alguna forma de crear macro que haga lo siguiente?

a) Cree una copia de la hoja en la que está la macro y de nombre tenga la unión de los dos datos seleccionados en la lista desplegable.

B) Que si ya existe una hoja con ese nombre, la borre y por tanto se genere otra nueva con los nuevos datos.

Uf... no sé si me expliqué bien. No puedo decir mucho más. Me estoy iniciando en las macros...

Dejo un ejemplo por si ayuda. (lo quiero hacer en la hoja "Criterios"

Muchas gracias de nuevo.

V-Ejemplo_MACRO_copiadehoja.rar

publicado

Pon esto en un módulo y cuéntame qué te parece.

Los datos de c1 y c2 de la hoja creada los deja como valores, quitando las listas desplegables, que imagino será lo que necesites.

Sub crea_clase()
Application.ScreenUpdating = False
Dim comprobar As Worksheet
nombre = Range("c1") & " - " & Range("c2")
origen = ActiveSheet.Name
On Error Resume Next

Set comprobar = Sheets(nombre)
Application.DisplayAlerts = False
If comprobar Is Nothing Then
empieza:
Sheets(origen).Copy After:=Sheets(Sheets.Count)
ActiveSheet.Name = nombre
Range("c1:c2").Select
With Selection.Validation
.Delete
End With
Range("c1").Select
Else
Sheets(nombre).Delete
GoTo empieza:
End If
Application.DisplayAlerts = True
Sheets(origen).Activate
Application.ScreenUpdating = True
End Sub
[/CODE]

Un saludo,

Tese

publicado

Perfecto!!! Excelente!!! Fabuloso!!!

Mil, dos mil o tres mil gracias. Funciona a las mil maravillas.

Te agradezco enormemente tu ayuda.

Gracias de nuevo.

publicado

Me alegro de que te haya gustado.

A ver si con un poco de suerte tienes contactos en Madrid y me buscan un huequecillo para echarles a ellos una mano, que estoy en desempleo y digo yo que algo podría hacer ;)

Recuerda dar el tema por finalizado para que los administradores lo puedan cerrar. Puedes escribir algo así como "Tema Solucionado".

Un saludo,

Tese

publicado

Hola de nuevo Tese.

Siento no estar en Madrid. Hasta Andalucía llega tu ayuda :mad:. De todas formas si me entero de algo por esos lares te lo hago saber.

Gracias de nuevo por tu ayuda.

Podemos dar esto como "Tema Solucionado".

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.