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 de Isaac Reyes
1
1
Isaac Reyes, Es mejor enseñar a pescar que dar el pescado
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.