Bloquear columnas si se cumplen ciertas condiciones

Tengo en un archivo excel, en la celda C5 una lista desplegable con las siguientes opciones: TA, EA, SC, SI, IF, DV. Lo que requiero es que al seleccionar de la lista las opciones EA ó SI me bloquee las columnas Q a T, si selecciono las opciones SC ó DV me bloquee las columnas U a X y si selecciono las opciones TA ó IF no me bloquee ninguna columna.

1 Respuesta

Respuesta
1

. 18/08/16

Buenos días, Diego

Es altamente probable que yo no haya entendido que quieres decir con bloquear las columnas.

Voy a interpretar que es ocultarlas, aunque -como dije- puedes necesitar otra cosa.

Pero la rutina que sigue reacciona a los cambios en tu celda C5 ocultando, por ahora, las columnas indicadas

Haz click con el botón derecho del mouse sobre la pestaña de la hoja donde quieres que ocurra lo que solicitas. Elije la opción "Ver Código" y pega lo siguiente:

Private Sub Worksheet_Change(ByVal Target As Range)
CeldaSele = "C5"
Set isect = Application.Intersect(Range(CeldaSele), Target)
If Not isect Is Nothing Then
    Select Case UCase(Range(CeldaSele).Value)
'CLAVES: EA ó SI me bloquee las columnas Q a T, si selecciono las opciones SC ó DV me bloquee las columnas U a X y si selecciono las opciones TA ó IF no me bloquee ninguna columna.
        Case "EA", "SI"
            Cells.EntireColumn.Hidden = False
            LasCols = "Q:T"
            Columns(LasCols).EntireColumn.Hidden = True
        Case "SC", "DV"
            Cells.EntireColumn.Hidden = False
            LasCols = "U:X"
            Columns(LasCols).EntireColumn.Hidden = True
        Case "TA", "IF"
            Cells.EntireColumn.Hidden = False
    End Select
End If
Set isect = Nothing
End Sub

Luego me dirás exactamente qué quieres que haga esta rutina, si es que no fuera ocultar columnas.

Un abrazo

Fernando.

Funciona a la perfección! Pero tengo un problema y es que en esta hoja ya tengo un procedimiento con Private Sub Worksheet_Change(ByVal Target As Range), por lo que me arroja un error al momento de ejecutar. Que solución me podría dar al respecto?

Nota: Lo que necesitaba era bloquear las columnas mencionadas para evitar que se digitara algo en ellas, no habia pensado en ocultarlas que también es otra opción y funciona bien.

Quedo atento a su respuesta!


                    

.

Buenas, Diego

Debería saber qué hace tu procedimiento actual para ver donde se produce el conflicto.

Eventualmente la instrucción Application.EnableEvents = False, interrumpe lo que esté evaluando estas macros basadas en eventos.

Puedes pasarme el código actual para ver cómo integrarlos sin que colisionen.

Un abrazo

Fernando

Claro que si! es este:

Private Sub Worksheet_Change(ByVal Target As Range)

 If Not Intersect(Target, Columns("C")) Is Nothing Then

        If Target.Count > Sheets.Count Then Exit Sub

        For Each c In Target

            Cells(c.Row, "AH") = ""

            For Each h In Sheets

                If UCase(h.Name) = UCase(c.Value) Then

                    Cells(c.Row, "AH").Value = h.Range("I" & h.Range("I" & Rows.Count).End(xlUp).Row).Value

                End If

            Next

        Next

    End If

End Sub

.

Claro, el problema es que esta otra rutina evalúa eventos en la columna C y la celda donde tienes el desplegable está también en la C.

La solución pasa por reubicar la celda de selección fuera de la columna C (puse D5, pero puede ser la que quieras y corrígelo en la segunda línea del código). Luego reemplaza el código que tenías por este otro:

Private Sub Worksheet_Change(ByVal Target As Range)
CeldaSele = "D5" ' o aquella donde hayas reubicado la lista desplegable
Set isect = Application.Intersect(Range(CeldaSele), Target)
If Not Intersect(Target, Columns("C")) Is Nothing Then
        If Target.Count > Sheets.Count Then Exit Sub
        For Each c In Target
            Cells(c.Row, "AH") = ""
            For Each h In Sheets
                If UCase(h.Name) = UCase(c.Value) Then
                    Cells(c.Row, "AH").Value = h.Range("I" & h.Range("I" & Rows.Count).End(xlUp).Row).Value
                End If
            Next
        Next
ElseIf Not isect Is Nothing Then
Cells.EntireColumn.Hidden = False
    Select Case UCase(Range(CeldaSele).Value)
'CLAVES: EA ó SI me bloquee las columnas Q a T, si selecciono las opciones SC ó DV me bloquee las columnas U a X y si selecciono las opciones TA ó IF no me bloquee ninguna columna.
        Case "EA", "SI"
            LasCols = "Q:T"
            Columns(LasCols).EntireColumn.Hidden = True
        Case "SC", "DV"
            LasCols = "U:X"
            Columns(LasCols).EntireColumn.Hidden = True
        Case "TA", "IF"
    End Select
End If
Set isect = Nothing
End Sub

Este contempla ambos casos y, en principio, no debería generar conflicto.

Pruébalo y coméntame.

Un abrazo

Fernando

.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas