Evitar copiar y cortar en un libro

Evitar copiar y cortar en un libro

Excel General Macros VBA Utilidades

Si compartes tu trabajo con otras personas y quieres evitar que se pueda copiar y cortar en un libro, hay una forma sencilla de hacerlo usando unas líneas de código VBA.

No es un sistema infalible, pero evitará que alguien, por error, haga algo que después lamente.

Habilitar contenido

Para que este sistema funcione, el libro se debe abrir con las macros habilitadas. De no ser así, estas no se ejecutarán y nuestro código no servirá de nada. Informa a los posibles usuarios de esto para que lo habiliten.

Impedir copiar y cortar

Para evitar copiar y cortar en un libro, lo que haremos será incluir unas cuantas líneas de código en los eventos Workbook_Open y Workbook_SheetSelectionChange. Tendremos que impedir que se pueda copiar y pegar o cortar y pegar por todos los métodos posibles.

Bloquear el menú contextual

Mucha gente utiliza el menú contextual (botón derecho) para acceder de forma rápida a las opciones de copiar/cortar y pegar.

Podemos evitar que este menú contextual aparezca con unas cuantas sencillas líneas de código.

Si queremos evitar que aparezca en una hoja en concreto, tendremos que añadir el siguiente código en el módulo asociado a dicha hoja:

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    Cancel = True
    MsgBox "Lo siento, no está permitido usar el menú contextual", vbExclamation + vbOKOnly, "Error"
End Sub
Evitar copiar y cortar en un libro - Mensaje aviso menú contectual deshabilitado

Como puedes ver, avisamos al usuario de dicha inhabilitación para que sepa que ocurre y no piense que tiene que reinstalar su Office porque no funciona su menú contextual.

Si quisiéramos que esta restricción se aplicase a todas las hojas de libro, en vez de insertar dicho código en el módulo de cada una de ellas, lo insertaríamos en el correspondiente a ThisWorkbook, en el evento Workbook_SheetBeforeRightClick:

Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
    Cancel = True
    MsgBox "Lo siento, no está permitido usar el menú contextual", vbExclamation + vbOKOnly, "Error"
End Sub

Inhabilitar el menú contextual en su totalidad es una medida un poco drástica que, como veremos un poco mas adelante, se puede evitar para lograr nuestro objetivo.

Hay otras opciones para deshabilitar únicamente los comandos de copiar y cortar de este menú contextual, pero aquí ya se complica un poco más la programación, así que no entraremos en ello.

Inhabilitar menú del ribbon

Con el paso anterior, evitamos que se pueda usar el menú contextual para copiar/cortar.

Pero nuestros usuarios, que siempre están pensando en métodos para hacer vanos nuestros esfuerzos por preservar la información son muy listos y ya que no pueden usar el menú contextual, recurren a la cinta de opciones.

Debemos evitar que puedan copiar y cortar en un libro por esta vía.

Hacen allí click en cortar, seleccionan la celda de destino (normalmente, aquella donde más se estropea nuestro trabajo), y vuelven a hacer click en el botón de pegar. ¡Objetivo conseguido! La hoja está ya cambiada, que es lo que pretendíamos evitar.

Pues nosotros vamos a ser mas listos, y vamos a impedirles hacer esto. Vamos a insertar, en ThisWorkbook el siguiente código:

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    Application.CutCopyMode = False
End Sub

Con esto, le dejamos a nuestro usuario que copie o corte, pero en cuanto seleccione una celda diferente, se ejecutará el evento SheetSelectionChange y le vaciará el portapapeles, impidiéndole pegar o mover lo seleccionado.

Por muy rápido que sea haciendo los clicks, VBA siempre será más rápido.

Este método, es igual de válido cuando el usuario haya utilizado el menú contextual. Por ello, es mas recomendable no usar la primera opción que deshabilita dicho menú entero y dejarle copiar o cortar, pero impedirle pegar.

Impedir copiar/cortar y pegar con atajos de teclado

Como nuestros usuario no se dará por vencido, seguro que intenta usar un atajo de teclado (ctrl+c ó ctrl+x y ctrl+v). ¡Seguro que cree que por aquí nos va a pillar!

Pero como ya hemos previsto que quiera usar esas triquiñuelas, hemos usado el comando Application.OnClick para interceptar esas combinaciones de teclas.

Con este comando detectamos las pulsaciones de teclas y podemos además indicar una macro que queramos ejecutar cuando se teclee una combinación de teclas determinada. Si no tenemos macro que ejecutar, indicaremos una cadena vacía «» y simplemente, no pasará nada.

Como somos mas chulos que un ocho, le vamos a decir a nuestro usuario que no le permitimos eso.

Lo primero que haremos, será modificar un poco la Sub Workbook_Open:

Private Sub Workbook_Open()
    Application.CutCopyMode = False
    Application.OnKey "^c", "Mensaje"
    Application.OnKey "^v", "Mensaje"
    Application.OnKey "^x", "Mensaje"
End Sub

Y añadiremos una Sub Mensaje() en un nuevo módulo:

Sub Mensaje()
    MsgBox "Las opciones de copiar/cortar y pegar, no están disponibles", vbExclamation + vbOKOnly, "Prohibido"
