Registras los usuarios que modifiquen una celda en excel

Llevo un libro de excel de inventario con entradas y salidas a diferentes lugares, este libro lo manejan tres personas.

Ya he logrado darle usuario y contraseña a cada una de las tres persona mediante el siguiente código en vba: (nota: no se mucho de excel)

Private Sub Workbook_Open()
Dim nombre As String
Dim paso2 As Boolean
nombre = UCase(InputBox("Nombre de Usuario"))
paso2 = False
Select Case nombre
Case "tatiana"
If UCase(InputBox("Introduce tu clave de acceso")) = "123" Then paso2 = True
Case "larixa"
If UCase(InputBox("Introduce tu clave de acceso")) = "456" Then paso2 = True

Case "leydy"
If UCase(InputBox("Introduce tu clave de acceso")) = "789" Then paso2 = True
End Select
If paso2 = False Then ThisWorkbook.Close savechanges:=False
End Sub

Lo que necesito ahora es que al ingresar el usuario y modificar una celda, en determinada columna o celda me especifique cual de los tres usuarios fue quien la modifico y que este a su vez no pueda modificar lo que han echo los otros usuarios. Ya que de nada me sirve que cada uno tenga un usuario si no puedo saber quien hizo que.

Les agradecería si me ayudan a encontrarle solución a esto.

1 respuesta

Respuesta
2

Para proteger las celdas tienes que bloquear las celdas en el menú Inicio, Formato, Formato de celdas, Proteger, Bloquear, y para que funcione, tienes que proteger la hoja.

Ahora, para registrar las modificaciones, se puede pero tendría que ser celda por celda, es decir, si copian toda una fila o toda una columna o todo un rango de celdas, el proceso tardaría mucho, tendría que registrar todas las celdas de una fila copiada.

Te anexo un archivo con una macro para registrar cualquier modificación a cualquier celda de cualquier hoja; el registro se realizaría en la hoja "control", puedes ocultar esta hoja y protegerla con password, para que no puedan ver ni borrar la información.


Tienes que poner tu macro con la actualización que te estoy enviando para que se registre el nombre de usuario:

Private Sub Workbook_Open()
    Dim nombre As String
    Dim paso2 As Boolean
    nombre = UCase(InputBox("Nombre de Usuario"))
    paso2 = False
    Select Case nombre
        Case UCase("tatiana")
            If UCase(InputBox("Introduce tu clave de acceso")) = "123" Then paso2 = True
        Case UCase("larixa")
            If UCase(InputBox("Introduce tu clave de acceso")) = "456" Then paso2 = True
        Case UCase("leydy")
            If UCase(InputBox("Introduce tu clave de acceso")) = "789" Then paso2 = True
    End Select
    If paso2 = False Then ThisWorkbook.Close savechanges:=False
    Sheets("control").[A1] = nombre
End Sub

Esta macro también debe ir en los eventos de thisworkbook

'
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'Por.Dante Amor
    Set h1 = Sheets("control")
    If Sh.Name = h1.Name Then Exit Sub
    If Target.Count > 1 Then Exit Sub
    For Each c In Target
        h1.Unprotect
        r = Rows.Count
        u = h1.Range("B" & Rows.Count).End(xlUp).Row + 1
        If u >= r Then u = 2
        h1.Cells(u, "B") = h1.[A1]
        h1.Cells(u, "C") = Sh.Name
        h1.Cells(u, "D") = c.Address(False, False)
        h1.Cells(u, "E") = Date
        h1.Cells(u, "F") = Time
        h1.Cells(u, "G") = Target.Value
        h1.Protect
    Next
End Sub

Por último te anexo la macro para proteger las hojas y los datos después de que cierras el archivo, de esta forma cuando vuelvan a abrir el archivo esos datos estarán protegidos.

Private Sub Workbook_BeforeClose(Cancel As Boolean)
'Por.Dante Amor
    For Each h In Sheets
        h.Unprotect
        h.Cells.SpecialCells(xlCellTypeConstants, 23).Locked = True
        h.Protect
    Next
    ActiveWorkbook.Save
End Sub

Debes crear una hoja llamada "control"


Te anexo mi archivo para que lo pruebes. Los datos a registrar son estos


https://www.dropbox.com/s/070osurj2yv88fg/control%20usuario.xlsm?dl=0 

Saludos. Dante Amor

muchas gracias esta muy bueno.

pero resulta que se pone lento al introducir cada dato y retrasa el trabajo, hay una manera mas simple de hacerlo? ejemplo:

tengo datos en las casillas a, b, c, d, etc y quiero que en la j,k y l me ponga los datos de usuario, fecha y hora en que se modifico sin necesidad de una hoja nueva. y que en tal caso que se modifique de nuevo x casilla simplemente remplace la informacion de j, k y l por la del nuevo usuario.

