Hojas de cálculo en Excel - página principal

Usuarios, hojas y permisos

Hoy vamos a ver como podemos mostrar determinadas hojas de cálculo dependiendo del usuario que abra el libro de excel. Para ello, vamos a suponer que tenemos una red de ordenadores, donde diferentes usuarios utilizan un mismo libro de excel, alojado por ejemplo en el servidor. Vamos a suponer también, que solo a determinados usuarios, les dejaremos interactuar con determinadas hojas. El resto de usuarios no podrán usar esas hojas de cálculo que requieren de más privilegios. Esto nos servirá de complemento a otro macro que ya vimos en su momento, y que nos sirve para controlar los cambios que han hecho los usuarios que utilizan un mismo libro de excel.

Para comenzar, lo primero que haremos una vez abierto el libro, será seleccionar en el menú Herramientas, la opción Compartir libro…, y le pondremos una muesca a la opción Permitir la modificación por varios usuarios a la vez. Esto también permite combinar libros. Una vez hecho esto, guardaremos el fichero.

Ahora crearemos un macro dentro de un módulo, para el evento Workbook Open, es decir, que será un macro que se ejecutará al abrirse el fichero. El código que usaremos, será el siguiente:


Private Sub Workbook_Open()
'Creamos un vector con todos los usuarios con
'permisos de mayor nivel, para lo cual creamos una lista

administradores = "Contabilidad,Facturacion,Personal,Mateo,Ignacio,Irene"
'separamos los elementos de la matriz
'"administradores" usando split, y por la coma

administrador = Split(LCase(administradores), ",")
'Miramos si el nombre del usuario que ha abierto
'el fichero de excel, está en esa lista

usuario = LCase(Application.UserName)
For i = 0 To UBound(administrador)
posicion = posicion + InStr(usuario, administrador(i))
Next
'Si el nombre del usuario no está dentro de
'la lista, entonces, la posición será igual a 0,
'por lo que el usuario no tendrá derechos de administrador

If posicion = 0 Then
'en ese caso, ocultamos las hojas que no queremos mostrar
'(en este caso suponemos que es la hoja3, pero el nombre
'interno que se ve desde VBA, no el nombre de la pestaña)

Hoja3.Visible = xlSheetVeryHidden
Else
'en esl caso de ser un usuario administrador,
'mostraremos las hojas que queremos mostrar
'(en este caso suponemos que es la hoja3, pero el nombre
'interno que se ve desde VBA, no el nombre de la pestaña)

Hoja3.Visible = xlSheetVisible
End If
'grabamos los cambios
ActiveWorkbook.Save
End Sub


Ese macro que acabamos de ver, lo que hace es mostrar la hoja3 del libro, siempre y cuando el usuario que lo abra, sea alguno de los que aparecen en la lista que hemos incluido. En caso de no aparecer en esa lista, la hoja3 se ocultará.

Evidentemente deberemos proteger el modo VBA para que ningún usuario tenga acceso al código del macro. Para ello, desde el modo VBA, seleccionaremos en el menú Herramientas, la opción Propiedades de VBAProject..., y en la pestaña Protección, marcaremos con una muesca la opción Bloquear proyecto para visualización, y a continuación donde se nos solicita una contraseña (dentro de esa misma pestaña), introduciremos una contraseña que podamos recordar. Finalmente volveremos a escribir la contraseña de nuevo, para cerciorarnos de que no nos hemos equivocado al introducir la contraseña la primera vez, y listo, pulsaremos sobre el botón aceptar, y grabaremos el fichero.

Si no sabes cual es tu nombre de usuario, o el nombre de usuario de algunos de los PC’s de la red, puedes ejecutar este sencillo macro, que nos devolverá el nombre del equipo:

Sub nombre_del_usuario()
respuesta = MsgBox("El usuario de este equipo es: " & Application.UserName)
End Sub


Si deseáis dar más permisos (más niveles de seguridad), podéis adaptar el macro anterior. Por ejemplo, podéis dar permisos de administrador para que un grupo de usuarios vea todas las hojas, luego otro grupo que vea todas las hojas menos una, y luego otro grupo que solo pueda ver una de las hojas del libro.

