Excel Macro (VBA): filtrare elenco dati da altro file

Anonimo
2021-04-21T12:51:21+00:00

Buondì a tutti.

Premetto innanzitutto che non sono avvezzo all'utilizzo di forum, pertanto potrei non conoscere (e quindi rispettare) varie usanze alle quali si è soliti attenersi.

Grazie della comprensione!

Espongo subito la domanda:

avrei la necessità di creare una Macro (utilizzo Excel 2019) che possa filtrare dei valori utilizzando come criteri dei valori inseriti in un altro file .xlsx, allego delle immagini per aiutarmi nello spiegare ciò che intendo.

Da un file .xlsx strutturato come segue, vado ad associare a dei Nominativi (ed un Card ID univoco) ad un Punto, in questo caso Punto A, Punto B e Punto C.

* Nomi e Cognomi o eventuali riferimenti sono puramente inventati e casuali *

Dovrei quindi elaborare un Report xlsx (esportato da un software) strutturato come l'immagine sopra, ma senza la colonna con intestazione "Punto", ovvero solamente con la colonna "Nome e Cognome" e la colonna "Card ID".

Avrei necessità che la Macro riesca in autonomia a confrontare i valori che sono presenti nel Report esportato dal software, verificare se il Card ID è presente nel file in cui sono associati i Nominativi ai Punti: se è presente, mantenere Nominativo e Card ID in uno degli elenchi dei vari Punti (come da immagine sotto), mentre se non è presente mantenere sempre il valore ma nell'elenco con intestazione "Altro".

Trascrivo ora il codice VBA che sto utilizzando in questo momento, ovvero l'unica alternativa che sono riuscito a finalizzare:

Sub macro()

    Sheets("Tabella").Select

    Range("A1").Select

    ' punto A - array

    ActiveSheet.Range("$A$1:$B$1048576").AutoFilter Field:=2

    ActiveSheet.Range("$A$1:$B$1048576").AutoFilter Field:=2, Criteria1:=Array( _

        "111111", "444444"), Operator:=xlFilterValues

' (esempio)

    Cells.Select

    Selection.Copy

    Sheets("Punto A").Select

    Range("A1").Select

    ActiveSheet.Paste

    Application.CutCopyMode = False

    Range("A1").Select

    ' elimina già elaborati

    Sheets("Tabella").Select

    Range("B2:B1048576").Select

    Selection.EntireRow.Delete

    ActiveSheet.showalldata

    Range("A1").Select

   ' punto B - array

    ActiveSheet.Range("$A$1:$B$1048576").AutoFilter Field:=2

    ActiveSheet.Range("$A$1:$B$1048576").AutoFilter Field:=2, Criteria1:=Array( _

        "222222", "555555"), Operator:=xlFilterValues

' (esempio)

    Cells.Select

    Selection.Copy

    Sheets("Punto B").Select

    Range("A1").Select

    ActiveSheet.Paste

    Application.CutCopyMode = False

    Range("A1").Select

    ' elimina già elaborati

    Sheets("Tabella").Select

    Range("B2:B1048576").Select

    Selection.EntireRow.Delete

    ActiveSheet.showalldata

    Range("A1").Select

    ' punto C - array

    ActiveSheet.Range("$A$1:$B$1048576").AutoFilter Field:=2

    ActiveSheet.Range("$A$1:$B$1048576").AutoFilter Field:=2, Criteria1:=Array( _

        "333333"), Operator:=xlFilterValues

' (esempio)

    Cells.Select

    Selection.Copy

    Sheets("Punto C").Select

    Range("A1").Select

    ActiveSheet.Paste

    Application.CutCopyMode = False

    Range("A1").Select

    ' elimina già elaborati

    Sheets("Tabella").Select

    Range("B2:B1048576").Select

    Selection.EntireRow.Delete

    ActiveSheet.showalldata

    Range("A1").Select

    ' Altro - array

    Sheets("Tabella").Select

    Cells.Select

    Selection.Copy

    Sheets("Punto C").Select

    Range("A1").Select

    ActiveSheet.Paste

    Application.CutCopyMode = False

    Range("A1").Select

    ' elimina già elaborati

    Sheets("Tabella").Select

    Cells.Select

    Selection.Delete Shift:=xlUp

    Range("A1").Select

End Sub

La Macro così funziona, ma il problema è che nel caso ci sia necessità di aggiungere, rimuovere o modificare un Nominativo e Card ID associato ad un Punto, bisogna modificare il codice della Macro.

Per i filtri ho utilizzato degli Array perché originariamente sarebbe strutturata per filtrare più di 1000 Card ID, inseriti fin'ora manualmente

Ho provato a seguire alcune guide online per impostare dei filtri avanzati utilizzando come criteri dei dati inseriti in un altro foglio nello stello file Excel, ma non funziona (cioè: non viene filtrato alcun valore e vengono mantenuti tutti i dati nel primo Punto, e quindi nei successivi non ne sono presenti).

Forse non ho effettuato correttamente le ricerche, ma comunque non sono riuscito a trovare una soluzione a questo.

Vi ringrazio intanto per la paziente lettura.

Rimango quindi in attesa

Grazie in anticipo,

    - Gabriele

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

3 risposte

Ordina per: Più utili
  1. Anonimo
    2021-04-21T14:34:54+00:00

    Mi accorgo ora di aver omesso un'informazione:

    Il contenuto del foglio "Elenco Nominativi-Punti" nel file "Nominativi-Punti.xlsx" è in realtà come segue:

    Nome e Cognome Card ID Punto
    Mario Rossi 111111 A
    Luigi Verdi 222222 B
    Giovanni Bianchi 333333 C
    Marco Gialli 444444 A
    Alberto Neri 555555 B

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2021-04-21T14:15:49+00:00

    Ciao Gabriele,

    Ti chiederei gentilmente di caricare i file di interesse, dopo averli depurato dei dati sensibili

    Ciao, grazie intanto della rapida risposta!

    Purtroppo non mi è possibile condividere file, anche dopo aver rimosso dati sensibili.

    Ho tentato di trascrivere il maggior numero di informazioni nel testo della domanda proprio per compensare questa impossibilità.

    In qualunque caso, se avessi condiviso dei file, questi sarebbero stati strutturati come segue:

    "Nominativi-Punti.xlsx"

    foglio: "Elenco Nominativi-Punti"

    contenuto:

    Nome e Cognome Card ID
    Mario Rossi 111111
    Luigi Verdi 222222
    Giovanni Bianchi 333333
    Marco Gialli 444444
    Alberto Neri 555555

    "Macro FIltro Dati.xlsm"

    foglio principale: "Macro"

    il contenuto è semplicemente una forma rettangolare alla quale andrebbe associata la Macro (come fosse un pulsante)

    fogli: "Tabella"

    contenuto:

    Nome e Cognome Card ID
    Mario Rossi 111111
    Alberto Neri 555555
    Marco Gialli 444444
    Luigi Verdi 222222
    Giovanni Bianchi 333333
    Sempronio 888888
    Tizio 777777
    Caio 666666

    altri fogli vuoti: "Punto A", "Punto B", "Punto C", "Altro"

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2021-04-21T13:11:38+00:00

    Ciao Gabriele,

    Premetto innanzitutto che non sono avvezzo all'utilizzo di forum, pertanto potrei non conoscere (e quindi rispettare) varie usanze alle quali si è soliti attenersi.

    Grazie della comprensione!

    Espongo subito la domanda:

    avrei la necessità di creare una Macro (utilizzo Excel 2019) che possa filtrare dei valori utilizzando come criteri dei valori inseriti in un altro file .xlsx, allego delle immagini per aiutarmi nello spiegare ciò che intendo.

    Da un file .xlsx strutturato come segue, vado ad associare a dei Nominativi (ed un Card ID univoco) ad un Punto, in questo caso Punto A, Punto B e Punto C.

    Immagine

    * Nomi e Cognomi o eventuali riferimenti sono puramente inventati e casuali *

    Dovrei quindi elaborare un Report xlsx (esportato da un software) strutturato come l'immagine sopra, ma senza la colonna con intestazione "Punto", ovvero solamente con la colonna "Nome e Cognome" e la colonna "Card ID".

    Avrei necessità che la Macro riesca in autonomia a confrontare i valori che sono presenti nel Report esportato dal software, verificare se il Card ID è presente nel file in cui sono associati i Nominativi ai Punti: se è presente, mantenere Nominativo e Card ID in uno degli elenchi dei vari Punti (come da immagine sotto), mentre se non è presente mantenere sempre il valore ma nell'elenco con intestazione "Altro".

    Immagine

    Trascrivo ora il codice VBA che sto utilizzando in questo momento, ovvero l'unica alternativa che sono riuscito a finalizzare:

    Sub macro()

        Sheets("Tabella").Select

        Range("A1").Select

        

        ' punto A - array

        ActiveSheet.Range("$A$1:$B$1048576").AutoFilter Field:=2

        ActiveSheet.Range("$A$1:$B$1048576").AutoFilter Field:=2, Criteria1:=Array( _

            "111111", "444444"), Operator:=xlFilterValues

    ' (esempio)

        Cells.Select

        Selection.Copy

        Sheets("Punto A").Select

        Range("A1").Select

        ActiveSheet.Paste

        Application.CutCopyMode = False

        Range("A1").Select

        ' elimina già elaborati

        Sheets("Tabella").Select

        Range("B2:B1048576").Select

        Selection.EntireRow.Delete

        ActiveSheet.showalldata

        Range("A1").Select

       ' punto B - array

        ActiveSheet.Range("$A$1:$B$1048576").AutoFilter Field:=2

        ActiveSheet.Range("$A$1:$B$1048576").AutoFilter Field:=2, Criteria1:=Array( _

            "222222", "555555"), Operator:=xlFilterValues

    ' (esempio)

        Cells.Select

        Selection.Copy

        Sheets("Punto B").Select

        Range("A1").Select

        ActiveSheet.Paste

        Application.CutCopyMode = False

        Range("A1").Select

        ' elimina già elaborati

        Sheets("Tabella").Select

        Range("B2:B1048576").Select

        Selection.EntireRow.Delete

        ActiveSheet.showalldata

        Range("A1").Select

        ' punto C - array

        ActiveSheet.Range("$A$1:$B$1048576").AutoFilter Field:=2

        ActiveSheet.Range("$A$1:$B$1048576").AutoFilter Field:=2, Criteria1:=Array( _

            "333333"), Operator:=xlFilterValues

    ' (esempio)

        Cells.Select

        Selection.Copy

        Sheets("Punto C").Select

        Range("A1").Select

        ActiveSheet.Paste

        Application.CutCopyMode = False

        Range("A1").Select

        ' elimina già elaborati

        Sheets("Tabella").Select

        Range("B2:B1048576").Select

        Selection.EntireRow.Delete

        ActiveSheet.showalldata

        Range("A1").Select

        

        ' Altro - array

        Sheets("Tabella").Select

        Cells.Select

        Selection.Copy

        Sheets("Punto C").Select

        Range("A1").Select

        ActiveSheet.Paste

        Application.CutCopyMode = False

        Range("A1").Select

        ' elimina già elaborati

        Sheets("Tabella").Select

        Cells.Select

        Selection.Delete Shift:=xlUp

        Range("A1").Select

    End Sub

    La Macro così funziona, ma il problema è che nel caso ci sia necessità di aggiungere, rimuovere o modificare un Nominativo e Card ID associato ad un Punto, bisogna modificare il codice della Macro.

    Per i filtri ho utilizzato degli Array perché originariamente sarebbe strutturata per filtrare più di 1000 Card ID, inseriti fin'ora manualmente

    Ho provato a seguire alcune guide online per impostare dei filtri avanzati utilizzando come criteri dei dati inseriti in un altro foglio nello stello file Excel, ma non funziona (cioè: non viene filtrato alcun valore e vengono mantenuti tutti i dati nel primo Punto, e quindi nei successivi non ne sono presenti).

    Forse non ho effettuato correttamente le ricerche, ma comunque non sono riuscito a trovare una soluzione a questo.

    Ti chiederei gentilmente di caricare i file di interesse, dopo averli depurato dei dati sensibili, su un servizio di condivisione di file, ad esempio Microsoft OneDrive o DropBox, e postare un link al file in una risposta qui.

    Per caricare il file su Microsoft OneDrive, vedi:

       Condividere file e cartelle di OneDrive

    Per caricare il file su DropBox, vedi:

    Come faccio a condividere file e cartelle in Dropbox?

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento