Imagen cortesía de Freeimages
Jonn_Rosales me preguntaba en Twitter sobre cómo podría hacer para bloquear ciertas celdas en Excel, cuando aún el usuario no ha terminado de rellenar otras.
@RaymundoYcaza hola Ray buen dia, una consulta: puedo bloquear de alguna forma la columna “B” si aun no lleno lo de la columna “A”??
— jon (@jonn_rosales) julio 8, 2014
¿Es esto posible?
Pues sí. Como siempre, hay más de una respuesta, pero hoy te daré una de las más simples y con esa base, tu podrás ir experimentando por tu cuenta.
Primero, vas a guardar tu archivo con extensión xlsm.
Luego, en el objeto “Hoja1” vas a insertar el código que te muestro más abajo.
¿Que no recuerdas cómo trabajar con macros?
Entonces pásate de nuevo por la entrada “escribe tu primera macro en Excel”.
¿Listo?
¡Bien! Ahora, vas a insertar el siguiente código dentro de el evento WorkSheet_Change de tu hoja:
Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(ActiveCell, Range("B1:B10")) Is Nothing Then If ([a2] = "" Or [a3] = "" Or [a4] = "" Or [a5] = "" Or [a6] = "") And Target.Value <> "" Then Target.Value = "" MsgBox "No has terminado con la columna A. Debes llenar todos los datos antes de continuar.", vbCritical + vbOKOnly, "RaymundoYcaza.com" End If End If End Sub
¿Qué es lo que he conseguido con este código?
Cada vez que trates de escribir en cualquier celda de la columna B, dentro del rango B1:B10, Excel borrará cualquier texto que trates de escribir ahí a menos que hayas completado todas las celdas indicadas en la columna A.
Intersect
Con esta línea, lo que hago es preguntarle a Excel: “¿El cambio se hizo dentro del rango B1:B10?”
Si la respuesta es sí, entonces continúo con la revisión.
If ([a2] = “” Or [a3] = “” …
Con esta línea estoy preguntando, celda a celda, si está vacía. Es decir, si la celda A2 está vacía o la celda A3 está vacía o la celda A4 está vacía o…
Bueno, ya entiendes la idea.
Si cualquiera de esas condiciones se cumple, entonces proceso a invalidar la acción.
Mucho ojo: También considero que el valor asignado no sea vacío ( “” )
Si no hicieras esto, tu programa caería en un bucle infinito.
Target.Value
Target es el objeto que contiene el valor de la celda que ha cambiado. O mejor dicho, es una referencia a esta celda, por lo que manipular el objeto target, sería casi como estar manipulando la celda misma.
Aquí lo que he hecho es asignarle una cadena vacía en caso de que se cumpla que hay algún dato faltante y con eso obtengo el efecto de “celda bloqueada” que Jonn andaba buscando.
El archivo terminado
Haz clic en el siguiente botón para obtener el archivo terminado.
¿Qué te parece?
A que no pensabas que era tan sencillo, ¿qué dices?
Claro, esta es una validación básica. Ya queda en ti que la mejores y adaptes a tus necesidades.
Cuéntame, ¿cómo y en qué lo has implementado tú?
Te espero en los comentarios.
¡Nos vemos!
[firma]
13 comentarios en “Cómo bloquear ciertas celdas en Excel, si no se han llenado otras.”
buenas Tardes y como le hago si quiero que si por ejemplo la celda B1 no deje escribr si no se ha llenado la A1 y luego la B2 si no se ha llenado la A2, pero de forma individual?
Hay alguna manera de bloquear asi toda la hoja y dejar solo ciertas celdas desbloqueadas pero que permita el uso del boton actualizar todo?
Con permitir a usuarios modificar rangos logro lo primero pero lo de actualizar todo ya que es una consulta SQL esta bloqueado
Hola, Mario. Si tu caso es que tienes que bloquear la hoja; pero permitir al usuario refrescar una conexión, entonces una manera de hacerlo podría ser con macros.
Una vez que has protegido tu hoja con una contraseña, entonces habilitar un botón que apunte a la siguiente macro:
Sub ActualizarTodo()
‘ Quitas la protección
Application.ScreenUpdating = False
Sheets(“tuhoja”).Unprotect Password:=”tu_clave”
‘ Refrescas tu consulta
ActiveWorkbook.Connections(“nombre de tu conexión”).Refresh
‘ Proteges nuevamente
Sheets(“tuhoja”).Protect _
Password:=”tu_clave”, _
UserInterfaceOnly:=True, _
AllowFiltering:=True, _
AllowSorting:=True, _
AllowUsingPivotTables:=True
End Sub
Revisa el código y adáptalo a tu necesidad.
Saludos
Raymundo
Hola, Mario. Si tu caso es que tienes que bloquear la hoja; pero permitir al usuario refrescar una conexión, entonces una manera de hacerlo podría ser con macros.
Una vez que has protegido tu hoja con una contraseña, entonces habilitar un botón que apunte a la siguiente macro:
Sub ActualizarTodo()
‘ Quitas la protección
Application.ScreenUpdating = False
Sheets(“tuhoja”).Unprotect Password:=”tu_clave”
‘ Refrescas tu consulta
ActiveWorkbook.Connections(“nombre de tu conexión”).Refresh
‘ Proteges nuevamente
Sheets(“tuhoja”).Protect _
Password:=”tu_clave”, _
UserInterfaceOnly:=True, _
AllowFiltering:=True, _
AllowSorting:=True, _
AllowUsingPivotTables:=True
End Sub
Revisa el código y adáptalo a tu necesidad.
Saludos
Raymundo
Ahora el problema es que parece que desbloquea la hoja y al resfreca ya me volvio a protejerla hoja como si no le diera tiempo para ejecutar el refrescar
Buenas tardes; Realice el ejercicio y funciona.. lo he he aplicado a otro cuadro donde dependiendo de la columna A, si selecciona “No”; en la columna B no permite desplegar las opciones. Y si la selección en la columna A es “Si”, habilita la lista desplegable de la columna B.
Mi inquietud es, para aplicar esta condición a toda la columna existe alguna opción de no seleccionar como en el ejemplo la celda [a3]; si no seleccionar TODA la columna.
Gracias! 🙂
Buenas Tardes Raymundo, Saludos desde Venezuela, te escribo por que probe tu macro y me funciono de maravilla pero lo estoy aplicando en un libro el cual sera llenado mensualmente y quiero que rellenen cierto datos para obligarlos a completar toda la información, lo que veo es que si aplico tu macro tendría que hacerlo columna por columna o fila por fila, no hay forma de que pueda aplicar dicha macro con un matriz ya que me encuentro aplicándola a 209 celdas y te podras imaginar lo larga que se hace la macro. Muchas gracias por tu atencion SALUDOS
Buen dia Raimundo
me podrías ayudar con esto, tengo una macro para capturar los datos que entran en almacen, lo que ocupo es como bloquear la macro si alguna campo no esta llenado no te permita avanzar o grabar
gracias y saludos!!! 🙂
buenas tardes yo tengo un problema con un contador de días
yo estoy contando los días de dos fechas atraves de la función =dias() pero yo quiero que ese conteo se detenga automáticamente cuando en otra celda estoy llevando un porcentaje de entrega de insumos y yo quiero que cuando el porcentaje sea =100% el conteo de los dias se detenga y no siga contando
Hola necesito de su ayuda.
Necesito condicionar una celda tengo una hoja en excel pero quiero que ciertas celdas sean obligatorias es cecir que no me permita llenar la celda A1 si no e llenado la celda B3, K13, F18 Y H9 me pueden apoyar como puedo hacer esto??’
Buenas, necesito condicionar una o unas celdas, quiero hacer una operación matemática entre dos celdas pero sólo si en la primera de ellas hemos insertado un valor, como lo haría?
Hola! Buen día, Raymundo, podrías por favor ayudarme con una macro que me permita insertar datos en las celdas A:5 hasta J5 pero que al escribir cierto dato en la celda K5 me bloquee el rango A5:J5 y así sucesivamente con los rangos siguientes, es decir B:5 a J6, C5 a J7, D5 a J8 y asi. Por favor necesito una pronta respuesta, te lo agradecería mucho.
Hola!
como hago si quiero que la celda B1 no permita escribir si no se ha llenado la A1 y luego la B2 si no se ha llenado la A2? Asi con todas las filas de la tabla.
gracias