Como veis, es muy sencillo esto de dar permisos, y mostrar una u otra hoja a uno u otro usuario, dependiendo del equipo (del ordenador) que abra al libro de excel.



41 comentarios:

hfajardo dijo...

Javier, muy buena la aplicación.

Mi duda es, cuando aplico esta macro, que funciona bien; como haria para que el usuario a identificar sea aquel que inicio la PC con contarseña de red y poder restringir el uso del archivo. Con el ejmplo, reconoce el nombre con el que fue registrado(el de la Insitución dueña de la PC), son 60PCs con el mismo nombre, entonces, todos podrian modificar y ver la información del archivo.

Gracias por atender mi solicitud.

Javier Marco dijo...

Si ejecutas este macro en todos los ordenadores, ¿te devuelve el mismo nombre de usuario?:

Sub Usuario_de_la_red()
MsgBox ("Mi usuario en la red es: " & Application.UserName)
End Sub

Pues la verdad es que no soy experto en nada, y mucho menos en redes, pero se supone que cada usuario de la red te devolverá un nombre (UserName) distinto.

hfajardo dijo...

Gracias Javier:

Tienes razón, la rutina extrae el nombre del usuario. En mi primer consulta te decia que la red donde trabajo reconce un nombre, ese nombre es la del equipo, en mi caso será el nombre del que usará la PC, por ejemplo hfajardo. La rutina que muestras, determina en efecto, el nombre del usuario, que en mi caso es el nombre de la institución, por eso todos tienen ese nombre.
Cómo seria si quiero condicionar con el nombre del equipo?.

Gracias por tu respuesta, eres muy gentil.

Javier Marco dijo...

Pues se me ocurre que podría hacerse determinado la IP de cada máquina dentro de la red local. Eso sí, ahora el problema es determinar cual es la IP de cada máquina, y la verdad es que no tengo ni idea de si con VBA se puede hacer. Con Visual Basic, seguro que se puede, pero VBA (Visual Basic para Aplicaciones), ya no estoy yo tan seguro. Yo al menos, lo desconozco :-(

Rose dijo...

Hola,
Tu blog es muy bueno, he encontrado cosas muy utiles para mi trabajo.

Gracias por compartirlo

Saludos

Javier Marco dijo...

tu comentario :-)

Anónimo dijo...

Hola Javier, bueno la verdad que esta pagina esta muy buena, te felicito. Revisando tu pagina este parte de usuarios y permisos me causo mucho interes, ya que podria aplicarlo en mi trabajo.
Ejecute tu macro en mi trabajo pero en todas las PC me sale el usuario "Administrado", y eso me quiere decir que todos podrian modificar el archivo en todas la celdas verdad?
Hay alguna forma de detectar el usuario que se a logeado en la maquina?
Ejemplo:
Yo juan peres con codigo E14789 (codigo del usuario en la empresa), me logeo en la PC3, la macro reconosca al usuaro E14789, y segun este codigo pueda darle el permios en las hojas de calculo?

A la espera de tu respuesta.
Atte.
Augusto

Javier Marco dijo...

Precisamente ese código controla los usuarios en función del nombre con el que se loguean en la red. Si tú entras en el dominio como el usuario E14789, esa sencilla aplicación controlará si estás en la lista de usuarios con permisos (si estás en esa lista de Contabilidad, Facturacion, Personal, Mateo, Ignacio, Irene, etc), para mostrarte o no las hojas ocultas.

Si quisieras controlar a los usuarios en función del nombre de la máquina (PC3 en tu caso), entonces sería otro tema.

Saludos.

Anónimo dijo...

Javier, disculpa pero no logre entender muy bien tu respuesta, o capaz no logre dar mi pregunta de una forma muy clara.

Ejemplo
Yo juan peres con usuario E14789, y Rafael Rodriguez con usuario E18756. Tengo estos dos usuarios logeados en diferentes maquinas del entorno de red, pero al ejecutar tu macro anterior para identificar su usuario, me sale en las 2 maquinas que el usuario de red es "Administrador".
Pero cada usuario se a logeado con su codigo de empresa, los cuales son distintos pero la macro me arroja un mismo nombre de red para estos 2 usuarios, los cuales internamente en la empresa tienen diferentes perfiles.
Que es lo que podria estar pasando?
Gracias de nuevo.