ya que a diario se ingresa mucha y informacion y eso haria que la hoja control se llenara de demasiados datos.

TE ANEXO UNA IMAGEN CON UNA IDEA DE LO QUE QUIERO, O SI PUEDES ME REGALAS UN CORREO DONDE TE PUEDA ENVIAR EL ARCHIVO QUE MANEJO.

que pena molestarte tanto.

gracias

Para que sea más rápido, dime cuál de todas las columnas de la A la I, es importante y siempre registrarán un dato, de esa forma, la macro sólo validará una columna y no muchas.

Veras.

Necesitaría que validara la columna B, que se maneja por código y da automáticamente la información a las demás columnas.

O podría ser que me dijera quien modifico algún dato de la línea sin importar que celda ni que valor.

Que pena molestarte tanto pero no se manejar muy bien el excel.

Gracias

Quita esta macro:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'Por.Dante Amor
    Set h1 = Sheets("control")
    If Sh.Name = h1.Name Then Exit Sub
    If Target.Count > 1 Then Exit Sub
    For Each c In Target
        h1.Unprotect
        r = Rows.Count
        u = h1.Range("B" & Rows.Count).End(xlUp).Row + 1
        If u >= r Then u = 2
        h1.Cells(u, "B") = h1.[A1]
        h1.Cells(u, "C") = Sh.Name
        h1.Cells(u, "D") = c.Address(False, False)
        h1.Cells(u, "E") = Date
        h1.Cells(u, "F") = Time
        h1.Cells(u, "G") = Target.Value
        h1.Protect
    Next
End Sub

Y pon esta macro en los eventos de tu hoja de captura

Private Sub Worksheet_Change(ByVal Target As Range)
'Por.Dante Amor
    Set h1 = Sheets("control")
    If Not Intersect(Target, Range("B:B")) Is Nothing Then
        For Each c In Target
            Unprotect
            Cells(c.Row, "J") = h1.[A1]
            Cells(c.Row, "K") = Date
            Cells(c.Row, "L") = Time
            Protect
        Next
    End If
End Sub

Sigue las Instrucciones para poner la macro en los eventos de worksheet

  1. Abre tu libro de excel
  2. Para abrir Vba-macros y poder pegar la macro, Presiona Alt + F11
  3. Del lado izquierdo dice: VBAProject, abajo dale doble click a worksheet(tu hoja)
  4. Del lado derecho copia la macro

Muchas gracias es lo que necesitaba, pero tengo un inconveniente:

Cada que ingreso un dato se bloquea la hoja automáticamente, así que tengo que desbloquearla para ingresar cada dato lo cual es molesto. ¿De qué manera puedo quitar esa función?

Que pena molestarte tanto.

Gracias

Que pena ya lo solucione muchas gracias.

Pero tengo otra pregunta, si quiero adicionar otra columna además de la B, ¿en qué lugar debo hacer la modificación? ¿O de que manera?

Gracias

En el ejemplo te estoy poniendo la columna C

Private Sub Worksheet_Change(ByVal Target As Range)
'Por.Dante Amor
    Set h1 = Sheets("control")
    If Not Intersect(Target, Range("B:B, C:C")) Is Nothing Then
        For Each c In Target
            Unprotect
            Cells(c.Row, "J") = h1.[A1]
            Cells(c.Row, "K") = Date
            Cells(c.Row, "L") = Time
            Protect
        Next
    End If
End Sub

¡Gracias! 

me has servido de mucho y has sido muy amable.

Hola me gustaría usar este código para otro archivo que tengo pero que me registre los cambios de una sola columna no de todo, ya que el otro que me diste no me sirve para este otro documento ya que remplaza los datos cada que se modifican en cambio este si registra que escribieron cada vez que lo modificaron.

Gracias

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)'Por.Dante Amor    Set h1 = Sheets("control")    If Sh.Name = h1.Name Then Exit Sub    If Target.Count > 1 Then Exit Sub    For Each c In Target        h1.Unprotect        r = Rows.Count        u = h1.Range("B" & Rows.Count).End(xlUp).Row + 1        If u >= r Then u = 2        h1.Cells(u, "B") = h1.[A1]        h1.Cells(u, "C") = Sh.Name        h1.Cells(u, "D") = c.Address(False, False)        h1.Cells(u, "E") = Date        h1.Cells(u, "F") = Time        h1.Cells(u, "G") = Target.Value        h1.Protect    NextEnd Sub

Con gusto te sigo ayudando, pero puedes crear una nueva pregunta por cada petición. El desarrollo me explicas con detalle y con ejemplos lo que necesitas, también escribe que va dirigida a Dante Amor

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas