martes, julio 20, 2010

Control de cambios personalizado en Excel – segunda nota

He recibido varios comentarios sobre la nota de ayer sobre el control de cambios personalizado. Entre ellos me piden dos modificaciones que encuentro muy apropiadas:

1 – que el último cambio aparezca en primer lugar en el cuadro de texto, de manera que siempre veamos los últimos cambios;

2 – que los cambios queden registrados en una hoja del cuaderno.

Ambas modificaciones son bastante sencillas y en esta nota mostraremos cómo hacerlas.

Para que el último cambio aparezca siempre en primer lugar en el cuadro de texto modificamos levemente el código de la macro "track_change"

Sub track_change()
    Dim strPrevious As String
    
    With ActiveCell
        If .Comment Is Nothing Then
            .AddComment Text:=Format(Now, "dd/mm/yy hh:mm") & " - " & .Value
        Else
            strPrevious = .Comment.Text
            .Comment.Text Text:=Format(Now, "dd/mm/yy hh:mm") & " - " & .Value _
                                & Chr(10) & strPrevious
        End If
    End With
    
    Call record_in_sheet
    
End Sub


Todo lo que hacemos es cambiar el orden de construcción del texto del comentario poniendo la variable "strPrevious" al final de la cadena de texto.

Para registrar los cambios en una hoja, empezamos, obviamente, por agregar la hoja al cuaderno



Como ven, hemos agregado la hoja "control" con cuatro campos (columnas): celda, fecha y hora, valor e introducido por.

El código para introducir los datos en esta hoja es el siguiente

Sub record_in_sheet()
    Dim lngFirstFreeRow As Long
  
    With Sheets("control")
        lngFirstFreeRow = WorksheetFunction.CountA(.Range("A:A")) + 1
        .Cells(lngFirstFreeRow, 1).Value = ActiveCell.Address
        .Cells(lngFirstFreeRow, 2).Value = Format(Now, "dd/mm/yy hh:mm")
        .Cells(lngFirstFreeRow, 3).Value = ActiveCell.Value
        .Cells(lngFirstFreeRow, 4).Value = Environ("username")
    End With
  
End Sub


Como ven, sencillo y sin muchas vueltas. Para activar el código hemos agregado la línea "Call record_in_sheet" en el código anterior. De esta manera, el evento de la hoja hace correr el código que crea el comentario con los cambios y este código a su vez, hace correr la macro que registra el cambio en la hoja "control".

Después de introducir y cambiar algunos valores en la lista de precios



La hoja de control los refleja de esta manera