Atte
Augusto

Javier Marco dijo...

Pues yo en la red de la oficina, estoy logueado como JXMARCO dentro del dominio de la red, y esta línea:

usuario = LCase(Application.UserName)

me devuelve precisamente eso, el nombre del usuario, no de la máquina. Evidentemente, aunque seáis los usuarios E14789 y E18756, cuando os logueais en la red, supongo que lo hacéis con ese nombre, y no con el del administrador del dominio/máquina. Si así fuera, es algo muy raro, pues debería funcionar correctamente (es más, nadie se ha quejado, y por ejemplo a hfajardo, como ves en el primer comentario, también le ha funcionado correctamente).

Es más, en la ayuda de Excel sobre la propiedad "UserName", dice literalmente:

"Devuelve o establece el nombre del usuario actual. String de Lectura/Escritura."

Sinceramente no entiendo porqué te ocurre eso. Parece un tema de configuración de la red (yo de redes no controlo). Si ejecutas esto desde Excel 2007, y tienes la posibilidad de ejecutarlo en otra versión anterior, haz la prueba a ver qué te sale.

Saludos.

yorch dijo...

tengo una hoja que me da problema, no respeta los cáculos, si los tecleo a mano si pero si copio la celda la fórmula se ve bien pero deja el valor de la celda que ciopié
25523 18890 19675 21350 21900 20805 19710
24400 27600 24400 23800 24325 22895 21692
23048 24259 23048 21838 23048 20627 23048

2009 2009 2009 2009 2009 2009 2009
Junio Julio Agosto Septiembre Octubre Noviembre Diciembre
1556903 1556903 1556903 1556903 1556903 1556903 1556903
la fórmula es sencilla a2(23048)*61

Creo que es algo del excel de mi máquina porque en otra si funciona.

Javier Marco dijo...

Probablemente tengas puesto los cálculos en manual, en lugar de tenerlos en automático. Ve a Herramientas ---> Opciones ---> Selecciona la pestaña "Calcular" ---> Pon una muesca en "Automático".

yorch dijo...

Hola:

OK, muchas gracias, ahora sí que fuciona...

stevhen dijo...

Que tal hombre, esta pagina esta barbara.

Me intereso mucho este tema del VBA, he estado investigando sobre el desde este fin de semana, y bueno, respecto a este tema, quisiera preguntar algo.

Es posible que los usuarios y sus determinados accesos, puedan ser escritos en una hoja dentro de este mismo libro, para ser mas especifico una base de datos. Si no estoy mal esto podriamos hacerlo con Do While Loop?. Espero me entiendas.

Gracias

Anónimo dijo...

Este codigo esta muy bueno, lo vengo utilizando ya hace varios meses atras en una macro.
Pero cada vez que agregar un usuario con permiso, tengo que entrar al VB para agregar el nombre de usuario.

Hay alguna forma que se pueda ingresar los usuarios en un hoja de excel, y segun dicho nombres se de el permiso?

dacz dijo...

Hola Javier, la verdad no he logrado que funcione correctamente ya que solo toma el nombre del equipo en mi caso es aoews2420, el nombre de usuario con el que ingreso al windows es aoe0415, no se si tiene alg que ver ya que el equipo esta dentro de un dominio, con todo gracias por el aporte, y si tienes una idea de como hacer para crear usuarios en una hoja te lo agradeceria un millon ya que tengo una lista con mas de 100 compañeros y ponerse a escribir todo eso esta grave, saludos.....

Javier Marco dijo...

Hola dacz. Hummmm, debería funcionarte, la verdad.

Ese código mira el nombre de usuario logueado en Windows, no el del PC, y da permisos a los usuarios, en función de ese nombre.

Fíjate que en el código estamos llamando a la propiedad UserName, con lo cual, debería darte el nombre de usuario de Windows.

Prueba esto, a ver que obtienes:

Sub prueba()
MsgBox "Usuario: " & Application.UserName
End Sub

Si no te funciona, mira a ver si te sirve, haciendo un mix con la info que aparece en este artículo, y con la que pone en este otro donde habla de como obtener el nombre del PC.

Guillermo dijo...

Hola Javier,
este blog me ha servido de mucha ayuda,pero tengo una dudilla.
si tengo un libro excel con 3 hojas,y quiero que sólo la hoja 1 esté abierta al público,pero las otras dos no quiero que puedan siquiera abrirlas ni verlas.Hay manera sencilla de hacerlo?ponerle contraseña o algo?Pero no solo proteger las hojas contra escritura,sino tambien lectura.
Muchas gracias de antemano
Guillermo

Javier Marco dijo...

Bueno, eso también está explicado en el blog :-)

Pásate por este artículo donde explico como mostrar y ocultar hojas de cálculo, mediante macros. Como en muchos de los artículos del blog, ahí también tienes un ejemplo para descargar.

Guillermo dijo...

Muchas gracias Javier, mucha gente te debe una cena!

Pedro dijo...

Hola mi nombre es Pedro,bueno me parece excelente la informacion, lo que yo ncesito y si me ayudan seria genial es que un libro de excel que contenga varias hojas con informacion si abren el libro cualquiera que no sea yo, y quiera ver la hoja 3 no le permita visualizar el contenido que pida contraseña, y si soy yo que ingrese la contraseña y recien la visualice, si saben como apoyarme seria genial es un reto que quiero cumplir.

Javier Marco dijo...

Aquí lo tienes explicado: mostrar y ocultar hojas, usando macros.

Pedro dijo...

Hola soy Pedro:
gracias javier marco tu respuesta fue precisa, me salvaste la ida. gracias.

Anónimo dijo...

esta página vale v....

Nico Ruiz dijo...

Hola Javier, tengo una pregunta de un tema medio tangente, matrices.
Tengo una matriz de 6x5 felizmente llena de resultados de cuentas y otras cosas, ¿cómo puedo mostrarla en pantalla dentro de un formulario y cómo puedo meterla en un rango de la planilla?
Muchas gracias

Anónimo dijo...

Hola Javier exelente codigo, pero podrias ayudarme para ingresar grupos de usuarios, por ejemplo tener dos grupos de usuarios los administradores y los usuarios.

Te lo agradeceria infinitamente no se que estoy haciendo mas pero no me sale.

Gracias

Atte

Carlos

patarock2 dijo...

Hola Javier,es una de la mejores paginas del Excel que he visitado y que me ha servido de gran ayuda.
En relacion al post del control de usuario tengo una duda a ver si me puedes ayudar: un colega en su dia te hizo esta cuestion :
Anónimo dijo...
Este codigo esta muy bueno, lo vengo utilizando ya hace varios meses atras en una macro.
Pero cada vez que agregar un usuario con permiso, tengo que entrar al VB para agregar el nombre de usuario.

Hay alguna forma que se pueda ingresar los usuarios en un hoja de excel, y segun dicho nombres se de el permiso?

A la que añado y no se podria tambien según que usuario abra las hojas que esten asignadas en esa hoja donde esten los usuarios y las pagina que podrias visualizar??

Javier Marco dijo...

Todo eso se podría hacer fácilmente. Por ejemplo, se podría crear una hoja de control de usuarios, con dos columnas: una para los nombres de usuario, y otra para los permisos (por ejemplo 1, 2, 3, etc).

Esos permisos 1, 2, 3, en el módulo VBA llevarían un detalle de las hojas a las que esos usuarios pueden acceder (o por contraposición, qué hojas están ocultas y a las que no pueden acceder).

Con todo lo que hay publicado en el blog, y con un poco de imaginación se puede hacer, pero no me pidáis cosas particulares cuando ya hay aquí un ejemplo bastante completo (y que debe servir de partida), para hacer cosillas de este estilo, porque la casuística puede llegar a ser casi infinita ;-)

cesar dijo...

buen día javier

la verdad me parece excelente tus temas acerca de las macros y he utilizado varios y me han servido de mucho.

