# Macro para AUTOBORRADO



## Miguelsp (May 11, 2004)

Hola

como parte de la seguridad de un documento querría que borrase (y salvase los cambios para que quedase borrado siempre) el contenido de todo el libro si se diesen la condicion siguiente:

Que en la celda A324 no ponga MSP

la razón para que salve cambios automaticamente es que no se pueda recuperar la infomación borrada.

Podríais ayudarme con la Macro?


----------



## paliman (May 12, 2004)

Algo así:

Sub Macro1()

    If Range("A324").Value = "MSP" Then
        Range("B2:E11").Select  
        Selection.ClearContents
        ActiveWorkbook.save
    End If

End Sub

El rango B2:E11 es el rango que se va a borrar. Obviamente tenés que cambiarlo por el tuyo.

Espero que te sirva.


----------



## Greg Truby (May 12, 2004)

Miguel,

Lo que Paliman escribió, usted tendría que hacerlo correr a mano.  Si usted desea algo automático, entonces usted podría aprovechar del evento de cambio de la hoja.  Si usted no ha trabajado con Event Procedures, haz un cliq-derecho sobre la etiqueta de la hoja deseada y del menucito que parece, escoja "View Code" y copy and paste el código abajo.  Puse el mismo rango para borrar que puso Paliman y igual al programa de él, usted tendría que cambiar la referencia para que corresponda a sus necesidades.  Un comentario más - con leer su Post, no pude determinar si al poner «MSP» en [A324] era que borrase o al *no* poner «MSP» que borrase.  Ésto borra al poner, si es al contrario cambie el signo de = a <>.

<font face=Courier New><SPAN style="color:#00007F">Private</SPAN> <SPAN style="color:#00007F">Sub</SPAN> Worksheet_Change(<SPAN style="color:#00007F">ByVal</SPAN> Target <SPAN style="color:#00007F">As</SPAN> Range)
    <SPAN style="color:#00007F">Dim</SPAN> rngToClear <SPAN style="color:#00007F">As</SPAN> Range
    <SPAN style="color:#00007F">Set</SPAN> rngToClear = [B2:E11]   <SPAN style="color:#007F00">' Cambie al rango deseado</SPAN>
    
    <SPAN style="color:#00007F">If</SPAN> UCase([A324]) = "MSP" <SPAN style="color:#00007F">Then</SPAN>
        Application.EnableEvents = <SPAN style="color:#00007F">False</SPAN>
        rngToClear.ClearContents
        Application.EnableEvents = <SPAN style="color:#00007F">True</SPAN>
        Application.DisplayAlerts = <SPAN style="color:#00007F">False</SPAN>
        ActiveWorkbook.Save
        Application.DisplayAlerts = <SPAN style="color:#00007F">True</SPAN>
    <SPAN style="color:#00007F">End</SPAN> <SPAN style="color:#00007F">If</SPAN>
<SPAN style="color:#00007F">End</SPAN> <SPAN style="color:#00007F">Sub</SPAN>


</FONT>
Cordialmente,


----------



## Greg Truby (May 12, 2004)

Una cosa más.  La versión arriba no borra celda [A324].  Asi que cualquier cambio no va registrando.  Entonces es muy posible que usted querría borrar [A324] también.  Abajo hace eso.

<font face=Courier New><SPAN style="color:#00007F">Private</SPAN> <SPAN style="color:#00007F">Sub</SPAN> Worksheet_Change(<SPAN style="color:#00007F">ByVal</SPAN> Target <SPAN style="color:#00007F">As</SPAN> Range)
    <SPAN style="color:#00007F">Dim</SPAN> rngToClear <SPAN style="color:#00007F">As</SPAN> Range
    <SPAN style="color:#00007F">Set</SPAN> rngToClear = [B2:E11]   <SPAN style="color:#007F00">' Cambie al rango deseado</SPAN>
    
    <SPAN style="color:#00007F">If</SPAN> UCase([A324]) = "MSP" <SPAN style="color:#00007F">Then</SPAN>
        Application.EnableEvents = <SPAN style="color:#00007F">False</SPAN>
        rngToClear.ClearContents
        [A324].ClearContents
        Application.EnableEvents = <SPAN style="color:#00007F">True</SPAN>
        Application.DisplayAlerts = <SPAN style="color:#00007F">False</SPAN>
        ActiveWorkbook.Save
        Application.DisplayAlerts = <SPAN style="color:#00007F">True</SPAN>
    <SPAN style="color:#00007F">End</SPAN> <SPAN style="color:#00007F">If</SPAN>
