Protección contra copia de un libro excel

Tengo un libro que tengo protegido para evitar perdida de datos sin embargo la persona que opera este libro no es muy confiable por lo que e pensado crear alguna macro o algo así para evitar la copia del presente libro, algo así como autorización para copiar a una USB o enviarlo por mail y que solo se pueda operar en un solo equipo.

1 respuesta

Respuesta
1
Me temo que con macros no puedes evitar que un archivo sea duplicado, ya que las macros funccionan sólo cuando el documento está abierto.
Lo que sí puedes hacer, utilizando un poco de astucia, es evitar que se puedan ver los datos de tu documento si no se ingresa una clave, esto, utilizando macros.
Veamos los problemas a enfrentar:
1. Según el nivel de seguridad con que está configurado office, las macros se puden deshabilitar, por tanto hay que obligar a que se habiliten las macros.
Solución: Esto lo haremos ocultando las hojas utilizando macros, y permitiendo que la única forma de hacer que se vean sea utilizando macros. Esto lo hacemos dánlole el valor xlSheetVeryHidden a la propiedad visible de la hoja (Ocultamos las hojas antes de que el documento sea guardado y las mostramos al momento de abrir el documento). ¿Por qué antes de guardar? R.- Para que el documento siempre se guarde con las hojas ocultas.
2. Excel no permite que todas las hojas de un documento estén ocultas, por tanto vamos a crear una hoja en blanco que será la única que quede visible. IMPORTANTE: Debes ir al Editor VBA y a la propiedad "(Name)" de dicha hoja le das el valor "Bloqueo" (Este es el nombre con el que utilizo dicha hoja en el código) [Nótese que es "(Name)" no "Name", la hoja tiene ambas propiedades]
3. Si el documento se guarda pero no se está cerrando, desaparecerán las hojas y el documento quedará abierto, para ayudar a volver las hojas que se han ocultado, he agregado un botón en la hoja Bloqueo, dicho botón muestra las otras hojas, siempre y cuando la clave ingresada haya sido correcta.
Adicional:
El documento funciona con dos claves: una ingresada directamente en el código (clave maestra) y otra que se guarda en el registro de windows.
Si existe la clave en el registro de windows, es esta la clave que pide para ingresar. Si dicha clave no existe pide la clave maestra y luego pide asignar una nueva clave, que será la que se use habitualmente.
Lo de la clave maestra se utiliza para que, nadie más que quien tenga esa clave, permita que el documento pueda ser visto en otro computador.
Vulnerabilidad:
Quien sepa que la clave se almacena en el registro y sepa en qué lugar del registro se almacena la clave, podría replicarlo en otro computador y la planilla se podría utilizar sin problemas.
Alguna ideas para solucionar esto.
- En algún lugar del documento guardar el nombre del equipo y al abrir el documento comprobar si el equipo tiene el mismo nombre.
- Descomponer la clave en varias partes para que sea más complicado deducir como se almacena la clave.
- Aparte de almacenar la clave en el registro, crear un archivo adicional que también la contenga y hacer una doble validación.
Si te das cuenta, todas son vulnerables, pero algunas ofrecen menor probabilidad de ser descubiertas que otras.
----------------- CÓDIGO -------------------------

'Pega esto en el evento click del botón de la hoja bloqueo

    If ThisWorkbook.blnVer Then
        ThisWorkbook.subMostrar
        ThisWorkbook.hojaAct.Activate
    End If
'Pega esto en la sección de código del ThisWorkbook
Option Explicit
Public blnVer As Boolean
Public hojaAct As Worksheet
'Procedimiento para mostrar las hojas
Public Sub subMostrar()
    Dim i As Integer
    For i = 1 To Sheets.Count
        If Sheets(i).CodeName <> "Bloqueo" Then
            Sheets(i).Visible = xlSheetVisible
        End If
    Next
    Bloqueo.Visible = xlSheetVeryHidden
    blnVer = True
End Sub
'Procedimiento para ocultar las hojas
Sub subOcultar()
    Dim i As Integer
    Set hojaAct = ActiveSheet
    Bloqueo.Name = "Hoja 1" 'Le asignamos un caption a la hoja de bloqueo
                            'Este nombre debe ser distinto a todos los otros
    Bloqueo.Visible = xlSheetVisible
    For i = 1 To Sheets.Count
        If Sheets(i).CodeName <> "Bloqueo" Then
            Sheets(i).Visible = xlSheetVeryHidden
        End If
    Next
End Sub
'Eventos del libro
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    subOcultar
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    subOcultar
End Sub
Private Sub Workbook_Open()
    Dim strCMaestra As String
    Dim strClave As String
    strCMaestra = "clave_maestra" 'Clave maestra
                              'Si no hay clave, es solicitada para asignar una nueva
                              'clave, si la nueva clave es vacía, no es considerada
                              'como clave
    'Extraer la clave guardada
    strClave = GetSetting(ActiveWorkbook.Name, "seg", "pss", "")
    'Si hay una clave guardada, valildarla
    If strClave <> "" Then
        If strClave = InputBox("Ingrese su clave", "Ingrese clave") Then
            subMostrar
        End If
    Else
    'Si no hay clave, permitir el ingreso de una, previo ingreso de clave maestra
        If InputBox("Ingrese la clave maestra", "Ingrese clave") = strCMaestra Then
            SaveSetting ActiveWorkbook.Name, "seg", "pss", _
                InputBox("Ingrese una nueva clave de acceso", "Nueva Clave")
            MsgBox "Petición aceptada. Cierre la aplicación y vuelva a abrir", _
                vbInformation, "Petición aceptada"
        End If
    End If
End Sub
------------------------------------------------------
Finalmente, verás que se sacrifica la estética, pero en algo cumple con el objetivo.
No se me ocurre algo más mirando sólo al documento, lo otro sería entrar en las configuraciones del computador, pero no sé si de alguna forma se pueda evitar que alguien saque un archivo desde un pc.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas