¿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?
[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
- Abre tu libro de excel
- Para abrir Vba-macros y poder pegar la macro, Presiona Alt + F11
- Del lado izquierdo dice: VBAProject, abajo dale doble click a worksheet(tu hoja)
- 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
- Abre tu libro de excel
- Para abrir Vba-macros y poder pegar la macro, Presiona Alt + F11
- Del lado izquierdo dice: VBAProject, abajo dale doble click a worksheet(tu hoja)
- 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
- Compartir respuesta