Como arreglo un hoja excel con filtro avanzado

Tengo una problema en una hoja con un filtro avanzado, por alguna razón algo se daño en el código o en el filtro, ocurre que cuando se filtra un dato este se monta arriba del filtro ocultando el dato a buscar

Adjunto imagen del archivo

y otra imagen con el problema

Cuando se digita el dato a buscar, el filtro se monta arriba evitando que se muestre lo que se esta buscando

Le he quitado la inmovilización de de panles filas y nada,,

Imagen del código de los 2 texbox

1 Respuesta

Respuesta
1

Tienes que cambiar en el filtro currentregion por el rango de datos.

CurrentRegion está considerando filas que están arriba de la fila 4, es por eso que no está haciendo bien el filtro.

Por ejemplo:

Range("B4:Z" & range("B" & rows. Count).end(3). Row). Autofilter 2, criterio

(Ejemplo no probado, ya que pusiste una imagen y no puedo obtener el código completo para probarlo.)


Les recomiendo el siguiente vídeo:

Consejos para desarrollar macros - YouTube

Buen diasr dante

LE ENVÍO EL resto del código

Código completo

Option Explicit
Private Sub CommandButton1_Click()
'Unprotect "5"
Range("B3").CurrentRegion.AutoFilter
Sheets("SALUDAMBIENTAL").TextBox1.Value = ""
Sheets("SALUDAMBIENTAL").TextBox2.Value = ""
'Protect
End Sub
Private Sub TextBox1_Change()
'Unprotect "5"
Dim Criterio As String
Dim f As Range
  Set f = Range("B:B").Find(TextBox1.Value, , xlValues, xlPart, , , False)
  If f Is Nothing Then
    MsgBox "El Registro Filtrado NO Existe en la Tabla de Datos", vbOKOnly, "DIMENSION SALUD AMBIENTAL     Lug"
    Exit Sub
  End If
    If Sheets("SALUDAMBIENTAL").TextBox1.Value <> "" Then
        Criterio = "*" & Sheets("SALUDAMBIENTAL").TextBox1.Value & "*"
        Range("B3").CurrentRegion.AutoFilter Field:=2, Criteria1:=Criterio
    Else
        Criterio = ""
        Range("B3").CurrentRegion.AutoFilter
    End If
    'Protect "5"
End Sub
Private Sub TextBox2_Change()
'Unprotect "5"
Dim Criterio As String
Dim f As Range
  Set f = Range("F:F").Find(TextBox2.Value, , xlValues, xlPart, , , False)
  If f Is Nothing Then
    MsgBox "El Registro Filtrado NO Existe en la Tabla de Datos", vbOKOnly, "DIMENSION SALUD AMBIENTAL     Lug"
    Exit Sub
  End If
    If Sheets("SALUDAMBIENTAL").TextBox2.Value <> "" Then
        Criterio = "*" & Sheets("SALUDAMBIENTAL").TextBox2.Value & "*"
       ' Range("B3").CurrentRegion.AutoFilter Field:=6, Criteria1:=Criterio
        Range("B4:Z" & Range("B" & Rows.Count).End(3).Row).AutoFilter 2, Criterio
    Else
        Criterio = ""
        Range("B3").CurrentRegion.AutoFilter
    End If
    'Protect "5"
    End Sub

Recomendación: En el futuro, sería magnífico, si pudieras pegar el código utilizando el icono para Insertar código fuente:

Después de presionar el icono, aparece una ventana donde puedes pegar el código:

Presiona "Ok" para insertar el código.

De esta manera es fácil de leer el código.


Debes quitar currenregion, como lo comenté. Y realiza una prueba.

Vista:


Sal u dos

Gracias no sabia que se podía insertar el código así. De. Ahora en adelante lo tendré en cuenta

Mm, no funciono como esperaba,,

Se arreglo el filtro más no hace la búsqueda exacta. Es decir no filtra el dato buscado.

Envío link del archivo

https://drive.google.com/file/d/1rKHSZ1Ma0GK7hPExV9gCImZ2oA8VRKfL/view?usp=sharing 

pssw visual vas: neptuno*

Ya lo revisé en tu código y funciona de esta manera:

Private Sub TextBox1_Change()
  'Unprotect "5"
  Dim Criterio As String
  Dim f As Range
  If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilterMode = False
  Set f = Range("B:B").Find(TextBox1.Value, , xlValues, xlPart, , , False)
  If f Is Nothing Then
    MsgBox "El Registro Filtrado NO Existe en la Tabla de Datos", vbOKOnly, "DIMENSION SALUD AMBIENTAL     Lug"
    Exit Sub
  End If
  If Sheets("SALUDAMBIENTAL").TextBox1.Value <> "" Then
    Criterio = "*" & Sheets("SALUDAMBIENTAL").TextBox1.Value & "*"
    Range("A3:K" & Range("B" & Rows.Count).End(3).Row).AutoFilter 2, Criterio
  End If
    'Protect "5"
End Sub
Private Sub TextBox2_Change()
'Unprotect "5"
Dim Criterio As String
Dim f As Range
  If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilterMode = False
  Set f = Range("F:F").Find(TextBox2.Value, , xlValues, xlPart, , , False)
  If f Is Nothing Then
    MsgBox "El Registro Filtrado NO Existe en la Tabla de Datos", vbOKOnly, "DIMENSION SALUD AMBIENTAL     Lug"
    Exit Sub
  End If
  If Sheets("SALUDAMBIENTAL").TextBox2.Value <> "" Then
      Criterio = "*" & Sheets("SALUDAMBIENTAL").TextBox2.Value & "*"
      Range("A3:K" & Range("B" & Rows.Count).End(3).Row).AutoFilter 6, Criterio
  End If
    'Protect "5"
End Sub

Te explico el autofiltro.

CASO 1:

Range("A3:K" & Range("B" & Rows. Count).End(3). Row). AutoFilter 2, Criterio

Cuando empieza el rango en "A", si quieres filtrar por la columna "B" entonces en Field escribes un 2. Significa que la A es el campo 1, la B es el campo 2, la C es el 3, etc.

----

CASO 2:

Range("B3:K" & Range("B" & Rows. Count).End(3). Row). AutoFilter 1, Criterio

Cuando empieza el rango en "B", si quieres filtrar por la columna "B" entonces en Field escribes un 1. Significa que la B ahora es el campo 1, la C es el 2, etc.


Recomendación del día:

Curso de Excel equivalencias, conversiones, porcentajes, impuestos, iva, área, precio más bajo - YouTube

----

sal u dos

¡Gracias!

sr dante ya me di cuenta con su explicaicon del error,,, lo que no entiendo es como se pudo dañar el código si antes funcionaba de maravilla

Una pregunta. ¿Cómo puedo quitar la espabiladera que hace la tabla cuando se esta filtrando el dato?

Después de la declaración de variables

Dim f As Range

Pon esta línea:

Application.ScreenUpdating = False

Y al final del código, después de esta línea:

    'Protect "5"

Pones esta línea:

Application.ScreenUpdating = True

Lo haces en las dos macros.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas