Borrar contenido (en celdas especificas) al salir del libro

Necesito un help.

El código es este:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Range( _
        "AR5:AW5,AC8:AW12,AE15:AW16,I15:Y16,AE25:AM25,AA29:AW33,E29:Y33,F35:AW38,G8:L8,V10:Z10" _
        ).Select
    Range("V10").Activate
    Selection.ClearContents
    Range("W5:AB5").Select
'Proteger
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
ThisWorkbook.Save
End Sub

El problema es que tengo 6 hojas distintas y al salir por otra hoja, se borra el contenido de la que estaba por ultimo, necesito limitar el código a la hoja1. Así puedo salir de cualquiera sin coger riesgo de borrar otros contenidos.

3

3 respuestas

Respuesta
5

Te anexo la macro actualizada. Cambia "Hoja1" por el nombre de tu hoja

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    With Sheets("Hoja1")
        . Unprotect
        .Range("AR5:AW5,AC8:AW12,AE15:AW16,I15:Y16,AE25:AM25," & _
            "AA29:AW33,E29:Y33,F35:AW38,G8:L8,V10:Z10").ClearContents
        'Proteger
        .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
    End With
    ThisWorkbook.Save
End Sub

De esa forma puedes estar en cualquier hoja; entonces borra las celdas de la hoja1 y también la protege. Si la hoja está protegida cuando vas a salir del libro, entonces es necesario desproteger la hoja, borrar las celdas y volver a proteger la hoja.

.

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

.

Avísame cualquier duda

.

Lo intente, pide depurar.

Tienes que realizar esto:

Cambia "Hoja1" por el nombre de tu hoja

Revisa toda la explicación de mi respuesta.

De cualquier forma, avísame cualquier duda.

Respuesta
4

Voy a comentar algunos detalles, porque al seleccionar la hoja como bien dice James sucederán 2 cosas:

- Que probablemente la instrucción te de error. En algunas versiones Sheets(hoja). Range(rgo).Select da error y requiere que sean separadas:

Sheets(hoja).Select

Activesheet. Range(rgo).Select  .....por supuesto colocando los nombres de hoja y rango correspondientes.

- Lo segundo que sucederá es que al seleccionar la hoja luego la instrucción Protect solo lo hará en esa hoja seleccionada... y quizás quieras que se protejan también las otras, antes de salir.

Por lo tanto lo ideal sería que limpies la hoja sin seleccionarla.

Private Sub Workbook_BeforeClose(Cancel As Boolean)
'limpiar solo la hoja1
Sheets("Hoja1").Range( _
        "AR5:AW5,AC8:AW12,AE15:AW16,I15:Y16,AE25:AM25,AA29:AW33,E29:Y33,F35:AW38,G8:L8,V10:Z10" _
        ).ClearContents
'aquí decidir qué hoja debe ser seleccionada
    Range("W5:AB5").Select
'Proteger: decidir qué hoja debe ser protegida: Hoja1, desde la que se está cerrando o todas
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
ThisWorkbook.Save
End Sub

Y luego decides cuál se selecciona y cuál se protege. Aclara este detalle para ajustarla si hiciera falta.

No se porque me pide para depurar.

Necesito que la "hoja1" este protegida, si estoy en la "hoja3" no me importa dejarla desprotegida.

Lo que me pasa al salir es que, borra las celdas que en teoría solo tiene que borrar en la hoja1, este es todo el código, no hay nada mas.

Cuando limito a :

Sheets("Hoja1").

Salta mensaje depurar.

Que raro.

Es que no tenés ninguna hoja llamada Hoja1... allí debías colocar el nombre de la hoja a limpiar.

La siguiente instrucción (que te pasé en la macro) no necesita que selecciones la hoja y el resto de las instrucciones del BeforeClose se ejecutan en la hoja activa, cualquiera que sea:

Sheets("SCRA_1").Range( _
        "AR5:AW5, AC8:AW12, AE15:AW16, I15:Y16, AE25:AM25, AA29:AW33, E29:Y33, F35:AW38, G8:L8, V10:Z10" _
        ). ClearContents

Por eso preguntaba ayer si necesitas proteger la hoja desde donde sales o solo esta de datos. La hoja "SCRA_1" siempre se mantiene protegida porque no la desproteges en ningún momento... por lo que no necesita que la protejas al salir.

Te estoy enviando mail con comentarios.

Sdos!

Respuesta
1

Solo escribe lo siguiente, eso limita el borrado a la hoja 1

sheets("hoja1").Range( _
        "AR5:AW5,AC8:AW12,AE15:AW16,I15:Y16,AE25:AM25,AA29:AW33,E29:Y33,F35:AW38,G8:L8,V10:Z10" _
        ).Select

Me pide depurar.

Te pide depurar por esta razón la instrucción termina con select y el select solo puede funcionar en la hoja activa por ejemplo si estas en la hoja3 y aplicas esta instrucción sheets(hoja1). Range("a1").select de va a mandar a depurar, aqui hay solo dos opciones separar la instruccion en dos sheets(1).select y luego range("a1").select o bien como te han recomendado sheets("a1"). Range("a1"). Clear (si quieres borrar todo incluyendo formatos) o bien sheets("a1"). Range("a1"). Clearcontents (que solo borra la información dejando los formatos)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas