Discussione:
VBA: filtro automatico su più fogli
(troppo vecchio per rispondere)
pic omnic
2020-08-08 10:25:56 UTC
Permalink
Ho quattro fogli. Sono tutti accomunati dal fatto che nella colonna A ci sono il cognome e nome (Rossi Mario) da filtrare(filtro automatico sul posto); poi seguono altri dati nelle altre 4-5 colonne.
Avrei pensato ad un comando unico, posto su tutti i fogli:
1) che mi presenti una input box , dove inserire i dati da ricercare (cognome e nome)
2) mi estragga le righe contenente il dato inserito nella inputbox , senza stare a ripetere l’operazione per ciascun foglio. I dati da cercare sono tutti nella col A di tutti i fogli.
Ho provato da solo, ma non riesco a farlo fonzionare su più fogli
Draleo
l***@gmail.com
2020-08-09 21:54:05 UTC
Permalink
Sub FiltroSuPiuFogli()
'
' Filtra anche per chiave parziale con caratteri jolly 'Aa*'
' Vedi se aiuta ...

'
Dim ySht, yRng, yTxt

yTxt = InputBox("Nome da filtrare", "Lucky", "")
If yTxt = "" Then
MsgBox "Nessuna voce da filtrare.", , "Lucky"
Exit Sub
End If

yRng = "$A$1:$D$11" ' <<< Modificare, range da filtrare

Set ySht = Sheets("Foglio1") ' <<< Modificare
With ySht.AutoFilter
If .FilterMode Then
.ShowAllData
End If
End With
ySht.Range(yRng).AutoFilter Field:=1, Criteria1:=yTxt

Set ySht = Sheets("Foglio2") ' <<< Modificare
With ySht.AutoFilter
If .FilterMode Then
.ShowAllData
End If
End With
ySht.Range(yRng).AutoFilter Field:=1, Criteria1:=yTxt

Set ySht = Sheets("Foglio3") ' <<< Modificare
With ySht.AutoFilter
If .FilterMode Then
.ShowAllData
End If
End With
ySht.Range(yRng).AutoFilter Field:=1, Criteria1:=yTxt

Set ySht = Sheets("Foglio4") ' <<< Modificare
With ySht.AutoFilter
If .FilterMode Then
.ShowAllData
End If
End With
ySht.Range(yRng).AutoFilter Field:=1, Criteria1:=yTxt

Set ySht = Nothing

End Sub
pic omnic
2020-08-10 15:43:11 UTC
Permalink
Post by l***@gmail.com
Sub FiltroSuPiuFogli()
'
' Filtra anche per chiave parziale con caratteri jolly 'Aa*'
' Vedi se aiuta ...
'
Dim ySht, yRng, yTxt
yTxt = InputBox("Nome da filtrare", "Lucky", "")
If yTxt = "" Then
MsgBox "Nessuna voce da filtrare.", , "Lucky"
Exit Sub
End If
yRng = "$A$1:$D$11" ' <<< Modificare, range da filtrare
Set ySht = Sheets("Foglio1") ' <<< Modificare
With ySht.AutoFilter
If .FilterMode Then
.ShowAllData
End If
End With
ySht.Range(yRng).AutoFilter Field:=1, Criteria1:=yTxt
Set ySht = Sheets("Foglio2") ' <<< Modificare
With ySht.AutoFilter
If .FilterMode Then
.ShowAllData
End If
End With
ySht.Range(yRng).AutoFilter Field:=1, Criteria1:=yTxt
Set ySht = Sheets("Foglio3") ' <<< Modificare
With ySht.AutoFilter
If .FilterMode Then
.ShowAllData
End If
End With
ySht.Range(yRng).AutoFilter Field:=1, Criteria1:=yTxt
Set ySht = Sheets("Foglio4") ' <<< Modificare
With ySht.AutoFilter
If .FilterMode Then
.ShowAllData
End If
End With
ySht.Range(yRng).AutoFilter Field:=1, Criteria1:=yTxt
Set ySht = Nothing
End Sub
Grazie per la risposta. Funziona bene,nel senso che alla fine fa quel che deve. Magari si potrebbe perfezionare nei seguenti punti ?
1) se il filtro automatico non è impostato, da errore "Variabile oggetto non impostata" alla riga If .filterMode Then....e può capitare che in un foglio questo avvenga, perchè si è attivato per es "mostra tutti". Io conosco il trucchetto e potrei rimediare, ma dovrei passare il file ad alcuni colleghi, che non masticano Excel...
2)La ricerca per chiavi parziali non mi sembra funzionare; cioè se cerco Rossi Mario, ma per errore inserissi solo Rossi, non estrae niente. Mi sarei aspettato invece che estraesse tutti i Rossi
3)Il range di ricerca fisso yRng = "$A$1:$D$11" è un pò limitante. Non si potrebbe usare, in ogni foglio UsedRange oppure qualcos'altro che riconosca l'intervallo in automatico ?
Grazie ancora
draleo
l***@gmail.com
2020-08-10 21:28:47 UTC
Permalink
Ho rivisto un po' di cose, vedi come va

