Cómo detectar el cambio en una celda.

Cómo detectar el cambio en una celda de Excel.

Cuando trabajas en tus proyectos de Excel, muchas veces sueñas con reducir un poco ese tiempo que te gastas haciendo tareas repetitivas. ¿Verdad que sí?

No es que sean grandes cosas, solo te das cuenta que no tiene sentido estar haciendo la misma cosa, de la misma forma todos los días, cuando podrías usar ese tiempo “perdido” para hacer tu trabajo.

Y una de esas cosas que te gustaría hacer, es que tu aplicación pueda detectar el cambio en una celda de Excel.

Pero ¿cómo hacerlo?

¿Macros? ¡Ni idea!

Es sencillo, una vez que te cuentan cómo se hace. Sigue leyendo, porque aquí te muestro el código base, para detectar cuando el usuario realiza un cambio en cualquiera de las celdas de una hoja de cálculo.

El evento Worksheet_Change

Tranquilidad. Simplemente cada cosa tiene su nombre y cuando tienen nombres largos, parece más complicado de lo que realmente es.

El evento Worksheet_Change, simplemente es la forma de decir:

Cada vez que "Alguien" cambie algo en la hoja actual, sucederá lo que digo a continuación.

Para trabajar con este evento, sólo debes acceder al editor de VBA y dar doble clic sobre el nombre de la hoja donde vas a crear tu código.

Abriendo el editor de VBA

Si no recuerdas cómo ingresar al editor de VBA, lee esto y vuelve enseguida.

¿Todo listo? Bien. Sigamos.

Cómo detectar el cambio en una celda.

Una vez dentro del objeto hoja, se mostrará la ventana en blanco, tal como te explico en el artículo que acabas de leer. En las dos listas que te aparecen,deberás elegir las siguientes opciones:

  1. Worksheet, en la primera lista.
  2. Change, en la segunda lista.

Eligiendo el objeto y el evento en Excel VBA.

Al unirse estas dos palabras, forman el evento Worksheet_Change.

La primera lista, hace referencia al objeto sobre el cual debe suceder el evento, mientras que la segunda lista hace referencia al tipo de evento que se dará sobre dicho objeto.

¿Sencillo, verdad?

El argumento target : El secreto de la receta.

Por defecto, es decir, automáticamente, verás que se asigna un argumento o parámetro llamado “Target”.

Esto vendría a significar “Objetivo”. Es decir, cuál es la celda objetivo en el cambio que se está dando.

Dicho de otra forma, Excel reconoce automáticamente cuál es la celda que cambió y manda su referencia a través de este argumento.

¿Y cómo puedo “sacar” la dirección que tiene esa referencia?

Con la propiedad “Address”.

Trabajando con la propiedad Address

Esta propiedad contiene la dirección del rango contenido en el argumento “Target”. Así, para mostrar cuál es la referencia de la celda que cambió, puedes usar un cuadro de mensaje, así:

MsgBox "Alguien cambió lo que había en la celda: " & Target.Address

siguiendo todos los pasos, tu código debería quedar, más o menos así:

El código de prueba terminado.

Y en qué ocasiones esto me resultaría útil?

Bueno, vamos a utilizarlo en ejemplos reales más adelante; pero para que te hagas una idea, te mostraré una forma de evitar que alguien cambie sin querer un valor de una celda.

Por ejemplo, imagina que el porcentaje de comisiones de venta que manejas en tu archivo de control, es de un 12 % y lo colocas en una celda para realizar tus cálculos.

¿Qué pasaría si por error se altera ese dato?

¡Sí! Eso y mucho más.

Entonces, ¿cómo podría evitar que suceda?

Primero, debemos detectar que alguien cambió la celda. Para esto, usarás lo que acabas de aprender y “preguntarás” cuál es la dirección de la celda que cambió, así:

Preguntando si el usuario realizó un cambio en las celdas.

Entonces, si es verdad que alguien cambió la celda A1, lo que harás será asignarle el porcentaje correcto, así:

