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   -
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

18 respuestas

  1. Mike-31 Mensajes publicados 18405 Fecha de registro   Estado Colaborador Última intervención   5 147
     
    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.
    1
  2. Patrice33740 Mensajes publicados 8400 Fecha de registro   Estado Miembro Última intervención   1 784
     
    ¿Por qué una macro cuando un simple filtro es suficiente?
    0
  3. PLAYA2 Mensajes publicados 15 Fecha de registro   Estado Miembro Última intervención  
     
    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???
    0
  4. PLAYA2 Mensajes publicados 15 Fecha de registro   Estado Miembro Última intervención  
     
     ¡Muchas gracias, MIKE 31! No te imaginas lo feliz que me haces; voy a probar eso mañana mismo...
    0
  5. Patrice33740 Mensajes publicados 8400 Fecha de registro   Estado Miembro Última intervención   1 784
     
    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
    0
  6. PLAYA2 Mensajes publicados 15 Fecha de registro   Estado Miembro Última intervención  
     
    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...
    0
    1. chossette9 Mensajes publicados 6855 Fecha de registro   Estado Colaborador Última intervención   1 313
       
      Hola,

      Cells espera como argumento un número de fila y un número de columna.
      Cells("AK129") no funciona. Usa Cells(129,37) o Range("AK129"), será mejor.

      Atentamente.
      0
  7. PLAYA2 Mensajes publicados 15 Fecha de registro   Estado Miembro Última intervención  
     
    oK gracias, voy a intentar eso; para lo demás, ¿te parece correcto???
    0
  8. Patrice33740 Mensajes publicados 8400 Fecha de registro   Estado Miembro Última intervención   1 784
     
    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
    0
    1. Patrice33740 Mensajes publicados 8400 Fecha de registro   Estado Miembro Última intervención   1 784
       
      PS: ¿Qué versión de Excel utilizas?

      No es normal que:
      If Cells(r, "AJ") Like "X" And Cells(r, "AK") Like "0" Then 
      dé "Error de sintaxis"
      0
  9. PLAYA2 Mensajes publicados 15 Fecha de registro   Estado Miembro Última intervención  
     
    Lo siento, me equivoqué de versión, es Office 2002 (seguro) y Excel 1998 (creo)...

    Perdona.
    0
    1. Patrice33740 Mensajes publicados 8400 Fecha de registro   Estado Miembro Última intervención   1 784
       
      Con Office 2002, debe ser Excel 2002
      Para conocer la versión:
      En la barra de menú, haga clic en el ? y luego en Acerca de...
      0
  10. PLAYA2 Mensajes publicados 15 Fecha de registro   Estado Miembro Última intervención  
     
    Ok, muchas gracias.
    Se puede decir que eres particularmente paciente...

    ¡Lo veré mañana en el trabajo!

    Buenas noches.
    0
  11. Playa2
     
    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.
    0
    1. Patrice33740 Mensajes publicados 8400 Fecha de registro   Estado Miembro Última intervención   1 784
       
      Re,

      Es más bien Else sin IF

      Esta macro funciona, así que debes haber olvidado o agregado algo

      Si quieres que lo verifiquemos, hay que dar el texto completo
      0
  12. Playa2
     
    ¡De hecho, funciona muy bien, un gran GRACIAS!

    Eres un crack y yo un inútil...

    ¡Hasta luego!
    0
  13. Playa2
     
    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.
    0
  14. Patrice33740 Mensajes publicados 8400 Fecha de registro   Estado Miembro Última intervención   1 784
     
    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
    0
  15. PLAYA2 Mensajes publicados 15 Fecha de registro   Estado Miembro Última intervención  
     
    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...
    0
  16. PLAYA2 Mensajes publicados 15 Fecha de registro   Estado Miembro Última intervención  
     
    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.
    0
  17. Mike-31 Mensajes publicados 18405 Fecha de registro   Estado Colaborador Última intervención   5 147
     
    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.
    0
  18. PLAYA2 Mensajes publicados 15 Fecha de registro   Estado Miembro Última intervención  
     
    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!
    0