GRABAR EL NOMBRE DE USUARIO DE WINDOWS CUANDO ABRIMOS Y CERRAMOS NUESTRO ARCHIVO EXCEL

Últimamente estoy recibiendo bastantes consultas, algunas son demasiado extensas como para realizar un ejemplo en un post, pero otras son perfectas para realizar un post.

La consulta que me enviaron ayer trata sobre la posibilidad de obtener el usuario de Windows con VBA y utilizarlo en una archivo compartido para identificar las personas que acceden (y también obtener la misma información en el momento que cierran en archivo).

Además aprovecho para agregar dos datos más a la información: la fecha y la hora.

En realidad son dos macros, una para la apertura y otra para el cierre. Para cuando abrimos el archivo, creo que lo que mejor se ajusta es grabar el código en ThisWorkbook  y utilizar el evento Open. La macro que debéis pegar es esta:

Private Sub Workbook_Open()
'Declaramos variables
Dim sNetwork As Object
Dim i As Integer, fin As Integer
'Obtenemos nombre del usuario del equipo
Set sNetwork = CreateObject("WScript.Network")
UserName = sNetwork.UserName
'Mostramos los datos en la Hoja1 al abrir el archivo
With Sheets("Hoja1")
fin = Application.CountA(Sheets("Hoja1").Range("A:A"))
For i = 2 To fin
If .Cells(i, 1) = "" Then
Final = i
Exit For
End If
Next
'Nombre de usuario
.Cells(i, 1) = UserName
'Fecha
.Cells(i, 2) = Date
'Hora
.Cells(i, 3) = Format(Time, "h:mm:ss")
'Indicamos que la acción es de apertura del archivo
.Cells(i, 4) = "ABRE ARCHIVO"
End With
'Liberamos variables
Set sNetwork = Nothing
End Sub

Con esta macro vamos a obtener la siguiente información:

GRABAR EL NOMBRE DE USUARIO DE WINDOWS CUANDO ABRIMOS Y CERRAMOS NUESTRO ARCHIVO EXCEL

Para grabar los datos con el cierre del archivo vamos a utilizar la siguiente macro:

Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)
'Declaramos variables
Dim sNetwork As Object
Dim i As Integer, fin As Integer
'Obtenemos nombre del usuario del equipo
Set sNetwork = CreateObject("WScript.Network")
UserName = sNetwork.UserName
'Mostramos los datos en la Hoja1 al cerrar el archivo
With Sheets("Hoja1")
fin = Application.CountA(Sheets("Hoja1").Range("A:A"))
For i = 2 To fin
If .Cells(i, 1) = "" Then
Final = i
Exit For
End If
Next
'Nombre de usuario
.Cells(i, 1) = UserName
'Fecha
.Cells(i, 2) = Date
'Hora
.Cells(i, 3) = Format(Time, "h:mm:ss")
'Indicamos que la acción es de apertura del archivo
.Cells(i, 4) = "CIERRA EXCEL"
End With
'Liberamos variables
Set sNetwork = Nothing
ActiveWorkbook.Save
End Sub

Aquí vamos a utilizar el evento Workbook_WindowDeactivate y además, guardaremos el archivo desactivando con ActiveWorkbook.Save, este es el resultado:

GRABAR EL NOMBRE DE USUARIO DE WINDOWS CUANDO ABRIMOS Y CERRAMOS NUESTRO ARCHIVO EXCEL1

Obviamente, si abrimos y cerramos varias  veces el archivo tendremos varios registros indicando nuestra actividad.

El archivo os lo dejo en blanco, de manera que cuando lo abráis aparecerán vuestros datos grabados en la Hoja1 del archivo. El archivo se puede cambiar a compartido si es necesario, las macros funcionarán perfectamente (probado en Excel 2010 y Excel 2016).

Espero que sea de vuestro interés 🙂

Descarga el archivo de ejemplo pulsando en: GRABAR EL NOMBRE DE USUARIO DE WINDOWS CUANDO ABRIMOS Y CERRAMOS NUESTRO ARCHIVO EXCEL

 

Anuncios

LOGARSE CON EL NOMBRE DE USUARIO DEL EQUIPO PARA ACCEDER A EXCEL

Muy a menudo, cuando realizamos nuestros proyectos en Excel y no queremos que la información sea pública porque queremos restringirla a ciertos usuarios, solemos utilizar macros para confeccionar diálogos de contraseñas, por ejemplo para abrir un userform, en esta web ya tratamos este tema aquí.

Lógicamente, esto cobra especial importancia cuando trabajamos en red dado que nuestro archivo es accesible a un gran número de usuarios. Para solucionar esta problemática de seguridad, podemos recurrir a claves, que no siempre son la solución ideal, dado que se pueden compartir, o prestar, etc.  provocando que no sepamos realmente quien accede a nuestra información. O podemos utilizar el nombre del usuario activo en el equipo que se conecta para tener controlados los accesos.

¿Cómo lo hacemos?.  Es sencillo, teniendo en cuenta el siguiente código:

Set objNetwork = CreateObject("WScript.Network")
UserName = objNetwork.UserName

