Ocultar filas según 2 condiciones mediante macro de Excel
Resuelto
PLAYA2
Mensajes publicados
15
Fecha de registro
Estado
Miembro
Última intervención
-
PLAYA2 Mensajes publicados 15 Fecha de registro Estado Miembro Última intervención -
PLAYA2 Mensajes publicados 15 Fecha de registro Estado Miembro Última intervención -
Hola,
Quisiera crear una macro en Excel que me permita ocultar las filas de un archivo de Excel según estas 2 condiciones:
Si y solo si las celdas de las columnas AJ = X y AK = 0 (en número)
¿Alguien podría ayudarme? Soy novato en macros y me estoy volviendo loco desde hace 2 días...
De antemano, muchas gracias.
Configuración: Windows XP / Internet Explorer 8.0
Quisiera crear una macro en Excel que me permita ocultar las filas de un archivo de Excel según estas 2 condiciones:
Si y solo si las celdas de las columnas AJ = X y AK = 0 (en número)
¿Alguien podría ayudarme? Soy novato en macros y me estoy volviendo loco desde hace 2 días...
De antemano, muchas gracias.
Configuración: Windows XP / Internet Explorer 8.0
18 respuestas
-
Hola,
Tiene razón el jefe, ¿por qué hacer las cosas simples cuando se puede hacer complicado?
Sub Masque_lignes_condition_cellule()
Dim lg As Long, r As Long
Application.ScreenUpdating = False
With ActiveSheet.UsedRange
lg = .Row + .Rows.Count - 1
End With
For r = lg To 1 Step -1
If Cells(r, "AJ") Like "X" And Cells(r, "AK") Like "0" Then
Rows(r).EntireRow.Hidden = True
End If
Next r
Application.ScreenUpdating = True
End Sub
y mañana nos preguntarás cómo mostrar las filas ocultas
--
¡Hasta luego!
Mike-31
Un período de fracaso es un momento ideal para sembrar las semillas del conocimiento. -
¿Por qué una macro cuando un simple filtro es suficiente?
-
Lo que propuse a mi jefe de servicio, pero quiere una macro para poder hacer clic en un botón y ocultar las líneas innecesarias para la lectura...
Este archivo se alimenta de una base de datos (vínculos) y estos se actualizan diariamente. Además, él no domina Excel y no quiere aprender.
Por mi parte, tengo muchas ganas de responder a su expectativa pero sobre todo de iniciarme en las macros...
¿Puede ayudarme, por favor??? -
¡Muchas gracias, MIKE 31! No te imaginas lo feliz que me haces; voy a probar eso mañana mismo...
-
Hola,
Dado que eres un novato y te estás adentrando en el VBA, aquí tienes otro método documentado que establece un filtro automático al hacer clic derecho en la hoja y que vuelve a mostrar todo al hacer clic derecho de nuevo.
Esto podría evitar (seamos prudentes) la pregunta de mañana (hola Éric).
' Módulo: Hoja1 ' Objeto: Filtrado automático de las columnas AJ y AK ' 08/01/13 ' ' ' Declaración de opciones para todo el módulo de hoja ' Una muy buena costumbre a adquirir, siempre comenzar un módulo con: Option Explicit ' ' Declaración de las constantes utilizables en todo el módulo ' (conocidas de todos los procedimientos del módulo) Private Const refCelda1 As String = "A1" 'Referencia de la 1ª celda de la tabla Private Const refColumna1 As String = "AJ" 'Referencia de la 1ª columna a filtrar Private Const strCriterio1 As String = "X" 'Criterio de filtrado de la 1ª columna Private Const refColumna2 As String = "AK" 'Referencia de la 2ª columna a filtrar Private Const strCriterio2 As String = "0" 'Criterio de filtrado de la 2ª columna ' ' Procedimientos de eventos del módulo de hoja ' (ejecutados automáticamente cuando se produce uno de los eventos de la hoja) ' Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) ' Actualización del filtro en cada clic derecho en la hoja (en el evento BeforeRightClick) ' 08/01/13 ' 'Cancelar el efecto normal del clic derecho (sin mostrar el menú contextual) Cancel = True 'Llamar al procedimiento de filtrado indicando la hoja sobre la que aplicar el filtro Call Filtrar_Columnas(ActiveSheet) End Sub ' Otras procedimientos del módulo ' (ejecutados únicamente cuando son llamados) ' Private Sub Filtrar_Columnas(ByRef wsh As Worksheet) ' Procedimiento de filtrado de columnas: Establece/Quita el filtrado. ' Argumentos: wsh [in] Hoja sobre la que se aplicará el filtro ' 08/01/13 ' ' Declaración de variables utilizables en este procedimiento Dim rngTabla As Range 'Tabla que contiene los datos Dim intCampo1 As Integer 'Número del 1er campo (1ª columna a filtrar) Dim intCampo2 As Integer 'Número del 2º campo (2ª columna a filtrar) 'Si ya hay un filtrado en su lugar... If wsh.FilterMode = True Then '... mostrar todos los datos y... wsh.ShowAllData '... salir del procedimiento. Exit Sub End If 'si no, continuar 'Definir el rango de celdas que contiene la tabla Set rngTabla = wsh.Range(refCelda1).CurrentRegion 'Si el filtro automático no está activado, activarlo. If Not wsh.AutoFilterMode Then rngTabla.AutoFilter 'Definir los números de los campos a filtrar = número de la columna de la hoja intCampo1 = wsh.Columns(refColumna1).Column intCampo2 = wsh.Columns(refColumna2).Column 'Establecer el filtrado de los dos campos rngTabla.AutoFilter Field:=intCampo1, Criteria1:=strCriterio1 rngTabla.AutoFilter Field:=intCampo2, Criteria1:=strCriterio2 End Sub
Copia este código en el módulo de la hoja a filtrar:
Copiar, clic derecho en la pestaña, visualizar el código, pegar
--
Cordialmente
Patrice -
Gracias Patrice por estos elementos.
De hecho, lo logré evitando la entrada en VBA => hice trampas haciendo filtros que guardé en mi macro, así que el jefe está contento.
Por supuesto, me pidió otra macro para ocultar las hojas completas (con encabezado de columna) => 1:133) si una línea (129) en particular está vacía.
¿No puedo usar los filtros aquí? Así que intenté esto:
Rows("1:133").Select
If Cells("AK129") = 0 Then
End If
Selection.EntireRow.Hidden = True
End sub
Pero no funciona, ¿alguien podría aclararme, por favor? Para info, el archivo tiene varias páginas consecutivas para las que tendré que repetir la misma operación, pero si tengo la sintaxis correcta para una línea, debería arreglármelas para el resto.
Gracias de antemano.
P.D.: Gracias de nuevo MIKE 31, pero eso no funcionó; de hecho, en la línea
If Cells(r, "AJ") Like "X" And Cells(r, "AK") Like "0" Then
tuve el mensaje: "error de sintaxis" pero aun así me ayudó a ver el lenguaje a usar... -
oK gracias, voy a intentar eso; para lo demás, ¿te parece correcto???
-
Hola,
Para detectar un 0 en una celda, se necesitan dos condiciones:
- celda no vacía
y
- valor = 0
porque Excel considera que una celda vacía contiene un valor igual a 0
Tu código para ocultar las filas 1:133 se convierte en:Sub xxx() If Cells(129, "AK").Value = 0 And Not IsEmpty(Cells(129, "AK").Value) Then Rows("1:133").Hidden = True Else Rows("1:133").Hidden = False End If End Sub
--
Cordialmente
Patrice -
Lo siento, me equivoqué de versión, es Office 2002 (seguro) y Excel 1998 (creo)...
Perdona. -
Ok, muchas gracias.
Se puede decir que eres particularmente paciente...
¡Lo veré mañana en el trabajo!
Buenas noches. -
Hola patrice 33740,
Como se acordó, probé la macro:
If Cells(129, "AK").Value = 0 And Not IsEmpty(Cells(129, "AK").Value) Then
Rows("1:133").Hidden = True
Else
Rows("1:133").Hidden = False
End If
End Sub
Pero recibo el mensaje => error de compilación: Else sin IF
La versión de excel es 2002, ¿puede que sea esa la razón?
¿Qué piensas?
De antemano, gracias. -
-
Hola, soy yo de nuevo, esta vez tengo un problema para mostrar las filas de nuevo:
Así que tengo 2 macros en el mismo archivo => la primera a partir de la acción de filtrado:
Sub Macrolignes()
'
' Columns("AJ:AJ").Select
selection.AutoFilter
selection.AutoFilter Field:=1, Criteria1:="=A", Operator:=xlOr, _
Criteria2:="<>0"
ActiveWindow.ScrollColumn = 17
ActiveWindow.ScrollColumn = 16
ActiveWindow.ScrollColumn = 15
ActiveWindow.ScrollColumn = 14
ActiveWindow.ScrollColumn = 13
ActiveWindow.ScrollColumn = 12
ActiveWindow.ScrollColumn = 11
ActiveWindow.ScrollColumn = 10
ActiveWindow.ScrollColumn = 9
ActiveWindow.ScrollColumn = 8
ActiveWindow.ScrollColumn = 7
ActiveWindow.ScrollColumn = 6
ActiveWindow.ScrollColumn = 5
End Sub
Y la segunda macro:
Sub Macropage()
'
'
If Cells(129, "AK").Value = 0 And Not IsEmpty(Cells(129, "AK").Value) Then
Rows("8:133").Hidden = True
Else
Rows("8:133").Hidden = False
End If
End Sub
Y para desmascarar, lo hago manualmente => Mostrar líneas
Me encuentro con el siguiente problema: Puedo ejecutar las 2 macros consecutivamente sin problema, pero no puedo desmascarar; eso solo es posible lanzando una sola de las 2 macros.
¿Es posible con Excel 2002 y, si es así, se pueden compilar estas 2 macros en una sola?
Gracias de antemano. -
Re,
¡Tus macros no corresponden a la exposición del problema!
Ciertamente es posible, pero primero tendríamos que saber qué es lo que quieres exactamente.
Explícitamente, aclara la totalidad de la necesidad:
- ¿Qué líneas deben ocultarse y bajo qué condiciones?
- ¿Cuáles son las condiciones para el "desocultamiento"?
- ¿Cómo se ejecuta la macro? ¿Por un botón, varios botones o por uno o varios eventos?
Patrice -
De hecho, la solicitud inicial era ocultar ciertas líneas a 0 (pero no todas como las de los encabezados...) => macro 1, ejecutada por un botón
Luego, la segunda solicitud fue ocultar todas las páginas vacías => macro 2, ejecutada por un segundo botón.
Pero sería necesario anular una u otra o ambas macros según la voluntad del usuario...
Lo ideal sería ejecutar la macro 1 al abrir el archivo, lanzar la macro 2 cuando se desee y anular cada operación según su deseo.
Por supuesto, eso sería lo ideal, pero lanzar las 2 macros y volver a mostrar sería muy bueno.
Espero haber respondido con suficiente claridad.
Pd: he notado que es imperativo ejecutar la macro 1 antes que la 2, de lo contrario, no funciona... -
Re Patrice,
Finalmente no te molestes, he encontrado la solución al quitar todos los filtros cuando quiero desmascarar y relanzar la macro deseada según la necesidad.
El único inconveniente es el lanzamiento automático de la macro 1 al abrir el archivo.
He encontrado esta discusión en el foro, pero no funciona; tal vez sea debido a la versión de Excel???
Sigo con las investigaciones...
Gracias de nuevo. -
Re,
Me permito volver a la discusión, el problema no es la redacción de un código sino conocer claramente las expectativas desde el principio y acompañado de un archivo de ejemplo anotado, de lo contrario vamos a trabajar y hacer propuestas en vano.
--
A+
Mike-31
Un período de fracaso es un momento ideal para sembrar las semillas del conocimiento. -
Hola Mike-31,
Muchas gracias por seguir interesado en mis dificultades, pero está bien; he logrado alcanzar todos mis objetivos.
De momento, ya que cada vez que encuentro una solución, mi jefe me plantea un nuevo problema!!!
Seguramente no lo habría logrado sola
GRACIAS de nuevo a ustedes 2
¡Hasta luego!