¿Puedo bloquear y desbloquear celdas automáticamente, dependiendo de valor introducido?

Estoy elaborando un Excel de seguimiento de proyectos. El archivo contiene un ID que identifica el proyecto, una descripción y la plantilla que se ha usado para tramitar la petición. Hay un total de 8-9 plantillas diferentes, y cada una tiene unos pasos intermedios distintos. Me gustaría saber en qué paso se encuentra el proyecto, y cuales quedan por hacer.

Por tanto necesito relacionar el ID con la plantilla correspondiente, y esto a su vez con los pasos. Dado que son unas cuantas plantillas, me gustaría automatizar esta tarea: dependiendo de la plantilla que se ha usado se desbloqueen unos pasos y los que no pertenecen al workflow que se queden bloqueados.

Espero haberlo explicado bien... ¿se puede hacer?

Respuesta
1

[Ho la Margarita y bienvenida a TodoExpertos.

Podrías explicar con imágenes y con mucho detalle, qué datos escribes y lo que debe ir sucediendo en las celdas.

Hola Dante!

Esta es la vista principal del excel, aquí quiero que se vean reflejado los pasos por los que pasa el WF y si se ha finalizado el paso, me ponga una fecha de fin.

Como puedes comprobar, la primera fila tiene una template diferente a la segunda; lo que necesito es que dependiendo de la template que use, se desbloqueen los pasos que corresponden (ej: template 2 --> step 10,40,50,60,90 // template 99 --> step 10,20,30,70,100). Por otro lado, una vez conseguido esto, en las celdas habilitadas, necesito que de otra hoja me extraiga las fechas de finalización, utilizando el WF ID.

 

Espero que haya quedado un poco más claro ahora.

Muchas gracias de antemano!

No veo las filas ni las columnas de excel.

Lo ideal sería una pantalla así:


Podrías comentar brevemente lo siguiente:

- ¿En cuál fila empiezan los datos?

- En cuál columna capturas el "Template"

- Siempre capturas el número de template, seguido de un punto y después un texto:

2. Promo...

99. Dup...

- En cuál fila están los números de pasos


Para que funcione tu solicitud, la hoja deberá estar protegida y las celdas en cuestión deberán estar bloqueadas.

Empiezo a preparar el código VBA, responde las dudas anteriores para ajustar el código.

[Hola Margarita:

Si tu hoja tiene la siguiente estructura:

Entonces prueba el siguiente código.

Pon el código en los eventos de la hoja.

Modifica en el código:

- "abc" por el password que tiene tu hoja.

- En las siguientes líneas agrega los números de template y los pasos que quieres desbloquear:

          Case 2  'template
            a_step = Array(10, 40, 50, 60, 90)  'pasos
          Case 99
            A_step = Array(10, 20, 30, 70, 100) 'pasos

Sigue las Instrucciones para poner la macro en los eventos de worksheet

  1. Abre tu libro de excel
  2. Para abrir Vba-macros y poder pegar la macro, Presiona Alt + F11
  3. Del lado izquierdo dice: VBAProject, abajo dale doble click a worksheet(tu hoja)
  4. En el panel del lado derecho copia la macro


Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Target, Range("D:D")) Is Nothing Then
    If Target.CountLarge > 1 Then Exit Sub
    If Target.Row < 4 Then Exit Sub
    '
    Dim lc As Long
    Dim t As Variant
    Dim a_step() As Variant, s As Variant
    Dim f As Range
    Dim pwd As String
    '
    pwd = "abc"
    lc = Cells(2, Columns.Count).End(1).Column
    ActiveSheet.Unprotect pwd
    If Target.Value = "" Then
      With Range(Cells(Target.Row, "E"), Cells(Target.Row, lc))
        .Locked = True
        .Interior.Color = xlNone
      End With
    Else
      t = Split(Target.Value, ".")(0)
      If IsNumeric(t) Then
        Select Case Val(t)
          Case 2  'template
            a_step = Array(10, 40, 50, 60, 90)  'pasos
          Case 99
            a_step = Array(10, 20, 30, 70, 100) 'pasos
        End Select
        If (Not a_step) = -1 Then
          MsgBox "El número de template no está definido"
        Else
          '
          For Each s In a_step
            Set f = Range("2:2").Find(s, , xlValues, xlWhole)
            If Not f Is Nothing Then
              With Cells(Target.Row, f.Column)
                .Locked = False
                .Interior.Color = 14540253
              End With
            End If
          Next
          '
        End If
      Else
        MsgBox "No es un número el template"
      End If
    End If
    ActiveSheet.Protect pwd
  End If
End Sub

Después de poner el código en los eventos de la hoja, regresa a la hoja de excel, empieza a capturar los números de template en la columna D, en automático se desbloquearán las celdas correspondientes a los pasos.

Prueba y comenta...

Hola Dante,

Muchas gracias por tu ayuda. Te contesto las preguntas:

- La columna F es dónde indico la template usada; y no, no todas las templates tienen la misma forma de primero número y luego texto. En la imagen puedes ver que hay "Extensión Producto Acabado".

- La fila 2 es dónde indico el número del step, que son los valores chiquititos que se ven a partir de la columna AF.

Si el template es cualquier texto, entonces debes poner el texto completo en las siguientes líneas del código:

      Select Case Target.Value
        Case "2. Promo"  'Completa el nombre del template
          a_step = Array(10, 40, 50, 60, 90)  'pasos
        Case "99. Dup SKU Fito"
          a_step = Array(10, 20, 30, 70, 100) 'pasos
        Case "Extender Producto acabado"
          a_step = Array(10, 100)             'completa los pasos
      End Select

Pon la macro en los eventos de la hoja.

Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Target, Range("F:F")) Is Nothing Then
    If Target.CountLarge > 1 Then Exit Sub
    If Target.Row < 4 Then Exit Sub
    '
    Dim lc As Long
    Dim t As Variant
    Dim a_step() As Variant, s As Variant
    Dim f As Range
    Dim pwd As String
    '
    pwd = "abc"
    lc = Cells(2, Columns.Count).End(1).Column
    ActiveSheet.Unprotect pwd
    If Target.Value = "" Then
      With Range(Cells(Target.Row, "E"), Cells(Target.Row, lc))
        .Locked = True
        .Interior.Color = xlNone
      End With
    Else
      Select Case Target.Value
        Case "2. Promo"  'Completa el nombre del template
          a_step = Array(10, 40, 50, 60, 90)  'pasos
        Case "99. Dup SKU Fito"
          a_step = Array(10, 20, 30, 70, 100) 'pasos
        Case "Extender Producto acabado"
          a_step = Array(10, 100)             'completa los pasos
      End Select
      If (Not a_step) = -1 Then
        MsgBox "El template no está definido"
      Else
        '
        For Each s In a_step
          Set f = Range("2:2").Find(s, , xlValues, xlWhole)
          If Not f Is Nothing Then
            With Cells(Target.Row, f.Column)
              .Locked = False
              .Interior.Color = 10092441
            End With
          End If
        Next
        '
      End If
    End If
    ActiveSheet.Protect pwd
  End If
End Sub

Sigue las Instrucciones para poner la macro en los eventos de worksheet

  1. Abre tu libro de excel
  2. Para abrir Vba-macros y poder pegar la macro, Presiona Alt + F11
  3. Del lado izquierdo dice: VBAProject, abajo dale doble click a worksheet(tu hoja)
  4. En el panel del lado derecho copia la macro

Después de poner el código en los eventos de la hoja, regresa a la hoja de excel, empieza a capturar los números de template en la columna D, en automático se desbloquearán las celdas correspondientes a los pasos.

Prueba y comenta...

Hola Dante,

Parece que funciona!!

Tengo algunas dudas, para personalizar la macro:

1- ¿Hay alguna manera de modificar los colores de las celdas (ej: las bloqueadas en gris y las activas otros)?

2- Actualmente las fechas de finalización de steps se introducen mediante la formula --> =SI.ERROR(BUSCARV($B12&AG$2&"2. Promo/cambio Producto producido";Orsoft!$A:$J;10;FALSO);"-" de otra hoja, ¿esto es compatible con la macro?

3- Y una última pregunta, ¿cada vez que quiera meter información nueva, deberé introducir la pwd?

Muchísimas gracias,

Al final de mi respuesta hay un botón para valorar. Es como darle like a mi respuesta, no dejes preguntas sin valorar.

Te respondo tus dudas.

1. Te paso el código actualizado para que las grises sean las bloqueadas.

Debes preparar tu hoja. Desprotege la hoja, cambia el color de las celdas de la columna AF en adelante y de la fila 4 hacia abajo a color gris.

Aquí encuentras los números de color para que puedas adaptarlos en la macro:

Excel VBA color code list - ColorIndex, RGB color, VB color (access-excel. Tips)

2. No influyen las fórmulas.

3. De la columna A a la AE cambiar el formato de la celda y desbloquea las celdas. De la columna AF en adelante cambia el formato de la celda y bloquea las celdas.

Prueba con este código:

Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Target, Range("F:F")) Is Nothing Then
    If Target.CountLarge > 1 Then Exit Sub
    If Target.Row < 4 Then Exit Sub
    '
    Dim lc As Long
    Dim t As Variant
    Dim a_step() As Variant, s As Variant
    Dim f As Range
    Dim pwd As String
    '
    pwd = "abc"
    lc = Cells(2, Columns.Count).End(1).Column
    ActiveSheet.Unprotect pwd
    If Target.Value = "" Then
      With Range(Cells(Target.Row, "AF"), Cells(Target.Row, lc))
        .Locked = True
        .Interior.ColorIndex = 15    'aquí puedes cambiar el color gris
      End With
    Else
      Select Case Target.Value
        Case "2. Promo"  'Completa el nombre del template
          a_step = Array(10, 40, 50, 60, 90)  'pasos
        Case "99. Dup SKU Fito"
          a_step = Array(10, 20, 30, 70, 100) 'pasos
        Case "Extender Producto acabado"
          a_step = Array(10, 100)             'completa los pasos
      End Select
      If (Not a_step) = -1 Then
        MsgBox "El template no está definido"
      Else
        '
        For Each s In a_step
          Set f = Range("2:2").Find(s, , xlValues, xlWhole)
          If Not f Is Nothing Then
            With Cells(Target.Row, f.Column)
              .Locked = False
              .Interior.ColorIndex = 4  'aquí puedes cambiar el color verde
            End With
          End If
        Next
        '
      End If
    End If
    ActiveSheet.Protect pwd
  End If
End Sub

Lista de colores:

Excel VBA color code list - ColorIndex, RGB color, VB color (access-excel. Tips)

No entiendo, no me permite pegar el enlace, prueba el siguiente:

https://access-excel.tips/excel-vba-color-code-list/ 

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas