Ocultar columna si eliges Si o NO en otra casilla.

En mi excel 2007 quiero ocultar una columna dependiendo de el valor de una casilla

He revisado varias respuestas para la solución que yo quiero aplicar pero aun habiendo respuestas similares no termino de que me salga bien del todo lo que yo quiero. Intentaré explicarme bien.

Lo explico mas detallado:
De principio todas las columnas y filas tienen que estar mostradas.

En las celdas que van desde la F31 hasta la F40 tengo en cada una de ellas un menú desplegable con las opciones "ocultar" o "mostrar".

Quiero que si en la casilla F31 se elige del menú desplegable "ocultar" se oculten las columnas G y H. Evidentemente si se elige del menú desplegable la opción "mostrar", las columnas G y H tienen que estar visuales. Así como todas las demás columnas de la excel.

Ocurre lo mismo en la celda F32 con referencia a las columnas I y J.

Y así con todas estas... F33 con las columnas K y L.

F34 con M y N.

F35 con O y P.

F36 con Q y R

F37 con S y T.

F38 con U y V.

F39 con W y X.

Finalmente si en la celda F40 pone "ocultar" se deberian oculatar las columnas Y y Z. Si pone en la celda F40 mostar, las columnas Y y Z deberian estar visibles.

Ademas, añadir que en la excel tengo muchas pestañas. Esto que he explicado quiero que se realice SOLO sobre la pestaña que se llama "huesca". Mas adelante, si funciona, lo intentaré aplicar al resto de pestañas de esta excel.

Por cierto, decir que esta excel estará protegida con contraseña, tanto cada hoja como en el libro en general.

Respuesta
1

Si la hoja está protegida con las opciones 'Aplicar formato' a celdas, filas y col no es necesario desproteger la hoja para ocultar/mostrar col, sino habrá que desprotegerla al inicio y volverla a proteger al finalizar. Dejo las instrucciones marcadas para que puedas ajustarlas.

La siguiente macro se coloca en el objeto HOJA llamada 'huesca'.

Private Sub Worksheet_Change(ByVal Target As Range)
'x Elsamatilde
'solo se controla el contenido del rango F31:F40
If Intersect([F31:F40], Target) Is Nothing Then Exit Sub
'opcional: desproteger la hoja
ActiveSheet.Unprotect "tu_clave"
'según la fila de F serán las col a ocultar/mostrar
'se controla el texto en mayúsculas para cubrir distintos modos de escritura
Select Case Target.Row
    Case Is = 31
        If UCase(Target.Value) = "MOSTRAR" Then
            Columns("G:H").Hidden = False
        Else
            Columns("G:H").Hidden = True
        End If
    Case Is = 32
        If UCase(Target.Value) = "MOSTRAR" Then
            Columns("I:J").Hidden = False
        Else
            Columns("I:J").Hidden = True
        End If
    Case Is = 33
    'completar el resto
    End Select
'opcional: volver a proteger la hoja
activesheet.protect "tu_clave"
End Sub

Te dejo 2 filas de ejemplo, solo tienes que completar el resto de los Case hasta fila 40.

Nota: no me quedó claro si al ocultar un par deben ser mostradas las otras que se encuentran ocultas... confirma este detalle por favor.

Si todo quedó resuelto no olvides valorar la respuesta, sino comenta y la seguimos tratando.

Hola. Muchas gracias por la rapidez en la respuesta.
Con respecto a la duda. Pueden ser ocultadas una o varias columnas al mimo tiempo.
Insisto en que esto es solo en una pestaña, despues lo aplicaré al resto de pestañas de la excel. ¿Tengo que colocar el texto que me has mandado de la macro en algún sitio en especifico? ¿O simplemente como un modulo normal?

Con respecto a la primer aclaración, no hay que retocar entonces nada en mi macro. Se irán ocultando a medida que lo solicites en el rango de la col F.

En algún momento habrá que mostrarlas a todas... ya decidirás cuándo. Podría ser al abrir el libro, con un botón, con atajo de teclado (*) ... lo que decidas. La macro es sencilla y sirve para la hoja desde donde la llames. Solo ajusta el límite que dejé hasta col Z.

Sub mostrarColumnas()
'x Elsamatilde
' mostrar columnas de la hoja activa
Columns("G:Z").Hidden = False
End Sub

(*) estos temas los tengo explicados en la sección Macros de mi sitio.

Con respecto a la posibilidad de colocar en otras hojas solo tenés que copiar tal cual en otros objetos HOJA donde vayas a trabajarlo, ajustando rango si hiciera falta.

Como verás no desprotejo la hoja pero es opcional. Como lo expliqué al inicio, si la hoja está bien protegida como se observa en la imagen, se puede trabajar sin desprotegerla.

Sdos!

Lo cierto es que hay partes del texto que he copiado que si entiendo y hay partes que no.
Lo he colocado quitando los textos que escribes de ayuda y no funciona. Si es cierto que la he modificado para probar solo con las dos primeras celdas y sus respectivas columnas a ocultar.
Por cierto, agradezco los comentarios para explicar dentro de la macro, pero en mi caso me confunden mas. Lo digo si intención de incomodar, es una apreciación personal.

Tampoco se que tiene que ver en este modulo la contraseña de la hoja para poder ejecutarla. Una vez que esté bien hecho, le podré contraseña a la hoja, la guardaré y la haré publica. Las casillas que están bloqueadas no son las de las celdas donde pone mostrar y ocultar.

Tampoco me queda claro donde tengo que poner el modulo. A mi se me coloca por defecto abajo de todas las pestañas que tengo. No se si reconoce que es para la pestaña "huesca". Quizás ea ese el error mio, pero no me funciona.

Paso a aclarar cada comentario:

- Lo he colocado quitando los textos que escribes de ayuda y no funciona.

Los textos de ayuda no afectan al código. Siempre comento mis códigos para que comprendan lo que se hace en cada instrucción así pueden ajustarlas a gusto y necesidad.

- Si es cierto que la he modificado para probar solo con las dos primeras celdas y sus respectivas columnas a ocultar.

Si la consulta fue bien presentada no había necesidad de modificar el código ya que se desarrolló según las referencias de filas y col solicitas.

- Por cierto, agradezco los comentarios para explicar dentro de la macro, pero en mi caso me confunden mas.

Sobre gustos no hay nada escrito. La mayoría agradece las notas porque les sirve para comprender lo que se está ejecutando y cómo modificarlo en caso de necesidad.

- Tampoco se que tiene que ver en este modulo la contraseña de la hoja para poder ejecutarla.

Lo comenté en las 2 oportunidades. Las instrucciones quedaron de modo 'opcional' e inhabilitadas (con comilla delante) porque así lo comentaste en tu consulta de inicio: '...esta excel estará protegida con contraseña, tanto cada hoja como en el libro en general.

- Tampoco me queda claro donde tengo que poner el modulo

Lo comenté pero quizás leíste la respuesta un poco rápido: La siguiente macro se coloca en el objeto HOJA llamada 'huesca"

Esta macro se ejecuta cada vez que cambias un valor en el desplegable del rango solicitado (F31:F40). Cuando se cambia el valor de la celda F31 la fila es 31... por lo tanto se ejecutará donde dice: Case Is = 31

No quiero ahondar en aclaraciones porque quizás te confundas más... pero no se de qué otro modo hacerte comprender el proceso si no es explicándolo.

Podés solicitarme el libro de ejemplo. Dejame un correo o escribime al de cibersoft_arg de yahoo.com.ar

Sdos!

1 respuesta más de otro experto

Respuesta
1

Varias cosas por hacer...

Quita la protección a la hoja

Programa las validaciones para las celdas F31:F40, con Datos, Validación, Lista y en origen pones ocultar, mostrar

Modifica el formato de esas mismas celdas para que una vez protegida la hoja puedan ser modificadas. Supongo que las otras zonas de la hoja en las que se deba ingresar información esto ya está hecho.

En el MÓDULO DE HOJA de "huesca" (fíjate que no es un módulo común, sino un módulo de hoja) copia el siguiente código:

Option Compare Text
Private rango As Range
Private targ As Range
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False

Set rango = Range("F31:F40")              '      por ser el rango donde actuará el evento
If Not (Intersect(rango, Target) Is Nothing) Then
desprotege
For Each targ In Target
If targ.Value = "ocultar" Then
Cells(1, colu(targ, 1)).EntireColumn.Hidden = True
Cells(1, colu(targ, 2)).EntireColumn.Hidden = True
Else
Cells(1, colu(targ, 1)).EntireColumn.Hidden = False
Cells(1, colu(targ, 2)).EntireColumn.Hidden = False
End If
Next targ
protege
End If
Application.EnableEvents = True
End Sub

Function colu(celda As Range, col As Integer)
Dim primCol As String
Dim inter As Integer
Dim i As Integer

primCol = "G"             ' por ser la columna "G" la primera a ocultar
inter = 2                      ' por que oculta de 2 en 2

i = 0
Do
i = i + 1
Loop Until Not (Intersect(rango.Cells(i, 1), celda) Is Nothing)
colu = Cells(1, primCol).Offset(0, -1).Offset(0, (i - 1) * inter).Offset(0, col).Column

End Function

Sub protege()
ActiveSheet.Protect Password:="hola"            '   MODIFICAR SEGUN NECESIDAD
End Sub

Sub desprotege()
ActiveSheet.Unprotect Password:="hola"
End Sub

Modifica el password a lo que realmente sea en tu hoja...

Si la protección de tu hoja incluye alguna configuración especial, te sugiero que prendas la grabadora de macro, simules la protección de la hoja con todos los parámetros que quieres y reemplace esa línea por la que dice MODIFICAR SEGÚN NECESIDAD... y al final de la línea que tengas le agregas, password:="hola"

La macro te permitirá en el futuro adaptar el mismo código a otro rango diferente a F31:G31, otras columnas (puede empezar en G o en otra), otro intervalo, puede ocultar de 2 en 2, de 3 en 3, etc...

Saludos,

Jaime

PD: No olvides valorar la respuesta

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas