Excel 911

Cómo bloquear ciertas celdas en Excel, si no se han llenado otras.

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.

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

Descargar.

¿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!

Raymundo

12 thoughts on “Cómo bloquear ciertas celdas en Excel, si no se han llenado otras.”

  1. 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?

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

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

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

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

  3. 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! 🙂

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

  5. J. Luis Hernandez

    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!!! 🙂

  6. Hector Callejas

    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

  7. 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??’

  8. David iglesias cortes

    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?

  9. Veronica Uzcategui

    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.

Leave a Comment

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