Condividi:        

FILTRO CON 2 TESTI.

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

FILTRO CON 2 TESTI.

Postdi cd7019 » 10/09/12 16:16

SALVE A TUTTI,
Ho notato che il filtro di excel non riesce a trovare tutti i dati quando sono numerosi.
Quindi vorrei eseguire un filtro veloce (se è possiblie senza FOR NEXT con un cerca o altro...) per visualizzare SOLO le celle che contengono tali dati.

esempio:
CELLA A1: TX1
CELLA A2: TX2

CAMPO DI LAVORO: A10:G1010

Visualizzare SOLO le righe che contengono il testo TX1 e TX2 (se TX2="" cercare solo TX1 o viceversa) >>> *TX1*TX2* o *TX2*TX1*.

Grazie mille
EXCEL 2003
cd7019
Utente Senior
 
Post: 232
Iscritto il: 26/06/12 21:38

Sponsor
 

Re: FILTRO CON 2 TESTI.

Postdi Flash30005 » 10/09/12 21:21

Ciao CD7019 e benvenuto nel Forum

Senza ciclo for next o for each (che è simile) la vedo dura
ma non capisco questa tua contrarietà ad usare queste funzioni
prova questa macro (In A1 inserisci il primo testo da cercare e in A2 il secondo)
Codice: Seleziona tutto
Sub NascondiRighe()
VS1 = Range("A1").Value
For RR = 1010 To 10 Step -1
Tr = 0
 If Range("A" & RR).Value = "" Then GoTo saltaRR1
        With Worksheets("Foglio1").Range("A" & RR & ":G" & RR)
            Set C = .Find(VS1, LookIn:=xlFormulas, LookAt:=xlPart)
                If Not C Is Nothing Then
                    firstAddressC = C.Address
                    Tr = 1
                    Do
                        Set C = .FindNext(C)
                    Tr = 1
                    Loop While Not C Is Nothing And C.Address <> firstAddressC
                End If
        End With
            If Tr = 0 Then
            GoTo ProcVs1
            End If

saltaRR1:
If Range("A" & RR).Value <> "" And Tr = 0 Then Rows(RR & ":" & RR).EntireRow.Hidden = True
Next RR
Exit Sub
ProcVs1:
VS2 = Range("A2").Value
        With Worksheets("Foglio1").Range("A" & RR & ":G" & RR)
            Set D = .Find(VS2, LookIn:=xlFormulas, LookAt:=xlPart)
                If Not D Is Nothing Then
                    firstAddressD = D.Address
                    Tr = 1
                    Do
                        Set D = .FindNext(D)
                    Tr = 1
                    Loop While Not D Is Nothing And D.Address <> firstAddressD
                End If
        End With
        GoTo saltaRR1
End Sub



Se vuoi scoprire successivamente le righe puoi farlo con questa riga di codice
Codice: Seleziona tutto
Sub Scopririghe()
Rows("10:1100").EntireRow.Hidden = False
End Sub



Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: FILTRO CON 2 TESTI.

Postdi Anthony47 » 11/09/12 01:22

In alternativa alla macro suggerita da Flash (vedi sopra):
-ti crei in una colonna di servizio un flag che indica se le condizioni di filtro sono avverate
-poi filtri secondo questa nuova colonna
Per ottenere questo flag:
-i valori di flitro sono in A1 e A2
-in riga 2 della nuova colonna metti la formula
Codice: Seleziona tutto
=--E(O(LUNGHEZZA(SOSTITUISCI(A10;$A$1;""))<LUNGHEZZA(A10);LUNGHEZZA($A$1)=0);O(LUNGHEZZA(SOSTITUISCI(A10;$A$2;""))<LUNGHEZZA(A10);LUNGHEZZA($A$2)=0))

-copi verso il basso
-applichi il filtro automatico a questo nuovo elenco; le celle con 1 hanno le corrispondenze, quello con 0 no

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: FILTRO CON 2 TESTI.

Postdi wallace&gromit » 11/09/12 13:01

Ciao a tutti,
forse capisco male il quesito, ma mi sembra che nessuna delle soluzioni di Anthony e Flash faccia tutto ciò che deve fare.
Non ho approfondito la macro di flash (quindi non mi esprimo su questa, anche se non funziona come mi aspettavo).