Volvemos a colocar el valor origina, como si no hubiera pasado nada.

De este modo, cualquiera que quiera cambiarle o que por error le cambie el valor de esta celda, verá cómo retoma el valor original y tus cálculos estarán siempre a salvo.

¡Muy útil! ¿No lo crees?

Ahora ve y pon en práctica lo aprendido. Incluso si ahora mismo no lo vas a necesitar, es la mejor forma de dejarlo “archivado” en tu memoria.

No dejes de compartir este artículo en Facebook o Twitter, usando los botones que encuentras junto al mismo.

¡Nos vemos!

9 thoughts on “Cómo detectar el cambio en una celda de Excel.”

  1. Graciela Mendiburo

    muy claro todo!, gracias!!!….Un caso : como seria si deseo hacer esta comprobacion al abrir el archivo excel?, sólo colocando en Thisworkbook?
    y si deseo controlar que no hayan habido cambios en un rango de celdas?
    mil gracias!, te sigo siempre!

      1. Graciela Mendiburo

        Hola!!!, pensando en voz alta…no me expresé bien…..me referia a comprobar si el valor de la celda fue cambiado a su valor por defecto (decir internamente en VBA que debe ser igual a 5, por ejemplo), permitir ese cambio de valor y poderlo ver a la siguiente vez que se abre el archivo….en una celda o rango de celdas…mil gracias!!!!

        1. Hola, Graciela.

          Pues si no hay restricciones lo más óptimo sería escribir ese valor (o valores) en sus celdas correspondientes, independientemente de si hubo un cambio en ellas o no, ya que si los valores por defecto son fijos, dará igual si escribo un cinco sobre un cinco, ¿verdad?

          Para hacerlo siempre que se abra el documento, deberás poner el código que haga esta tarea dentro de una rutina que se llame auto_open()

          Algo así:

          auto_open()
          Range(“A1”).Value = “Hola, Graciela”
          End sub

          En lugar del saludo, ya pondrías los valores por defecto que debería tener tu formulario de verificación o cualquiera que sea su fin.

          Un abrazo.

          Raymundo

          1. Graciela Mendiburo

            Gracias!!, no me habia explicado bien….finalmente usé una comparación entre columnas con los datos anteriores y otra columna con los ultimos valores ingresados…Al abrir nuevamente el archivo comparé las columnas, y si hay cambios en los valores, aparece un mensaje ……Mil gracias otra vez…!

  2. Hola, como haria si quiero saber si esa celda cambio de valor a uno diferente al que ya habia? lo que intento hacer es tratar de capturar el valor anterior pero no se como hacerlo.

    1. Hola, Miguel.

      Pues lo que podrías hacer es tomar la propiedad value, del target.

      Es decir, después de verificar que el valor cambió EN la celda deseada (digamos “A1”), entonces almacenas el valor y comparas.

      If Target.Address = “$A$1” Then
      valor_anterior = Target.Value
      End If

      1. Gracias raymundo pero me temo que sigo sin obtener resultados. ¿Como verifico que el valor cambio en primer lugar?

        esto es lo que intento hacer pero no importa que valor cambie en la celda B1, siempre bota el mensaje “mismo valor”.

        Private Sub Worksheet_Change(ByVal Target As Range)
        Dim a As Integer
        a = Range(“B1”).Value ‘ valor actual

        If Target.Address = “$B$1” Then
        Dim b As Integer
        b = Target.Value ‘ valor nuevo

        If a = b Then
        MsgBox “mismo valor”
        Else
        MsgBox “distinto valor”
        End If
        End If

        End Sub

        El problema lo tengo antes de que cambie el valor, no se como capturar el valor actual, es decir el anterior.
        Gracias de antemano.

        1. Hola, Miguel. La variable ‘a’ deberías declararla fuera del evento, ya que cada vez que se produce el cambio, esta se crea nuevamente y se pierde el valor anterior.

          Ponla fuera de la función como una variable a nivel de módulo por ejemplo y debería funcionarte como esperas.

          Un saludo.

Leave a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *