Seleccionar rango en varias hojas y ocultar filas con condición

Soy nuevo en esto de las macros si me pudieran ayudar:

Tengo un archivo con 30 hojas y cada hoja con un filtro automático, como puedo ocultar dentro de uno de los filtros en especifico las celdas que no cumplan con una condición como el ejemplo siguiente:
Private Sub SELFIL_Click()
Application.ScreenUpdating = False
For Each Sheets In ActiveWorkbook.Sheets
On Error Resume Next
Sheet.Range("f13:f1000").Select
For Each Cells In Range("f13:f1000")
Do While Not Cells.Value = Empty
If Cells.Value = "entrada x devolución" Then
Cells.EntireRow.Hidden = True
End If
Next Cells
Next Sheet
End Sub

El problema es que no cambia de hoja y se la pasa buscando en la misma hoja ("filtro") que es la activa

1 respuesta

Respuesta
1

La macro que pusiste tiene algunos errores.

Por ejemplo, tienes esta línea:

For Each Sheets

La palabra "Sheets" está reservada para los objetos de las hojas, entonces no la puedes utilizar como variable.

Puedes poner algo como esto:

For Each hoja In ActiveWorkbook.Sheets

No es conveniente utilizar la instrucción "On Error Resume Next", porque si ocurre un error, la macro pasa a la siguiente instrucción y no vas a ver cuál es el problema de la macro.

Lo recomendable es que controles cada uno de los posibles errores.


Otra línea dice

For Each Cells

De igual forma "Cells" es una palabra reservada, tienes que utilizar un nombre de variable, puede ser así:

For Each celda

Y otro detalle, tienes un Do While, pero no estás poniendo el fin de ese ciclo.


Por lo que puedo entender, quieres ocultar las filas si en la celda de la columna "F" dice : "entrada x devolución". ¿Es correcto?

Si es así, te anexo la macro:

Sub OcultarFilas()
'Por.Dante Amor
    For Each hoja In ActiveWorkbook.Sheets
        For i = hoja.Range("F" & Rows.Count).End(xlUp).Row To 13 Step -1
            If hoja.Cells(i, "F") = "entrada x devolución" Then
                hoja.Rows(i).Hidden = True
            End If
        Next
    Next
    MsgBox "Fin"
End Sub

La macro revisa todas las hojas, todas las filas de la columna "F" hasta la fila 13.


'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

Pues sno hace nada, te comento, previo a esta función cada hoja en la columna tiene un filtro automático que comienza desde la celda f13 y de ahí hasta n filas, esta ligado a un botón en un userform y solo actualiza la hojas pero no oculta las hojas que cumplen con la función, lo único que sale bien es el mensaje...

Ten envío el código completo del formulario:

Private Sub CMB1_Click()
Dim WS As Worksheet
For Each WS In ThisWorkbook.Worksheets
Select Case WorksheetFunction.CountA(WS.Range("a:xdx"))
Case Is > 0
WS.Tab.Color = RGB(0, 0, 255)
Case Else
WS.Tab.Color = RGB(255, 0, 0)
End Select
Next WS
End Sub

Private Sub CMB10_Click()
Application.ScreenUpdating = False
For Each Sheet In ActiveWorkbook.Sheets
On Error Resume Next
Sheet.Range("A13:AH13").AutoFilter Field:=24
Next Sheet
End Sub

Private Sub CMB2_Click()
Application.ScreenUpdating = False
For Each Sheet In ActiveWorkbook.Sheets
On Error Resume Next
If Sheet.AutoFilterMode Then
Sheet.Range("13:13").AutoFilter
Else
Sheet.Range("13:13").AutoFilter
End If
Next Sheet
End Sub

Private Sub CMB3_Click()
CCM = Me.TB1.Text
Application.ScreenUpdating = False
For Each Sheet In ActiveWorkbook.Sheets
On Error Resume Next
If Me.TB1.Text = "" Then
MsgBox "INGRESAR DATOS", vbExclamation, "ASABANT"
Else
Sheet.Range("a13:ah13").AutoFilter Field:=11, Operator:=xlAnd, Criteria1:="=*" & CCM & "*"
End If
Next Sheet
End Sub