La formula di Anthony è fantastica, ma vale per una sola colonna e non per il range che comprende le colonne da A a G.
Ho provato a fare una modifica inserendo in H10 la formula di appoggio
Codice: Seleziona tutto
=A10&B10&C10&D10&E10&F10&G10
che crea una stringa con tutti i testi contenuti nella riga 10.
e in I10 la formula di Anthony che punta però a H10 invece di A10.
In questo modo identifico con il valore 1 solo se in tutta la riga 10 da A a G appare sia il testo in A1 che quello in A2.
Ti quadra CD7019?
Office2016 + 2019 su win11
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2174
Iscritto il: 16/01/12 14:21

Re: FILTRO CON 2 TESTI.

Postdi Flash30005 » 11/09/12 17:01

@W&G
Sulla creazione di una colonna appoggio "H" per concatenare tutte le celle da A a G puoi aver ragione
e anche sulla fantastica formula di Anthony (geniale!)
Ora che hai preparato il file con la formula e filtrato, salvi il risultato su altro foglio.
Poi, prova ad utilizzare la macro con gli stessi dati e fammi sapere dove non corrisponde
(potrebbe avere un bug che mi è sfuggito) :roll:

Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: FILTRO CON 2 TESTI.

Postdi Anthony47 » 11/09/12 23:41

Non interpreto che la richiesta sia di filtrare per tx1 e tx2 presente in qualsiasi colonna dell' intervallo dati, se non altro perche' il filtro standard non lo fa e il problema posto parte dal limite di Excel <2007 che gestisce solo max 1000 valori diversi.
Rilevo comunque che ho sbagliato la posizione della formula proposta, che va in xy10 e non in xy2 ("xy" e' la colonna libera a piacere), e che mi sembra corretta la proposta di w&g se effettivamente si vuole filtrare per tx1 e tx2 presente in qualsiasi colonna A:G.

Ricordo comunque che quello che che va in crisi e' l' elencazione dei valori nel menu' a tendina del filtro (che cioe' si ferma dopo aver elencato i primi 1000 valori diversi); ma quello che l' utente chiede puo' essere fatto solo con "Personalizza il filtro", che non va in crisi ne' con 1000 ne' con 10mila valori.
Quindi una ulteriore possibilita' e' l' uso di questa macro:
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
AreaFiltro = "A10:A5000"    '<<L' area che sara' filtrata
Key11 = "$A$1"              '<<La cella con la prima chiave
Key22 = "$A$2"              '<< e quella con la seconda
'
If Target.Address <> Key11 And Target.Address <> Key22 Then Exit Sub
'
Cri1 = "*" & Range(Key11).Value & "*"
Cri2 = "*" & Range(Key22).Value & "*"
    Range(AreaFiltro).AutoFilter Field:=1, Criteria1:=Cri1, Operator:=xlAnd, _
        Criteria2:=Cri2
    Target.Select
End Sub

Da excel, tasto dx sul tab col nome del foglio su cui si vuole operare; scegli Visualizza codice per aprire l' editor delle macro alla pagina giusta; copia il codice e incollalo nel frame di dx.
Personalizza le istruzioni marcate <<; poi torna sul foglio excel e prova a inserire una chiave nelle celle dichiarate: ad ogni variazione di chiave l' area dati sara' filtrata di conseguenza.

Ci sono numerosi casi analoghi in archivio; es
viewtopic.php?f=26&t=88262
viewtopic.php?f=26&t=84789
viewtopic.php?f=26&t=85162

OVVIAMENTE se si vuole filtrare per chiave presente in una qualsiasi di piu' colonne bisogna prima procedere al concatenamento delle colonne interessate e poi modificare la dichiarazione di AreaFiltro; es
Codice: Seleziona tutto
AreaFiltro = "M10:M5000"   


Ciao a tutti.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: FILTRO CON 2 TESTI.

Postdi cd7019 » 13/09/12 16:35

Grazie a tutti per l'aiuto,

Spiegazioni:
- Non sono contrario al ciclo FOR NEXT, ma risulta lento nella elaborazione.
- Avevo utilizzato la seguente macro:
Range(AreaFiltro).AutoFilter Field:=1, Criteria1:=cells(1,1), Operator:=xlAnd, Criteria2:=cells(2,1)
ma non visualizzava alcuni dati (errore di Excel!!!)

Ho provato ad utilizzare una soluzione ibrida:

Codice: Seleziona tutto
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
    NRMAX = Application.WorksheetFunction.CountA([A10:A65000]) + 20
    If ActiveCell.Row = 2 And ActiveCell.Column = 2 Then NascondiRighe
End Sub
Sub NascondiRighe()
    Rows("10:65536").EntireRow.Hidden = True
    Range("M8").FormulaR1C1 = "=--AND(OR(LEN(SUBSTITUTE(RC[-9],R1C1,""""))<LEN(RC[-9]),LEN(R1C1)=0),OR(LEN(SUBSTITUTE(RC[-9],R2C1,""""))<LEN(RC[-9]),LEN(R2C1)=0))"
    Range("M8").Copy
    Range("M8:M" & NRMAX).PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    For I1 = 10 To NRMAX
        If Cells(I1, 13) = 1 Then Rows(I1).EntireRow.Hidden = False
    Next I1
End Sub

Che ne pensate?

Grazie ancora per l'interessamento.
EXCEL 2003
cd7019
Utente Senior
 
Post: 232
Iscritto il: 26/06/12 21:38

Re: FILTRO CON 2 TESTI.

Postdi Anthony47 » 13/09/12 22:34

Ma di tutte le cose che ti abbiamo detto, che cosa hai deciso di farne?
(e ho visto poche volte excel sbagliare)

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: FILTRO CON 2 TESTI.

Postdi cd7019 » 14/09/12 13:57

Vi assicuro che con il comando:
Range(AreaFiltro).AutoFilter Field:=1, Criteria1:=cells(1,1), Operator:=xlAnd, Criteria2:=cells(2,1)
alcune righe non venivano filtate/visualizzate.

Con le Vostre preziose informazioni ho creato la macro per una sola colonna, per adesso.
Perchè la mia intenzione sarebbe quella di ricreare un filtro con tante colonne (Filtrare 2 Testi in A1 e A2 per la colonna A, in B1 e B2 per la colonna B, ecc...)

Grazie mille.
EXCEL 2003
cd7019
Utente Senior
 
Post: 232
Iscritto il: 26/06/12 21:38

Re: FILTRO CON 2 TESTI.

Postdi Anthony47 » 15/09/12 00:36

Vi assicuro che con il comando:
Codice: Seleziona tutto
Range(AreaFiltro).AutoFilter Field:=1, Criteria1:=cells(1,1), Operator:=xlAnd, Criteria2:=cells(2,1)

alcune righe non venivano filtate/visualizzate.
Ma nessuno di noi ti ha suggerito quell' istruzione...

La cosa piu' vicina che ti e' stata suggerita (viewtopic.php?f=26&t=96854&p=556027#p555825) e'
Codice: Seleziona tutto
    Range(AreaFiltro).AutoFilter Field:=1, Criteria1:=Cri1, Operator:=xlAnd, _
        Criteria2:=Cri2

Dove pero' Cri1 e' pari a "*A1*" e Cri2 "*A2*"

Con lo stesso approccio puoi lavorare su piu' colonne; allargherai AreaFiltro per includere dalla A fino all' ultima colonna da usare come filtro, ti calcolerai Cri1b, Cri2b (sui dati di B1 e B2), Cri1c e Cri2c (sui dati di C1 e C2), etc etc
Poi aggiungerai tante righe che applicano il filtro all' area usando tali criteri, e ovviamente dovrai modificare in testa la macro affinche' lavori su tutte le colonne.

Ad esempio questa filtra le colonne A:C secondo i valori inseriti in testa alle stesse colonne:
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
AreaFiltro = "A10:G5000"    '<<L' area dati; la prima colonna sara' filtrata
KeyArea = "A1:D2"
'
If Application.Intersect(Target, Range(KeyArea)) Is Nothing Then Exit Sub
'If Target.Address <> Key11 And Target.Address <> Key22 Then Exit Sub
'
Cri1 = "*" & Range("A1").Value & "*"
Cri2 = "*" & Range("A2").Value & "*"
Cri1b = "*" & Range("B1").Value & "*"
Cri2b = "*" & Range("B2").Value & "*"
Cri1c = "*" & Range("C1").Value & "*"
Cri2c = "*" & Range("C2").Value & "*"
    Range(AreaFiltro).AutoFilter Field:=1, Criteria1:=Cri1, Operator:=xlAnd, _
        Criteria2:=Cri2
    Range(AreaFiltro).AutoFilter Field:=2, Criteria1:=Cri1b, Operator:=xlAnd, _
        Criteria2:=Cri2b
    Range(AreaFiltro).AutoFilter Field:=3, Criteria1:=Cri1c, Operator:=xlAnd, _
        Criteria2:=Cri2c
    Target.Select
End Sub

Vedi tu cosa farne di questi spunti; in quanto alla soluzione ibrida posso solo dire che se funziona e' buona anche quella.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "FILTRO CON 2 TESTI.":


Chi c’è in linea

Visitano il forum: Nessuno e 79 ospiti