<SPAN style="color:#00007F">End</SPAN> <SPAN style="color:#00007F">Sub</SPAN>


</FONT>


----------



## Miguelsp (May 17, 2004)

Es fantástico Greg.

Es exactamente lo que necesitaba. Sólo una pregunta más. Habría alguna forma de que esto se cargase sin necesidad de que se preguntase al abrir el archivo o que no hubiese manera de abrir el archivo sin aceptar las macros?

La idea es que la seguridad del contenido funcione siempre, no sólo cuando se abre el archivo autorizando las Macros.

un saludo


----------



## Greg Truby (May 17, 2004)

Hola Miguel,

Con mucho gusto.  La forma que he visto propuesto aquí para forzar usarios tener macros capacitados es así:

Al salvar su cuaderno, tenga una sola hoja visible que tiene un mensaje en una de las celdas que informa al usarios que «Para utilizar este cuaderno es necesario tener macros capacitados.  Si usted está viendo la presente es porque su configuración de Excel se ha descapacitados macros.  Para capacitar macros....».   Las demás hojas del cuaderno están en una condición de xlVeryHidden.  (Si uno las pone en estado de solamente escondido {hidden} se puede "des-esconderlas" a mano usando el menú.)  Luego uno pone código para el evento Workbook_Open() que cambia el estado de la «Hoja de Aviso» a xlVeryHidden y el estado de las hojas normales a Visible.  Y la otra parte sería en el evento de Workbook_BeforeClose() que hace el reverso, devolviendo las hojas normales a un estado de xlVeryHidden y la Hoja de Aviso a un estado visible.  

Para más información me imagino que una busqueda en Mr. Excel para los términos «Enable», «Macros» y «xlVeryHidden» debe proveer otras platicas sobre esta misma tema.

Ejemplos usando xlVeryHidden:

<font face=Courier New><SPAN style="color:#00007F">Sub</SPAN> EscondaMeBien()
    <SPAN style="color:#007F00">' Después de correr este macro no se puede "UnHide"</SPAN>
    <SPAN style="color:#007F00">' la hoja Sheet1 por medio del menu.</SPAN>
    Sheets("Sheet1").Visible = xlVeryHidden
<SPAN style="color:#00007F">End</SPAN> <SPAN style="color:#00007F">Sub</SPAN>
    
<SPAN style="color:#00007F">Sub</SPAN> AquiEstoy()
    Sheets("Sheet1").Visible = <SPAN style="color:#00007F">True</SPAN>
    Sheets("Sheet1").Activate
<SPAN style="color:#00007F">End</SPAN> <SPAN style="color:#00007F">Sub</SPAN>

</FONT>


----------



## Miguelsp (May 31, 2004)

Gracias de nuevo,  ray: 

esta opción es fantástica y añade mucha seguridad.

Un saludo

M.


----------



## Greg Truby (Jun 1, 2004)

Hola Miguel,

Otra cosa que me parece obvio pero tal vez valga la pena decirlo es que en circumstancias donde un haría algo así entonces habrá que proteger el proyecto de VB también.  O sea en el Editor de VB, (en inglés por lo menos, no tengo el menú en español) del menú Tools|VBA Project Properties...|Protection (la etiqueta)  Pon un cheq en la caja para "Lock project for viewing." y la contraseña dos veces.

¡Pero ten cuidado que no se le olvide esta contraseña!  Quebrar la contraseña para un *cuaderno* o para una *hoja* es bastante fácil.  Según entiendo quebrar una contraseña para un proyecto, mientras posible, es más difícil.

Saludos,


----------



## jmollan (Jun 3, 2008)

Hola Greg:
Podrias adjuntar un ejemplo en un archivo excel del uso adecuado de xlVeryHidden, por favor ya que me seria de mucha ayuda.
Agradezco de antemano vuestro apoyo.

Santiago


----------



## leocoppens (Jun 18, 2008)

Hola Santiago,

Para esconder las hojas podrias hacer algo asi:

       Sub HideSheet()
            Sheets("Sheet1").Visible = xlSheetVeryHidden
       End Sub


Para mostrarla denuevo asi:

       Sub ShowSheet()
            Sheets("Sheet1").Visible = True
       End Sub


Un saludo!
Leo


----------