javier tengo un problemita y por lo cual me dirijo a usted para pedirle la colaboracion; es que queremos implementar el registro de ingresos de personal con horarios e imagenes, pero que la imformacion de los empleados la busque en una base datos (otra hoja de calculo) y y la jale a traves de un codigo de barras y lo unico que cambie sea la hora y la fecha de ingreso.
me podrias colaborar? quedaria muy agardecido
mi corre es palito03551@gmail.com

kintxo dijo...

Javier, felicidades:

Estoy muy perdido, y queria basicamente, eso abrir box poner usuario y contrasela y entonces abrir excell con diferentes hojas, los usuarios contraseñas y tipo de permiso los tengo en una hoja llamada usuarios.

Podrias echarme un cable o orientarme un poco más ùes no se como decirle que si es tal usuario y coincide su contraseña, entonces tiene el permiso 1 y el permiso 1 oculta etc etc etc.

perdona el abuso, pero estoy muy bloqueado.

Anónimo dijo...

Mi duda es muy sencilla, como hago para crear otros perfiles de usuarios? osea administradores y clientes
gracias

Javier Marco dijo...

Hombre, tampoco es necesario que crees perfiles de usuario. Simplemente si quieres compartir por ejemplo un libro con 5 hojas, pero 1 de ellas quieres que esté protegida y a la que solo puedan acceder por ejemplo, los usuarios de contabilidad, lo tienes fácil.

Sabiendo el nombre de usuario del PC (Application.Username), y siguiendo el ejemplo explicado en el artículo, sabrás que esa hoja deberá estar visible para ese usuario. Para el resto, simplemente estará oculta.

Anónimo dijo...

Lo que yo digo es si tengo mas de 2 grupos de usuarios, por ejemplo Grupo sueldos, RRHH, Contabilidad, Gerencia cada uno con perfiles distintos, no logro hacerlo

Anónimo dijo...

a los que no les funciona el nombre de usuario prueben con:

Sub Usuario_de_la_red()
MsgBox ("Mi usuario en la red es: " & Environ("username"))
End Sub

Hasta pronto!

Jpinilla

Salvador dijo...

Muy buenos post, disculpa pero tengo una pequeña cuestion o duda, necesito en una hoja de excel indicar donde deben escribir y donde no en un documento, es decir como puedo restringuir una area determinada en excel?

Anónimo dijo...

Javier pues eres un sensei en esto del excel. Pues mira yo algo le entiendo a esto pero me encanto tu macro de obtener el usuario, solo que no encuentro la forma de ponerlo en una función.
Me puedes ayudar?

Javier Marco dijo...

Pues es tan sencillo como esto, pasarlo a una función:

Function usuario()
usuario = Application.UserName
End Function

Luego en cualquier celda escribes esto, y verás como sale el nombre de usuario:

=usuario()

Anónimo dijo...

Hola Muy buena la Información, se me presenta una duda, si estoy en un ambiente de un servidor compartido, y se configura la seguridad alta, no permite habilitar Macros, y por ende da acceso a todas las hojas ocultas, algún consejo, para mantener siempre las hojas ocultas al alcance de todos?

Gustavo DE LOS RIOS dijo...

buenos dias, esta muy interesante tu publicacion, yo busco algo asi pero necesito es que dependiendo del usuario que ingrese solo pueda modificar ciertas celdas, es decir que todos puedan ver todas las hojas de calculo pero cada usuario solo podra tener acceso a modificar ciertas celdas, no se si me hice entender. Espero puedas colaborarme en esto, quedo pendiente.

Muchas gracias.

Antonio Reyes Caro dijo...

Javier, buenos dias

Me interesa bastante tu articulo, y es lo que estoy buscando, pero:
Partiendo de la base de que no se programar, Mi necesidad es que si entra el administrador vea todas las hojas, y segun el usuario que entre no sea administrador vea solo una hoja determinada
¿Como podria hacer para que segun
que usuario entrara pudiese ver una hoja o otra?
Con tu macro solo consigo una parte,
Muchas gracias por tu atencion reyescaro@gmail.com

Anónimo dijo...

Buenos días
Tu macro me viene muy bien, pero ¿como puedo añadirle " que ciertos usuarios que no son administradores entran, puedan ver la hoja que yo quiera, (usuario a la hoja a, usuario b la hoja b etc)

Muchas gracias, espero que me contestes.