24 comentarios:

  1. Hola, en primer lugar decirte que soy un fan tuyo y de tu página.
    He probado esta macro en 2003 y cuando un valor en una celda no me registra el cambio, sin embargo si me registra los cambios en las celdas avinculadas mediante formulas a la primera. Es como si al realizar el cambia lanzara la macro pero para todo aquel cambio que se produce a posteriori del primer cambio.
    Muchas gracias
    Saludos

    ResponderBorrar
  2. Hola de nuevo, estoy viendo que quizá el problema venga porque trabajamos con ActiveCell y si yo introduzco por ejemplo el cambio en C3 el evento se produce al presionar enter, y Excel me mueve a la siguiente celda (C4) entonces graba el valor que hay en C4 y no el que realmente he cambiado en C3.

    Gracias

    ResponderBorrar
  3. Estimado, agradecería si pudieras explicarme mejor el problema con "ActiveCell" y como corregir el error

    ResponderBorrar
  4. Estimado Anónimo,
    ¿cuál es el problema o el error?

    ResponderBorrar
  5. Disculpa, me refiero a que en el primer post un lector publicó que cuando escribía el código propuesto, el control de cambios no se realizaba en la celda sobre la cual se tiene que relizar sino que se realiza en la celda inmediatamente inferior (o en la celda a la que se desplace una vez ingresado el valor en la celda de interés).

    ResponderBorrar
  6. He abierto el archivo en Excel 2003 y veo que funciona sin inconvenientes.
    No tengo claro si te refieres a el registro de los cambios en el comentario de la celda o en la hoja "Control". En esta hoja, obviamente, los cambios se van registrando en celdas separdas (el último cambio siempre ocupa la última celda de la columna).
    Te sugiero que me mandes tu archvio con una nota indicando donde está el problema.

    ResponderBorrar
  7. Ok, como hago para publicar el archivo?

    ResponderBorrar
  8. ¿A qué te refieres con publicar el archivo?

    ResponderBorrar
  9. Cuando me pidió que envíe el archivo entendí que se refería a que lo suba junto con el post.

    ResponderBorrar
  10. Tienes que enviarlo al mail que figura en el enlace Ayuda.

    ResponderBorrar
  11. Que tal Jorge.
    Comentarte que estan magnificos los ejemplos que tienes en tu Web y agredecerte el tiempo que le dedicas en ayudar a los demas.

    Te comento que estoy tratando de ejecutar este ejemplo:Control de cambios personalizados en Excel. Pero no lo he logrado del todo aun me esta saltando una linea con error al querer escribir o borrar algun dato este es el error:Se ha producido el error '1004' en tiempo ejecución: Error en el metodo 'Range' de objeto_ WorkSheet'.
    Entiendo que sera al asignar los rango pero no le encuentro el error si pudieras ayudarme por favor.
    Estoy usando Excel 2010.
    Te agradezco la ayuda.
    DS.

    ResponderBorrar
  12. DS, el problema puede deberse a vaarias causas (la definición del rango con el nombre definido, el nombre de la hoja donde registras el control, etc.)
    Lo más práctico es que me envíes el cuaderno para que pueda ver donde está el problema. Fijate en el enlace Ayuda (en la parte superior de la plantilla).

    ResponderBorrar
  13. Hola Jorge
    ¿Dónde debería introducir el código en VB?
    Me gustaría que en la hoja nueva se guardaran algunas celdas de la fila donde se encuentra la celda cambiada aparte de sus valores viejo y nuevo/s. ¿Cómo debería hacer?
    Muchas gracias y muy buena esta explicación.
    Saludos.

    ResponderBorrar
  14. Fijate en la nota anterior (el enlace en el primer párrafo de esta nota).

    ResponderBorrar
  15. Hola Jorge
    Perdón, pero no entiendo.
    Yo tengo una columna con datos y quiero poder registrar en una nueva hoja los cambios que sucedan en las celdas de esas columnas. Para ello quiero que esa hoja de seguimiento nueva me muestre todos los valores que recibió cada una de las celdas de esa columna y algunos valores (que son fijos) de la misma fila que la celda modificada (para poder identificar cuál se cambió).
    No comprendo cómo escribir esto en VB. ¿Tendrás algún instructivo o video explicativo?
    Muchas gracias.
    Saludos.

    ResponderBorrar
  16. Está todo explicado en la primer nota (el enlace en la primer frase de esta nota).

    ResponderBorrar
  17. Disculpame Jorge, pero no está o por lo menos no lo encuentro.
    Yo necesito saber exactamente cómo colocar los códigos
    A su vez, yo no quiero que me copie la ubicación de la celda modificada sino el valor de otra celda en esa fila, Por ejemplo, si modifiqué la celda A2, quiero que me copie el valor viejo, el valor nuevo de la celda A2 y el valor de la celda B2 (que no cambió).
    ¿Cómo debería hacer esto?
    Muchas gracias por tu ayuda y espero haber sido clar.
    Saludos.

    ResponderBorrar
  18. En la primer nota (ver el enalce al principio de esta nota) explico donde y como colocar los códigos.
    En cuanto a registrar el valor de otra celda, tendrías que modficar el código. La idea de controlar los cambios es registrar las celdas que fueron cambiadas.
    Si necesitas algún otro tipo de tarea puedes consultarme por mail privado (ver el enlace Ayuda, en la parte superior de la plantilla).

    ResponderBorrar
  19. Buenas Tardes Jorge,
    Tu pagina es lo máximo, muchas gracias por compartir tus conocimientos con todos nosotros;
    Con respecto a este comentario:
    Anónimo, 30 noviembre, 2010 13:02
    A mí sucedía lo mismo, dejo aquí una modificación que me funciono a mí en lo personal y esperando le pueda ayudar a otros, escribi estas líneas antes del With ActiveCell / End With:
    Fila = ActiveCell.Row
    Columna = ActiveCell.Column
    Cells(Fila - 1, Columna).Select
    Y eso fue todo, me funciono a la perfección (Con Office 2007).
    Atte. Servando Guardado

    ResponderBorrar
  20. Hola. Muchas gracias por tu post!.
    Tengo una duda que ya la ví en los comentarios pero no se como la solucionaron.
    La macro funciona bien cuando le doy OK haciendo click con el mouse. Si aprieto la tecla enter, el comentario se agregar en la celda de abajo con el txt de la celda de abajo. gracias

    ResponderBorrar
  21. Prueba lo siguiente: en las opciones de Excel (Archivo-Opciones) abre Avanzadas y en la sección Opciones de Edición quita la marca de "Después de presionar Entrar, mover selección".

    ResponderBorrar
  22. Estimado Jorge, es posible descargar la planilla con el ejemplo ?
    Muchas gracias. Saludos

    ResponderBorrar
  23. Ricardo, lamentablemente no tengo el archivo disponible para descargar.

    ResponderBorrar

Nota: sólo los miembros de este blog pueden publicar comentarios.