Questo tutorial dimostrerà come rimuovere i duplicati utilizzando il metodo RemoveDuplicates in VBA.
Metodo di rimozione dei duplicati
Quando i dati vengono importati o incollati in un foglio di lavoro Excel, spesso possono contenere valori duplicati. Potrebbe essere necessario pulire i dati in entrata e rimuovere i duplicati.
Fortunatamente, esiste un metodo semplice all'interno dell'oggetto Range di VBA che ti consente di farlo.
1 | Intervallo ("A1: C8"). Rimuovi colonne duplicati: = 1, intestazione: = xl Sì |
La sintassi è:
RimuoviDuplicati([Colonne],[Intestazione]
- [Colonne] - Specificare quali colonne sono controllate per i valori duplicati. Tutte le colonne corrispondono molto per essere considerate un duplicato.
- [Intestazione] - I dati hanno un'intestazione? xlNo (predefinito), xlSì, xlSìNoGuess
Tecnicamente, entrambi i parametri sono opzionali. Tuttavia, se non specifichi l'argomento Colonne, nessun duplicato verrà rimosso.
Il valore predefinito per Header è xlNo. Ovviamente è meglio specificare questo argomento, ma se hai una riga di intestazione, è improbabile che la riga di intestazione corrisponda come duplicato.
Rimuovi i duplicati Note sull'utilizzo
- Prima di utilizzare il metodo RemoveDuplicates, è necessario specificare un intervallo da utilizzare.
- Il metodo RemoveDuplicates rimuoverà tutte le righe con duplicati trovati, ma manterrà la riga originale con tutti i valori.
- Il metodo RemoveDuplicates funziona solo su colonne e non su righe, ma il codice VBA può essere scritto per correggere questa situazione (vedi più avanti).
Dati di esempio per esempi VBA
Per mostrare come funziona il codice di esempio, vengono utilizzati i seguenti dati di esempio:
Rimuovi righe duplicate
Questo codice rimuoverà tutte le righe duplicate in base solo ai valori nella colonna A:
123 | Sub RemoveDupsEx1()Intervallo ("A1: C8"). Rimuovi colonne duplicati: = 1, intestazione: = xl SìFine sottotitolo |
Si noti che abbiamo definito esplicitamente l'intervallo "A1:C8". Invece puoi usare il UsedRange. UsedRange determinerà l'ultima riga e colonna dei dati utilizzata e applicherà RemoveDuplicates a quell'intero intervallo:
123 | Sub RemoveDups_UsedRange()ActiveSheet.UsedRange.RemoveDuplicates Colonne:=1, Intestazione:=xlSìFine sottotitolo |
UsedRange è incredibilmente utile, eliminando la necessità di definire esplicitamente l'intervallo.
Dopo aver eseguito questo codice, il tuo foglio di lavoro sarà ora simile a questo:
Si noti che poiché è stata specificata solo la colonna A (colonna 1), il duplicato "Mele" precedentemente nella riga 5 è stato rimosso. Tuttavia, la Quantità (colonna 2) è diversa.
Per rimuovere i duplicati, confrontando più colonne, possiamo specificare quelle colonne utilizzando un metodo Array.
Rimuovi i duplicati confrontando più colonne
123 | Sub RemoveDups_MultColumns()ActiveSheet.UsedRange.RemoveDuplicates Columns:=Array(1, 2) , Header:=xlYesFine sottotitolo |
L'array dice a VBA di confrontare i dati utilizzando entrambe le colonne 1 e 2 (A e B).
Le colonne nell'array non devono essere in ordine consecutivo.
123 | Sub SimpleEsempio()ActiveSheet.UsedRange.RemoveDuplicates Columns:=Array(3, 1) , Header:=xlSìFine sottotitolo |
In questo esempio, le colonne 1 e 3 vengono utilizzate per il confronto dei duplicati.
Questo esempio di codice utilizza tutte e tre le colonne per verificare la presenza di duplicati:
123 | Sub SimpleEsempio()ActiveSheet.UsedRange.RemoveDuplicates Columns:=Array(1, 2, 3) , Header:=xlYesFine sottotitolo |
Rimozione di righe duplicate da una tabella
I RemoveDuplicates possono essere applicati anche a una tabella Excel esattamente allo stesso modo. Tuttavia, la sintassi è leggermente diversa.
1234 | Sub SimpleEsempio()ActiveSheet.ListObjects("Table1").DataBodyRange.RemoveDuplicates Columns:=Array(1, 3), _Intestazione:=xlSìFine sottotitolo |
Ciò rimuoverà i duplicati nella tabella in base alle colonne 1 e 3 (A e C). Tuttavia, non riordina la formattazione del colore della tabella e vedrai righe vuote colorate lasciate nella parte inferiore della tabella.
Rimuovi duplicati dagli array
Se è necessario rimuovere i valori duplicati da un array, ovviamente è possibile eseguire l'output dell'array in Excel, utilizzare il metodo RemoveDuplicates e reimportare l'array.
Tuttavia, abbiamo anche scritto una procedura VBA per rimuovere i duplicati da un array.
Rimozione di duplicati da righe di dati utilizzando VBA
Il metodo RemoveDuplicates funziona solo su colonne di dati, ma con un po' di pensiero "pronto all'uso", puoi creare una procedura VBA per gestire righe di dati.
Supponiamo che i tuoi dati assomiglino a questo sul tuo foglio di lavoro:
Hai gli stessi duplicati di prima nelle colonne B ed E, ma non puoi rimuoverli usando il metodo RemoveDuplicates.
La risposta è utilizzare VBA per creare un foglio di lavoro aggiuntivo, copiare i dati in esso trasponendoli in colonne, rimuovere i duplicati e quindi copiarli nuovamente trasponendoli in righe.
12345678910111213141516171819202122232425262728293031323334353637 | Duplicati secondari nelle righe()'Disattiva l'aggiornamento dello schermo e gli avvisi: vogliamo che il codice venga eseguito correttamente senza che l'utente lo veda'cosa sta succedendoApplication.ScreenUpdating = FalseApplication.DisplayAlerts = False'Aggiungi un nuovo foglio di lavoroFogli.Aggiungi dopo:=Foglio attivo'Chiama il nuovo foglio di lavoro 'CopySheet'ActiveSheet.Name = "CopySheet"'Copia i dati dal foglio di lavoro originaleFogli("DataInRows").UsedRange.Copy'Attiva il nuovo foglio che è stato creatoFogli("CopiaFoglio").Attiva'Incolla trasponi i dati in modo che siano ora in colonneActiveSheet.Range("A1").PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _Falso, Trasponi:=Vero"Rimuovi i duplicati per le colonne 1 e 3"Colonne ActiveSheet.UsedRange.RemoveDuplicates:=Array(1, 3), Header _:=xlSì"Cancella i dati nel foglio di lavoro originale"Fogli("DataInRows").UsedRange.ClearContents'Copia le colonne di dati dal nuovo foglio di lavoro creatoFogli("Foglio di copia").UsedRange.Copy'Attiva il foglio originaleFogli("DataInRows").Attiva'Incolla trasporre i dati non duplicatiActiveSheet.Range("A1").PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _Falso, Trasponi:=Vero'Elimina il foglio di copia - non è più necessarioFogli("Copia"). Elimina'Attiva il foglio originaleFogli("DataInRows").Attiva'Riattiva l'aggiornamento dello schermo e gli avvisiApplication.ScreenUpdating = TrueApplication.DisplayAlerts = TrueFine sottotitolo |
Questo codice presuppone che i dati originali nelle righe siano conservati in un foglio di lavoro chiamato "DataInRows"
Dopo aver eseguito il codice, il tuo foglio di lavoro sarà simile a questo:
Il duplicato "Mele" nella colonna E è stato ora rimosso. L'utente è tornato in una posizione pulita, senza fogli di lavoro estranei in giro e l'intero processo è stato eseguito senza problemi senza sfarfallio dello schermo o messaggi di avviso.