Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

vba excel: filtrare elenco per lunghezza parola

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

vba excel: filtrare elenco per lunghezza parola

Postdi karug64 » 30/08/16 19:12

Salve a tutti.
E' possibile in vba per excel applicare un filtro ad una colonna (contenente solo parole) in base alla lunghezza delle stesse (possibilmente senza creare una colonna di appoggio contenente la formula lunghezza(() ) ?

Per esempio estrarre tutte le parole lunghe 4 caratteri ?

Grazie
Office 2010
karug64
Utente Senior
 
Post: 580
Iscritto il: 20/11/11 21:22

Sponsor
 

Re: vba excel: filtrare elenco per lunghezza parola

Postdi Anthony47 » 31/08/16 00:11

Si.
Per i dettagli pero' devi spiegare che cosa intendi per "estrarre": lasciare visibili? Copiare in altra posizione? Inserire in un array? Oppure...
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13895
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: vba excel: filtrare elenco per lunghezza parola

Postdi karug64 » 31/08/16 01:55

Anthony47 ha scritto:Si.
Per i dettagli pero' devi spiegare che cosa intendi per "estrarre": lasciare visibili? Copiare in altra posizione? Inserire in un array? Oppure...


Ciao.
La soluzione migliore potrebbe essere metterli in un array, ma poichè non so stabilire ora se il numero dei filtrati sarà notevole o no, si può adottare la soluzione di scrivere il nuovo elenco sul foglio "Appoggio".

Grazie
Office 2010
karug64
Utente Senior
 
Post: 580
Iscritto il: 20/11/11 21:22

Re: vba excel: filtrare elenco per lunghezza parola

Postdi Anthony47 » 01/09/16 01:45

Ad esempio questo codice:
Codice: Seleziona tutto
Sub FiltraBL()
Dim WArr, OArr(), I As Long, myOInd As Long, listCol As String
'
listCol = "B"                           '<<< La colonna con l'elenco
Sheets("Foglio1").Select                '<<< Il foglio con l'elenco
lastr = Cells(Rows.Count, listCol).End(xlUp).Row
WArr = Cells(2, listCol).Resize(lastr, 1).Value
ReDim OArr(LBound(WArr, 1) To UBound(WArr, 1))
myOInd = LBound(OArr)
For I = LBound(WArr, 1) To UBound(WArr, 1)
    If Len(WArr(I, 1)) = 4 Then         '<<< La regola da rispettare
        OArr(myOInd) = WArr(I, 1)
        myOInd = myOInd + 1
    End If
Next I
ReDim Preserve OArr(LBound(WArr, 1) To myOInd)
Sheets("Appoggio").Range("A1").Resize(lastr,1).ClearContents
Sheets("Appoggio").Range("A1").Resize(myOInd, 1) = OArr

End Sub

Le righe marcate <<< vanno personalizzate.

In coda al codice e' previsto la scrittura delle parole che rispecchiano il criterio impostato nel foglio Appoggio; ma lo stesso elenco e' contenuto nell'array OArr (che si svuota al completamento della macro).
Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13895
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: vba excel: filtrare elenco per lunghezza parola

Postdi karug64 » 01/09/16 10:28

Ok. Grazie.

Non conoscevo affatto la possibilità di stampare con un solo comando un intero array...

Ho notato un problema, però: nella routine così come postata viene stampato solo il primo elemento dell'array per "x" volte.

A beneficio di chi leggerà in futuro questo post: cercando in rete ho capito che poichè gli array vengono memorizzati in righe e non colonne se l'istruzione viene modificata in

Codice: Seleziona tutto
Sheets("Appoggio").Range("A1").Resize(1,myOInd).Value = OArr)


ottengo sulla prima riga tutti gli elementi dell'array.

Per ottenerli in colonna ho trovato questa soluzione, che funziona, ma che non so se è la migliore (piuttosto che un ciclo for...):

Codice: Seleziona tutto
Sheets("Appoggio").Range("A1").Resize(myOInd, 1).Value = application.transpose(OArr)


Grazie
Office 2010
karug64
Utente Senior
 
Post: 580
Iscritto il: 20/11/11 21:22

Re: vba excel: filtrare elenco per lunghezza parola

Postdi karug64 » 04/09/16 21:07

Scusate, riprendo il post per chiedere:
se oltre al filtro sulla lunghezza della parola (routine di Anthony che funziona perfettamente) avessi la necessità di filtrare contemporaneamente il valore di un altra colonna ?

Es.

Filtra tutte le parole di colonna "A" con lunghezza = 10 che in colonna "B" contengano il carattere "N".

Come si potrebbe fare ?

Grazie
Office 2010
karug64
Utente Senior
 
Post: 580
Iscritto il: 20/11/11 21:22

Re: vba excel: filtrare elenco per lunghezza parola

Postdi Anthony47 » 05/09/16 02:16

Ho notato un problema, però: nella routine così come postata viene stampato solo il primo elemento dell'array per "x" volte

Grrr... Ci casco sempre....
Se OArr siamo certi che conterra' sempre <65000 elementi allora la Transpose va bene.
Oppure modifica il dimensionamento di OArr:
Codice: Seleziona tutto
ReDim OArr(LBound(WArr, 1) To UBound(WArr, 1), 1 To 1)
Poi verso il fondo elimina la ReDim
Codice: Seleziona tutto
'ReDim Preserve OArr(LBound(WArr, 1) To myOInd)


se oltre al filtro sulla lunghezza della parola (routine di Anthony che funziona perfettamente) avessi la necessità di filtrare contemporaneamente il valore di un altra colonna ?
Es. Filtra tutte le parole di colonna "A" con lunghezza = 10 che in colonna "B" contengano il carattere "N"

Devi modificare la riga che come commento contiene " <<< La regola da rispettare", che ora dice
Codice: Seleziona tutto
    If Len(WArr(I, 1)) = 4 Then         '<<< La regola da rispettare

La macro carica in una matrice (WArr) il contenuto della colonna che si vuole controllare; se vuoi inserire due controlli allora la cosa piu' semplice e' che carichi in una seconda matrice il contenuto della seconda colonna e poi lavori su questa seconda matrice). Esempio
Codice: Seleziona tutto
WArr = Cells(2, listCol).Resize(lastr, 1).Value               'Esistente
WAb = Cells(2, NumeroDiAltraColonna).Resize(lastr, 1).Value   '<<< Aggiungi

Poi modifichi:
Codice: Seleziona tutto
    If Len(WArr(I, 1)) = 4 and InStr(1, WAb(I, 1), "N", vbTextCompare) Then         '<<< La regola da rispettare


Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13895
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "vba excel: filtrare elenco per lunghezza parola":


Chi c’è in linea

Visitano il forum: Nessuno e 16 ospiti