Sub FiltroSuPiuFogli2()
'
' Filtra anche per chiave parziale con caratteri jolly 'Aa*'
'

'
Dim ySht1, ySht2, ySht3, ySht4, yTxt ' yRng,

yTxt = InputBox("Nome da filtrare", "Lucky", "")
If yTxt = "" Then
MsgBox "Nessuna voce da filtrare."
Exit Sub
End If

' yRng = "$A$1:$D$11" ' <<< Modificare, range da filtrare

ySht1 = "Foglio1"
ySht2 = "Foglio2"
ySht3 = "Foglio3"
ySht4 = "Foglio4"

If Worksheets(ySht1).AutoFilterMode Then
If Worksheets(ySht1).FilterMode Then
Worksheets(ySht1).ShowAllData
End If
Else
Worksheets(ySht1).Range("A1").CurrentRegion.AutoFilter
End If
Worksheets(ySht1).Range("A1").CurrentRegion.AutoFilter Field:=1, Criteria1:=yTxt

If Worksheets(ySht2).AutoFilterMode Then
If Worksheets(ySht2).FilterMode Then
Worksheets(ySht2).ShowAllData
End If
Else
Worksheets(ySht2).Range("A1").CurrentRegion.AutoFilter
End If
Worksheets(ySht2).Range("A1").CurrentRegion.AutoFilter Field:=1, Criteria1:=yTxt

If Worksheets(ySht3).AutoFilterMode Then
If Worksheets(ySht3).FilterMode Then
Worksheets(ySht3).ShowAllData
End If
Else
Worksheets(ySht3).Range("A1").CurrentRegion.AutoFilter
End If
Worksheets(ySht3).Range("A1").CurrentRegion.AutoFilter Field:=1, Criteria1:=yTxt

If Worksheets(ySht4).AutoFilterMode Then
If Worksheets(ySht4).FilterMode Then
Worksheets(ySht4).ShowAllData
End If
Else
Worksheets(ySht4).Range("A1").CurrentRegion.AutoFilter
End If
Worksheets(ySht4).Range("A1").CurrentRegion.AutoFilter Field:=1, Criteria1:=yTxt

End Sub
l***@gmail.com
2020-08-10 23:13:18 UTC
Permalink
... o anche ...
Option Base 1

Sub FiltroSuPiuFogli()
'
' Filtra su più fogli (es.: 1-4) per il valore passato dalla InputBox
' Se i filtri non sono attivi, vengono attivati
' Se i filtri sono attivi vengono disattivati/riattivati (ev. nuovi dati)
' Filtra anche per chiave parziale con caratteri jolly 'Aa*'
' Filtro per '*': filtri attivi, sel. filtro attivo, ma tutti i dati visibili
' Filtro per 'nulla', filtri attivi, nessuna sel. attiva, mostra tutti i dati
' E' attivo un ciclo 'for ... next ...)

'
Dim ySht, yTxt

yTxt = InputBox("Nome da filtrare", "Lucky", "")

ySht = Array("Foglio1", "Foglio2", "Foglio3", "Foglio4") ' << + fogli

For i = LBound(ySht) To UBound(ySht) Step 1
If Worksheets(ySht(i)).AutoFilterMode Then ' se i filtri sono attivi
Worksheets(ySht(i)).Range("A1").CurrentRegion.AutoFilter ' disattiva filtri (ev. incremento voci)
Worksheets(ySht(i)).Range("A1").CurrentRegion.AutoFilter ' attiva filtri
Else
Worksheets(ySht(i)).Range("A1").CurrentRegion.AutoFilter ' attiva filtri
End If
If yTxt <> "" Then Worksheets(ySht(i)).Range("A1").CurrentRegion.AutoFilter Field:=1, Criteria1:=yTxt
Next i

End Sub

potrebbe essere una base ...
casanmaner
2020-08-11 09:30:47 UTC
Permalink
Mi aggiungo per proporre una possibile soluzione.
In un modulo standard ho inserito il seguente codice:

'---
Option Explicit

Const sFogli As String = "Foglio1,Foglio2,Foglio3,Foglio4" '<== elenco fogli da filtrare
Const sPrimaCellaFiltro As String = "A1" '<== prima cella dove applicare il filtro
Const iCampoFiltro As Long = 1 '<== Indice del campo a cui applicare il filtro

Dim vFogli As Variant
Dim vFoglio As Variant

Sub FiltraFogli()
Dim sTestoFiltro

sTestoFiltro = Application.InputBox(Prompt:="Inserire il testo parziale del nome da filtrare", _
Title:="Filtra per Nome", _
Type:=2)

If sTestoFiltro = False Or sTestoFiltro = vbNullString Then Exit Sub

vFogli = Split(sFogli, ",")
With Application
.Calculation = xlCalculationManual
.ScreenUpdating = False
.EnableEvents = False
End With
With ThisWorkbook
For Each vFoglio In vFogli
With .Worksheets(vFoglio)
.AutoFilterMode = False
With .Range(sPrimaCellaFiltro)
.AutoFilter Field:=iCampoFiltro
.AutoFilter Field:=iCampoFiltro, Criteria1:="=*" & sTestoFiltro & "*"
End With
End With
Next vFoglio
End With
With Application
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
.EnableEvents = True
End With
End Sub

Sub EliminaFiltri()
vFogli = Split(sFogli, ",")
With Application
.Calculation = xlCalculationManual
.ScreenUpdating = False
.EnableEvents = False
End With
With ThisWorkbook
For Each vFoglio In vFogli
With .Worksheets(vFoglio)
.AutoFilterMode = False
End With
Next vFoglio
End With
With Application
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
.EnableEvents = True
End With
End Sub

'---


Qui un file di esempio dove nel primo foglio ci sono due pulsanti (uno per applicare i filtri a tutti i fogli e uno per eliminare i filtri a tutti i fogli):
https://www.dropbox.com/s/mrq5s011sp7yjr8/vba%20filtro%20automatico%20su%20pi%C3%B9%20fogli.xlsm?dl=0

I nomi dei fogli da filtrare vanno elencati tramite la constante "sFogli" (elenco da inserire separando i nomi tramite la virgola e senza spazi).
La prima cella dove applicare il filtro è da indicare tramite la costante "sPrimaCellaFiltro".
L'indice del campo a cui applicare il filtro da indicare tramite la costante "iCampoFiltro".