Con él podemos conocer el nombre del usuario que se encuentra activo en el equipo. Con este dato ya tenemos suficiente para crear nuestro sistema de seguridad. Aunque estoy seguro que con esta información ya la adaptaréis sin problema a vuestros equipos, por mi parte, voy a realizar un pequeño ejemplo para que veáis como se puede implementar.

Imaginad que tenemos un archivo en el que hemos desarrollado un programa realizado con formularios y lo colocamos en un directorio común al que solo queremos que accedan ciertos usuarios. En ese formulario (que lo vamos denominar como “INFORMACIÓN”), hemos colocado un textbox que cuando el usuario tenga permiso de acceso, mostrará que está conectado y se pondrá de color verde. En caso de que no lo esté no le mostrará nada, simplemente el “INFORMACIÓN” no se mostrará.

Vamos entonces a implementar un código que realice lo que hemos comentado. La macro que vamos utilizar es la siguiente:

Private Sub UserForm_Initialize()
Dim cnn As New ADODB.Connection
Dim recSet As New ADODB.Recordset
Dim strSQL As String
Dim objNetwork As Object
INFORMACION.TextBox1.BackColor = vbWhite
'OBTENEMOS EL NOMBRE DE USUARIO ACTIVO EN EL EQUIPO
Set objNetwork = CreateObject("WScript.Network")
UserName = objNetwork.UserName
'CONECTAMOS CON EL ARCHIVO QUE CONTIENE EL NOMBRE DE LOS USUARIOS
Set cnn = New ADODB.Connection
With cnn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.ConnectionString = "DATA SOURCE= " & ThisWorkbook.Path & "\" & "LOGARSE_CON_EL_NOMBRE_DE_USUARIO_DEL_EQUIPO.xls"
.Properties("Extended Properties") = "Excel 12.0; HDR=YES"
.Open
End With
'CON UNA CONSULTA SQL COMPROBAMOS SI EXISTE EL USUARIO DEL EQUIPO EN NUESTRA BASE DE DATOS
strSQL = "SELECT [DATOS$].[USUARIO] " & _
"FROM [DATOS$] " & _
"WHERE[DATOS$].[USUARIO] = " & " '" & UserName & "'"
recSet.Open strSQL, cnn
strTexto = recSet![Usuario]
'SI EXISTE, EXTRAEMOS EL NOMBRE Y ES IGUAL AL DEL EQUIPO, MOSTRAMOS EN EL FORM MENSAJE DE CONECTADO
'SI NO EXISTE, EL MODULO ThisWorkBook controlará el error.
With INFORMACION
If UserName = strTexto Then
.TextBox1.Value = "USUARIO: (" & UCase(UserName) & ") ESTÁ CONECTADO"
.TextBox1.BackColor = vbGreen
End If
End With
'DESCONECTAMOS
recSet.Close: Set recSet = Nothing
cnn.Close: Set cnn = Nothing
End Sub

Este código lo colocaremos en el userform, en el evento “Initialize”, de forma que se ejecutará cuando “INFORMACIÓN” se muestre.

Como podéis ver, en la macro nos estamos conectando y realizando una consulta SQL a otra hoja para comprobar qué usuario actual está en nuestra base de datos. En este caso he utilizado el mismo archivo, pero lo lógico es conectarse a otro archivo diferente que contenga esta base de datos o incluso también a un base de datos en Access en otro directorio. Pero como ejemplo nos sirve.

Aquí nos conectamos a nuestro propio archivo, y consultamos los datos que se encuentran en la hoja denominada “DATOS”, donde está el listado de usuarios permitidos. Automáticamente, si todo es correcto, “INFORMACIÓN” se mostrará y aparecerá el textbox en verde con el nombre de usuario concectado.

En caso de que no exista, el sistema mostrará un error y no se abrirá nada. Pero para controlar el error y mostrar un cuadro de diálogo que diga, por ejemplo: “EXISTE UN PROBLEMA CON SU USUARIO”. Vamos a incluir este código en el módulo ThisWorkBook, en el evento Workbook_Open :

Private Sub Workbook_Open()
'Si en el momento de mostrar el formulario INFORMACION
'aparece el error 3021 (no encuentra el usuario, o no es correcto)
'INFORMACIÓN no se abrirá y mostraremos un MsgBox advirtiendo del motivo
On Error GoTo Usuario
INFORMACION.Show
Usuario:
If Err.Number = "3021" Then MsgBox ("EXISTE UN PROBLEMA CON SU USUARIO"), vbExclamation, "CONTROL USUARIOS"
End Sub

Una vez hayáis implementado todos pasos, y si vuestro usuario coincide con el que consta en la base de datos, el userform se abrirá y mostrará esta información:

LOGARSE CON EL NOMBRE DE USUARIO DEL EQUIPO PARA ACCEDER A EXCEL

Y este sistema lo podéis implementar en un sinfín de situaciones y según vuestras necesidades. Es interesante porque mantenemos el control de nuestras aplicaciones desde otro lugar, sin necesidad de entregar claves ni proteger la información, simplemente damos o no acceso.

Descarga el archivo de ejemplo pulsando en: LOGARSE CON EL NOMBRE DE USUARIO DEL EQUIPO PARA ACCEDER A EXCEL