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 de calvuch
1
1
calvuch, las fallas constantes de esta web me cansaron!! me voy a...
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