viernes, 21 de diciembre de 2012

VBA: Controlar el acceso a un libro de Excel.

Hace unos días me llegó una curiosa solicitud, y me pareció interesante publicarla. La cuestión planteada fué:
...como puedo hacer para dotarle a los archivos excel de un codigo invariable que me permita relacionar un archivo especifico con un alumno especifico. El problema que quiero subsanar es que los alumnos se pasan los archivos le cambian el nombre y entregan...

El asunto parece claro, de qué manera poder controlar que el libro de trabajo de un alumno no pasa de mano en mano, simplemente cambiando el nombre del fichero o cambiando algo del aspecto de formato de la hoja.
Se me ocurrió incluir un evento WorkBook_Open sencillo que verificará el acceso al libro mediante una clave de identidad, y que una vez introducida por primera vez, las posteriores exigiera siempre esta misma, y en caso contrario el libro de trabajo se cerrara.

Para ello he empleado algo recientemente explicado en este blog, la propiedad de las hojas Visible: SheetVeryHidden, que permite ocultar una hoja de cálculo de ojos indiscretos (el de los alumnos).

El primer paso es sencillo, ya que prepararemos la celda A2 de la hoja que he llamado 'DatosCheck', para que reciba y controle el primer y siguientes accesos, que será además la que ocultaremos:

VBA: Controlar el acceso a un libro de Excel.


Dentro del Explorador de proyectos del Editor de VBA, buscamos ThisWorkBook e introducimos en él el siguiente código con el evento Open:

Private Sub Workbook_Open()
Dim identificacion As String
'forzamos la realización de una pregunta de verificación
identificacion = InputBox("Identificación", "Núm identidad")
'comprobamos que la celda A2 elegida está vacía
'lo que significaría que es la primera vez que se accede al libro
If Sheets("DatosCheck").Range("A2").Value = vbEmpty Then
    'si está vacía, entonces la rellenamos con el código introducido
    'y salimos del procedimiento
    Sheets("DatosCheck").Range("A2").Value = identificacion
    Exit Sub
    Else
    'en caso contrario, verificamos que el código es el mismo introducido
    'la primera vez, si fuera diferente, cerramos el libro sin guardar cambios.
    If Sheets("DatosCheck").Range("A2").Value <> identificacion Then
    MsgBox "No corresponde!!!"
    ActiveWorkbook.Close SaveChanges:=False
    End If
End If
End Sub



Nuestro trabajo de seguridad terminará, una vez oculta (VeryHidden) nuestra hoja 'DatosCheck', protegiendo nuestro proyecto (ver cómo).

El funcionamiento es bien sencillo, al abrir el libro, aparecerá un cuadro que pedirá tu número de indetidad personal, la primera vez que se abra admitirá cualquier valor, que automáticamente quedará registrado en una hoja oculta, y el alumno podrá seguir trabajando sin problemas sobre el ejercicio propuesto.
En posteriores accesos al libro, se solicitará igualemente el número de indentidad, sólo se permitirá trabajar sobre el libro si el código introducido corresponde con el primero grabado, en caso contrario el libro se cerrará.

7 comentarios:

  1. Ismael

    He seguido el procedimiento para controlar el acceso, pero me aparece un error de "Subíndice fuera del intervalo"
    El ("DatosCheck") y ("A2") de la línea 7 y 10 no me aparecen en tono azul.

    ResponderEliminar
  2. Disculpa...ya corregi mi error...gracias

    ResponderEliminar
    Respuestas
    1. Excelente idea, de hecho hay que realizar este tipo de tareas sobre todo para aquellos estudiantes que piensan solo en copiar y pegar.
      Me pregunto si puedes ayudarnos agregando lo siguiente, que tenga una clave de acceso, que es la del Profesor, pues, para no estar buscando en una lista el código del estudiante, y digitarlo uno a uno, que tenga la opción de introducir inicialmente la clave del profe (este código va "oculto" en el código de macro), y así poder tener acceso al archivo correspondiente.

      Gracias por tus aportes.

      Armand

      Eliminar
    2. Hola Armand,
      de hecho por ese motivo nació el ejemplo expuesto.

      Para el desarrollo que me propones mejor envíame un correo a
      excelforo@gmail.com

      Slds cordiales

      Eliminar
  3. Buenas Noches. ¿Existe alguna forma en la que pueda controlar el nro de veces que se ingresa a un libro o proyecto de Excel. Es decir, que sólo se pueda ingresar por ejemplo 10 veces?

    ResponderEliminar
    Respuestas
    1. Hola Alexander,
      nos podríamos apoyar en una hoja oculta, donde ir llevando un contador físico en una celda concreta... cada vez que se entre en el fichero (con las macros activas!!) se incremente el valor de la celda en +1...
      de tal forma que si la celda es >10 no permita abrir el fichero.
      Todo se controlaría desde un evento _Open dentro de ThisWorbook...

      Espero haberte dado la idea (en esencia es bastante similar al ejemplo propuesto).
      Saludos

      Eliminar