Control de cambios personalizado en Excel – segunda nota

martes, julio 20, 2010

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 comments:

Anónimo,  30 noviembre, 2010 12:35  

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

Anónimo,  30 noviembre, 2010 13:02  

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

Anónimo,  20 diciembre, 2010 18:03  

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

Jorge L. Dunkelman 20 diciembre, 2010 20:52  

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

Anónimo,  23 diciembre, 2010 21:29  

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).

Jorge L. Dunkelman 25 diciembre, 2010 08:20  

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.

Anónimo,  04 enero, 2011 16:10  

Ok, como hago para publicar el archivo?

Jorge L. Dunkelman 04 enero, 2011 16:34  

¿A qué te refieres con publicar el archivo?

Anónimo,  05 enero, 2011 20:52  

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

Jorge L. Dunkelman 05 enero, 2011 21:25  

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

Anónimo,  29 julio, 2013 22:30  

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.

Jorge Dunkelman 30 julio, 2013 01:07  

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).

Anónimo,  25 abril, 2014 07:36  

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.

Jorge Dunkelman 25 abril, 2014 10:47  

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

Anónimo,  26 abril, 2014 04:28  

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.

Jorge Dunkelman 27 abril, 2014 08:47  

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

Anónimo,  28 abril, 2014 00:20  

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.

Jorge Dunkelman 29 abril, 2014 07:11  

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).

Anónimo,  27 mayo, 2014 22:14  

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

Anónimo,  12 agosto, 2015 20:44  

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

Jorge Dunkelman 13 agosto, 2015 07:11  

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".

Ricardo Solar 11 abril, 2017 22:33  

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

Jorge Dunkelman 13 abril, 2017 13:31  

Ricardo, lamentablemente no tengo el archivo disponible para descargar.

Publicar un comentario

Google+ Followers

Seguidores

Google+ Badge

Términos Legales

  © Blogger template On The Road by Ourblogtemplates.com 2009

Back to TOP