End Sub

De esta forma, cuando el usuario teclee cualquiera de las combinaciones interceptadas (Ctrl+c, ctrl+x o ctrl+v), verá lo siguiente:

Evitar copiar y cortar en un libro - Mensaje informativo no permitido copiar o cortar y pegar
Evitar arrastrar con el ratón

La última opción a la que nuestro usuario recurrirá, ya de forma desesperada, será la de arrastrar la celda. Tiene en mente destrozar nuestra hoja, y no cejará en su empeño bajo ningún concepto.

También vamos a impedirle esta opción. Unicamente necesitamos añadir a nuestro evento Workbook_Open una línea mas:

Application.CellDragAndDrop = False

Nos queda, por tanto la rutina completa como sigue:

Private Sub Workbook_Open()
    Application.CutCopyMode = False
    Application.OnKey "^c", "Mensaje"
    Application.OnKey "^v", "Mensaje"
    Application.OnKey "^x", "Mensaje"
    Application.CellDragAndDrop = False
End Sub

Listo. Con estas simples líneas de código, evitamos que se pueda copiar ó cortar y pegar en nuestro libro.

Permitir copiar, cortar y pegar

Obviamente, estamos protegiendo un libro. Pero estos cambios que hemos hecho afectan a Excel en general. Eso significa que si tenemos varios libros abiertos y abrimos éste, si no tocamos un poco el código, no podremos copiar, cortar ni pegar en ningún de ellos. Tendremos que arreglar esto.

Usaremos el evento Workbook_Deactivate para dejar todo como estaba y habilitar de nuevo el copiado, corte y pegado.

Este evento se ejecutará en este libro en el momento en que se desactive porque seleccionamos otro libro distinto, que pasará a activarse.

Lo que haremos será «deshacer» el código de la siguiente forma:

Private Sub Workbook_Deactivate()
    Application.CutCopyMode = True
    Application.OnKey "^c"
    Application.OnKey "^v"
    Application.OnKey "^x"
    Application.CellDragAndDrop = True
End Sub

Fijate que las líneas en que poníamos propiedades a False las ponemos a True y que en Application.OnClick, eliminamos el segundo argumento.

Dejar todo redondo

Para dejarlo todo perfecto, tenemos que pensar en un proceso normal de trabajo.

Primero, abrimos el libro. Cubrimos esto con el evento Workbook_Open.

Teniendo el libro abierto, vamos a consultar los datos o a trabajar con otro libro que tenemos abierto simultáneamente. Queremos dejar las opciones de copiar, cortar y pegar habilitadas ya que ese libro no necesitamos protegerlo. Cubrimos esta eventualidad con el evento Workbook_Deactivate.

Si ahora volvemos a nuestro libro protegido, no hay nada que «rearme» nuestras seguridades. Y las queremos habilitadas. Debemos, por tanto, habilitarlas de nuevo usando el evento Workbook_Activate.

Podremos copiar el código de Workbook_Open o, simplemente, hacer una llamada a dicha Sub, siempre que no tengamos mas líneas de código que solo deban ejecutarse al abrir. Si este es el caso, podríamos hacer:

Private Sub Workbook_Activate()
    Call Workbook_Open
End Sub

Finalmente, nos queda la situación de cierre de nuestro libro. Queremos, de nuevo, dejar habilitadas las opciones de copiar, cortar y pegar como si aqui no hubiese pasado nada.

Usaremos el evento Workbook_BeforeClose. Como en el caso anterior, podemos copiar el código de Workbook_Deactivate o llamar a esta Sub. Si lo hacemos vía llamada, tendremos:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Call Workbook_Deactivate
End Sub

Código completo en ThisWorkbook

El código completo dentro del objeto ThisWorkbook será entonces:

Private Sub Workbook_Open()
    Application.CutCopyMode = False
    Application.OnKey "^c", "Mensaje"
    Application.OnKey "^v", "Mensaje"
    Application.OnKey "^x", "Mensaje"
    Application.CellDragAndDrop = False
End Sub

Private Sub Workbook_Activate()
    Call Workbook_Open
End Sub

Private Sub Workbook_Deactivate()
    Application.CutCopyMode = True
    Application.OnKey "^c"
    Application.OnKey "^v"
    Application.OnKey "^x"
    Application.CellDragAndDrop = True
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Call Workbook_Deactivate
End Sub

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    Application.CutCopyMode = False
End Sub

Sub Mensaje()
    MsgBox "Las opciones de copiar/cortar y pegar, no están disponibles", vbExclamation + vbOKOnly, "Prohibido"
End Sub

Conclusión

Hemos visto como podemos, por medio de unas simples líneas de código, evitar copiar y cortar en un libro y posteriormente pegar.

Esto solo funcionará, lógicamente, si el usuario tiene habilitadas las macros. En caso contrario, nuestro esfuerzo no servirá de nada, pero el método es sencillo y las ventajas que obtendremos, importantes si necesitamos preservar el contenido ante eventuales cambios que pudieran afectar al correcto funcionamiento.

Si te ha parecido interesante, puedes consultar otros consejos y utilidades en el foro específico para ello o dejar tus aportaciones, que siempre serán bienvenidas.

Deja una respuesta