Prova a vedere se gira con i tui dati reali.
pic omnic
2020-08-11 17:47:23 UTC
Permalink
Ottime entrambe le procedure.Ora Rispondono in pieno alle mie esigenze. A voler essere pignoli , nella procedura di Casanmaner, c'è una cosa che non mi ritorna:quando lancio il pulsante "Filtra Fogli", in un paio di fogli (non in tutti)mi estrae sempre anche la riga2 (nella riga1 ci sono le intestazioni) ,anche quando questa riga2 non risponde ai criteri. Ma non è rilevante. si vede subito che il nome non è quello cercato. Grazie ancora ad entrambi (non posso dire a buon rendere)
draleo
casanmaner
2020-08-11 18:41:37 UTC
Permalink
Post by pic omnic
Ottime entrambe le procedure.Ora Rispondono in pieno alle mie esigenze. A voler essere pignoli , nella procedura di Casanmaner, c'è una cosa che non mi ritorna:quando lancio il pulsante "Filtra Fogli", in un paio di fogli (non in tutti)mi estrae sempre anche la riga2 (nella riga1 ci sono le intestazioni) ,anche quando questa riga2 non risponde ai criteri. Ma non è rilevante. si vede subito che il nome non è quello cercato. Grazie ancora ad entrambi (non posso dire a buon rendere)
draleo
Non sono riuscito a replicare il fenomeno.
Mi viene da pensare che il testo utilizzato per filtrare sia conenuto nel nome di quei due fogli.
Puoi indicare il nome presente in riga due e che criterio di ricerca utilizzi?
Giusto per provare :)
pic omnic
2020-08-11 19:31:04 UTC
Permalink
Post by casanmaner
Post by pic omnic
Ottime entrambe le procedure.Ora Rispondono in pieno alle mie esigenze. A voler essere pignoli , nella procedura di Casanmaner, c'è una cosa che non mi ritorna:quando lancio il pulsante "Filtra Fogli", in un paio di fogli (non in tutti)mi estrae sempre anche la riga2 (nella riga1 ci sono le intestazioni) ,anche quando questa riga2 non risponde ai criteri. Ma non è rilevante. si vede subito che il nome non è quello cercato. Grazie ancora ad entrambi (non posso dire a buon rendere)
draleo
Non sono riuscito a replicare il fenomeno.
Mi viene da pensare che il testo utilizzato per filtrare sia conenuto nel nome di quei due fogli.
Puoi indicare il nome presente in riga due e che criterio di ricerca utilizzi?
Giusto per provare :)
no. non è cosi. Se per esempio cerco Aliffi Romano,nel foglio 1 e 3 mi estrae correttamente tutte le righe corrispondenti; ma nel foglio 2 e 4 mi estrae rispettivamente ANCHE Adriani patrizia e Aguirre Cristina Alicia , che si trovano nella 2° riga (come se cominciasse la ricerca dalla riga 3). E' strano ma non trovo una spiegazione, perchè nel foglio 1 e 3 questo non avviene. Purtroppo non posso pubblicare il file perchè contiene dati sensibili. C'è però anche un altra cosa strana : mentre nei fogli che si comportano correttamente i simboli del filtro (imbuti) sono nella riga1 (intestazioni), nei 2 fogli incriminati questi imbuti sono nella riga 2;. Tutto lascia pensare che la ricerca inizi dalla riga 3. Boh..
draleo
casanmaner
2020-08-11 19:51:22 UTC
Permalink
Ma le intestazioni iniziano tutti da A1?
pic omnic
2020-08-11 20:26:57 UTC
Permalink
Post by casanmaner
Ma le intestazioni iniziano tutti da A1?
si. in tutti i fogli le intestazioni vanno tutte da A1 a E1. Ho lasciato quelle del tuo file senza modificare niente. Ho solo sovrascritto i dati tuoi con i miei iniziando da A2
Continua a leggere su narkive:
Risultati di ricerca per 'VBA: filtro automatico su più fogli' (Domande e Risposte)
15
risposte
excel??????????
iniziato 2008-04-05 03:51:35 UTC
computer e internet
Loading...