Un lector del blog, al cual le agradezco su entrada, me realiza la siguiente consulta: si el usuario realiza algún cambio en una celda cualquiera de la hoja, el necesita saber en que fila de la planilla de cálculos se encuentra dicha celda, para seleccionarla completamente.
Con funciones resulta imposible alterar la estructura de una hoja, por ende seleccionar, eliminar, agregar, etc, filas, así que no nos queda otra opción que recurrir a las macros.
En realidad estamos ante una tarea que VBA ya tiene prevista e incorpora dentro de los eventos de cada hoja:
Change (Cambio). Nos vamos al editor de Visual Basic (Alt + F11) y desde el Explorador de proyectos hacemos doble click sobre el nodo de alguna Hoja, y seleccionamos segun muestra la siguiente imagen:
En la imagen observamos que el procedimiento tiene un arguento: Target, del tipo Range. Y ese argumento no es otra cosa que la celda o rango en donde se produjo el cambio. Vamos a un ejemplo muy sencillo para comprender bien: mostraremos la direccion de la celda en la que se produjo la modificación:
Y el resultado en un mensaje:
el valor devuelto por el MsgBox es C23, lo cual podemos corroborar observando la fila y columna seleccionada.
El lector me pide dice que necesita seleccionar toda la fila de la celda modificada. Si recordamos que el parámetro Target es del tipo Range, podemos acceder a todos sus eventos, propiedades y métodos. Modificamos el código por este:
Tomo el Addres (direccion) del Target pasado como argumento y selecciono toda su fila
Obteniendo esto:
Con esto quedaría resuelto el tema planteado. Pero, generalmente, en el trabajo cotidiano las cosas no son tan sencillas. El sub Worksheet_Change(ByVal Target As Range) actuará cada vez que se produzca un cambio en el contenido de una celda, cualquiera sea esta. Y puede llegar a ser molesto (por ejemplo) en el siguiente caso: si tengo una tabla cualquiera y necesito que la macro solo seleccione la fila completa si la celda modificada por el usuario está en la columna B
Noten que la tabla también tiene encabezados, por cuanto vamos a tener esto en cuenta también. Agregaré algunas cosas al ejemplo, para aprovechar y mostrar como mediante Target obtenemos cualquier propiedad de la celda:
Luego volvemos a la tabla en cuestión y probamos lo codificado. Al modificar cualquier celda de la columna B pasará lo siguiente:
toda la fila queda seleccionada y un mensaje nos alerta la direccion de la celda y su nuevo valor/
El ejemplo que te brindo es muy sencillo y práctico, con un código que en ciertos aspectos se podría optimizar, pero estimo que es la forma mas clara y sencilla. Podés tambien ir almacenando las propiedades de Target en variables Públicas (declaradas como Public en un módulo), para luego utilizarlas en otros procedimientos o funciones.
Avisame si con este ejemplo te alcanza o necesitás mas al respecto.
Suerte
Me re sirvió tu ejemplo!!! GRACIAS!! Pero tengo un problemita, hice una Macro que copia y pega en otra hoja todo un rango de una fila (ejemplo: desde A12 hasta A112).
ResponderEliminarEntonces cuando uso la rutina que dejaste en el ejemplo, este toma como que cambió todo el Rango A12 - A112 !!
Yo lo que quería lograr era que me copie y pegue el cambio en otra hoja donde llevo el registro de los cambios realizados.
Pero la rutina "change" hace que seleccione TODO el rango...
Como puedo hacer para que verifique fila por fila si algo cambió y entonces me copie y pegue esa fila en otra hoja para llevar un registro?
Estoy haciendo un control de stock.
Muchas Gracias
Hola estimado. Vos sabes que no entiendo muy bien tu consulta. Hiciste una macro que pega en otra hoja todo un rango... y mas abajo me pones "pero la rutina change hace que se seleccione TODO el rango". No comprendo.
ResponderEliminarExplicame un poco mas detalladamente el tema y veo como puedo ayudarte.
buen dia
ResponderEliminarhola mi pregunta es si en determinada celda tengo la siguiente formula =SI(I30=F3;"TIENE MÁS PAGOS EN EL MES";"") me arroje un mensaje igual en el momento que se cumpla esa condición, que lo arroje automáticamente sin pararse en la celda. por favor si me puedes colaborar. gracias
Podrías colocar la condicion en el evento Worksheet_SelectionChange:
ResponderEliminarif I30=F3 then
msgbox "tiene mas pagos en el mes"
end if
Debería funcionar sin problemas. El evento "selection change" se dispara cada vez que se cambia la selección de un rango/celda; ahí lo aprovecharíamos para analizar si los valores son iguales... de ser así, un mensaje alerta. ¿Te sirve?