Private Sub CMB6_Click()
CCR = Me.TB2.Text
Application.ScreenUpdating = False
For Each Sheet In ActiveWorkbook.Sheets
On Error Resume Next
If Me.TB2.Text = "" Then
MsgBox "INGRESAR DATOS", vbExclamation, "ASABANT"
Else
Sheet.Range("a13:ah13").AutoFilter Field:=24, Operator:=xlAnd, Criteria1:="=*" & CCR & "*"
End If
Next Sheet
End Sub

Private Sub CMB7_Click()
For Each hoja In ActiveWorkbook.Sheets
For i = hoja.Range("F" & Rows.Count).End(xlUp).Row To 500 Step -1
If hoja.Cells(i, "F") = "Entrada x Devolución" Then
hoja.Rows(i).Hidden = True
End If
Next
Next
MsgBox "Fin"
End Sub

Private Sub CMB9_Click()
Application.ScreenUpdating = False
For Each Sheet In ActiveWorkbook.Sheets
On Error Resume Next
Sheet.Range("A13:AH13").AutoFilter Field:=11
Next Sheet
End Sub

Actualmente he podido hacer que seleccione todas las hojas y seleccione un rango en cada hoja desde la celda f3 hasta la celda f500, en este rango existe un autofiltro, ¿crees qué se pueda por medio de alguna función que el autofiltro descarte este texto a partir de la selección? Porque el código que me envías no hace nada...

Revisa el texto de las celdas y el de la macro.

Cambia esta línea:

If hoja.Cells(i, "F") = "entrada x devolución" Then

Por esta:

If lcase(hoja.Cells(i, "F")) = "entrada x devolución" Then

Revisa que en las celdas diga exactamente : "entrada x devolución", tiene una "x" o tienes la palabra "por", tienes acento . En fin, revisa que el texto de la macro corresponda con el de las celdas.

Ya que lo revises, en la macro lo escribes con puras minúsculas, la macro ya tendrá la instrucción lcase, que convierte el texto a minúsculas para realizar la comparación.


ATENCIÓN: No modifiques mi macro, ya que si la modificas no te va a funcionar.

Mi macro dice esto:

For i = hoja.Range("F" & Rows.Count).End(xlUp).Row To 13 Step -1

Modificaste mi macro y pusiste esto:

For i = hoja.Range("F" & Rows.Count).End(xlUp).Row To 500 Step -1

Lo que pusiste es que vaya de la última fila de datos hasta la fila 500. Es por eso que no hace nada.

Lo que hace la instrucción es ir desde la última fila con datos hasta la fila 13. Es necesario hacerlo de esa forma para revisar la fila y ocultarla si cumple con la condición.


Prueba mi macro de manera independiente a toda la macro que pusiste, ya que tendría que revisar toda tu macro y eso es otro tema.

Después de que pruebes mi macro y veas que sí funciona, si quieres, con todo gusto la adapto a toda tu macro. Pero primero prueba mi macro y no la modifiques.


'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

¡Gracias!

En verdad te agradezco la atención y el apoyo pero no se si soy yo o estoy haciendo algo mal te envío una imagen del archivo (por políticas de la empresa no te puedo mostrar toda la info pero si lo esencial) al costado esta tu código, como podrás ver no modifique nada de tu código excepto el concepto "entrada por devolución", la ejecuto y solo me manda el mensaje de fin pero de las celdas ni en la hoja activa ni en las demás parece hacer nada... Realice otro ejemplo que hasta el momento me resulto y si funciona que es:
Sheets("1").Select
Range("T13").Select
Do While ActiveCell.Value <> ""
If ActiveCell.Value = 1 Then
ActiveCell.EntireRow.Hidden = True
ElseIf ActiveCell.Value = 2 Then
ActiveCell.EntireRow.Hidden = True
End If
ActiveCell.Offset(1, 0).Select
Loop
Sheets("2").Select... ETC POR CADA HOJA

Intente hacerlo con la opción for each hoja in activeworkbook.sheets; pero solo lo aplica en la hoja activa, esto si funciona como podrás ver, cambie la columna de la f13a la t13 en la cual inserte una función que al encontrar la palabra la cambiar por 1 o 2 según fuera el caso

No veo la imagen.

Ya no estoy entendiendo lo que vas a buscar ni en cuál columna.

Envíame tu archivo con ejemplos, cambia los datos para cuidar la información de la empresa, pero quiero ver cómo tienes los datos en las hojas.

Mi correo [email protected]

En el asunto del correo escribe tu nombre de usuario “Andres Arias” y el título de esta pregunta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas