Mostrar columnas que tengan una celda en común

Hola necesito que alguien me ayude por favor..
Necesito hacer un tipo de filtro de datos de forma horizontal es decir tengo 10 columnas y en 5 de ellas los rótulos de encabezado de mis datos que están en la misma fila tienen la letra A, 3 columnas más con el encabezado B y dos con el C, no necesariamente seguidas.
Quisiera una macro que al momento de seleccionar la A se aparezcan las columnas con el encabezado A y si escojo la B solo las de la B y así... Pero que no se me borren los datos.

1 Respuesta

Respuesta
1
Prueba esto, debe ir en el evento change de la hoja
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer
Dim n As Integer
Dim llt As String
If Target.Address = "$A$1" Then
[IV1] = "=COUNTA(RC[-254]:RC[-1])"
Range("B1").Select
If UCase([A1]) = "TODO" Then Cells.Select: Selection.EntireColumn.Hidden = False: [A1].Select: Exit Sub
For i = 2 To [IV1] + 1
   Cells(1, i).Select
    If Cells(1, i).Value <> [A1] Then
    llt = Selection.Columns.Address
    llt = Mid(llt, 1, 3)
    llt = Replace(llt, "$", "")
    Range(llt & ":" & llt).Select: Selection.EntireColumn.Hidden = True
    Else
    llt = Selection.Columns.Address
    llt = Mid(llt, 1, 3)
    llt = Replace(llt, "$", "")
    Range(llt & ":" & llt).Select: Selection.EntireColumn.Hidden = False
    End If
DoEvents
Next
[A1].Select
End If
End Sub
Consideraciones, la celda A1 es la celda de control, y los rótulos debe estar siempre en la fila 1. esto considera todas las columnas con rótulos desde B hacia la derecha
si en A1 pones la letra E y existe una columna con ese rotulo, el macro ocutara toras las columnas con rótulos excepto la con el rotulo indicado. Si necesitas ver otra vez todas las columnas en celda A1 debes escribir TODO
a ver si te ayuda en algo
escrito para Version 2007
Hola gracias por tu ayuda; ¿Pero le pongo ya en Private Sub Worksheet_Change(ByVal Target As Range) de la hoja pero no se como hacer que se ejecute esto debe ir dentro de una macro...? ¿O cómo ...? Y ver lo que pasa con el código que me diste, ademas la columna A puede tener aplicado un filtro o no para que me coja las letras de las columnas que necesito que se vean...
Gracias otra vez por tu ayuda.
El código en si Es una macro
Debes pegarlo en el evento Worksheet_Change de la hoja que contiene los datos
la macro se activa si y solo si modificas la celda A1 y por supuesto si existen datos en la hoja que consultar
por ejemplo en celda B1 C1 D11 etc, deben existir rótulos (nombres que le das a las columnnas) y que serán los que usa la macro para evaluar si el dato que pusiste en celda A1 es coincidente o no, si es coincidente, pues el macro oculta todas la otras columnas que no sea la que indicaste en A1... para volver a mostrar todas las columnas en A1 debes escribir la palabra TODO
Eso es todo...
Respecto al filtro eso no lo indicaste en la pregunta original... lo lamento, el macro fue escrito y probado bajo las condiciones que estipulaste en tu pregunta original.
Desde el editor de Visual basic ( lo abres con tecla ALT + F11), debes seleccionar la hoja en que se evaluara el evento (aparece la lista de hojas del libro activo en el extremo izquierdo del editor), da doble click a la hoja que te interesa
se te presentara una nueva ventana por lo general en blanco, tiene 2 cuadros de lista desplegables, el de la izquierda dice General, pues cámbielo a Worksheet
y el segundo a Change
quedaras con algo así:
Private Sub Worksheet_Change(ByVal Target As Range)
End Sub
bien , es entre esas dos lineas que debes pegar el macro
quedando asi:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer
Dim n As Integer
Dim llt As String
If Target.Address = "$A$1" Then
[IV1] = "=COUNTA(RC[-254]:RC[-1])"
Range("B1").Select
If UCase([A1]) = "TODO" Then Cells.Select: Selection.EntireColumn.Hidden = False: [A1].Select: Exit Sub
For i = 2 To [IV1] + 1
   Cells(1, i).Select
    If Cells(1, i).Value <> [A1] Then
    llt = Selection.Columns.Address
    llt = Mid(llt, 1, 3)
    llt = Replace(llt, "$", "")
    Range(llt & ":" & llt).Select: Selection.EntireColumn.Hidden = True
    Else
    llt = Selection.Columns.Address
    llt = Mid(llt, 1, 3)
    llt = Replace(llt, "$", "")
    Range(llt & ":" & llt).Select: Selection.EntireColumn.Hidden = False
    End If
DoEvents
Next
[A1].Select
End If
End Sub
En esa hoja de Excel como te digo debes tener rótulos en las columnas de la primera fila salvo en A1 que es la celda que utilizaras como celda de control. ( Donde indicaras que columna no ocultaras y que obviamente debe ser coincidente con al menos un rotulo de las celdas subyacentes )
Bye

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas