Eliminazione di tutte le righe eccetto la fine del mese (Microsoft Excel)
David ha un foglio di lavoro che include solo due colonne: una data e un valore di portfolio per ogni data. Il foglio di lavoro ha righe per ogni giorno di negoziazione da gennaio 1999 ad oggi. David deve eliminare tutte le righe ad eccezione di quelle relative all’ultimo giorno di negoziazione di ogni mese. Ha provato a filtrare, ma ciò non ha aiutato, quindi è confuso sul modo migliore per eliminare le righe non necessarie.
Nel fornire modi per affrontare questo problema, una delle chiavi della domanda su cui mi concentrerò è che David ha detto che i suoi dati “hanno righe per ogni giorno di negoziazione”. Per me, questo significa che alcune date (giorni non di negoziazione) non sono incluse nei suoi dati. Questa è la chiave perché significa che non dobbiamo trovare una soluzione che, prima di decidere se mantenere una riga o meno, determina se una data è un giorno di negoziazione.
Questo in realtà rende il lavoro molto più semplice. Ora possiamo semplicemente trovare, dalle date nella colonna A, quelle righe che contengono effettivamente l’ultima (o “la più alta”) data in un dato mese. Mi concentrerò prima su un approccio manuale che si basa su una colonna di supporto. Poiché David ha detto che i suoi dati sono costituiti solo dalle colonne A (data) e B (valore), suggerirò di utilizzare la colonna C come colonna di supporto. (Presumo anche che la riga 1 contenga intestazioni di colonna e che i dati reali inizino nella riga 2.)
Assicurati che i tuoi dati siano ordinati in modo che le date siano in ordine crescente, inserisci la seguente formula nella cella C2:
=IF(DAY(A3)<DAY(A2),"EOM","X")
Copia questa formula per tutti i tuoi dati e il gioco è fatto. È ora possibile, se lo si desidera, utilizzare il filtro in base alla colonna C. Se si filtra in modo che vengano visualizzate solo le righe contenenti “EOM”, si hanno i valori finali per ogni mese. Se filtri in modo che vengano visualizzate solo le righe contenenti “X”, puoi eliminare quelle righe, rimuovere il filtro e avere solo le righe con i valori di fine mese nei tuoi dati.
Come spesso accade, ci sono una miriade di formule che potresti usare nella colonna C invece di quella che suggerisco. Ho suggerito questo, però, perché fa un confronto molto semplice che sarà sempre verificabile – se il giorno “scende” di valore nella riga successiva a quella corrente. In ogni possibile scenario, questo sarà vero solo alla fine di un mese. Quindi, quella riga è contrassegnata con “EOM” e il resto con “X”.
Vorrei sottolineare che se scegli di utilizzare una formula diversa, assicurati che sia una che non verifica se la data nella colonna A è l’ultimo giorno del mese. Perché? Perché potrebbe non essere — ricorda che nei dati di David, la colonna A contiene le date dei giorni di negoziazione, ed è assolutamente possibile che l’ultimo giorno di negoziazione di un mese non cada l’ultimo giorno del mese. (I fine settimana e le vacanze, in altre parole, sono esclusi, per definizione, dai dati di David.)
Se stai usando Office 365 (o quello a cui Microsoft, in questi giorni, si riferisce come Microsoft 365), c’è anche un modo per estrarre solo le date di fine mese ei loro valori. Supponiamo che i tuoi dati siano in A2: B5000. (Ricorda che A1: B1 contiene le intestazioni di colonna.) Metti la seguente formula nella cella E2:
=FILTER(A2:B5000,DAY(A3:A5001)<DAY(A2:A5000),1)
Questo è tutto; un’unica formula in una singola cella. Potrebbe essere necessario formattare la colonna E per visualizzare correttamente le date, ma questo utilizzo della funzione FILTRO esegue lo stesso confronto già discusso e estrae solo le date ei valori di fine mese. (Questo è abbastanza semplice, se ci pensi.) Ricorda, però, che funzionerà solo in Office 365; non funzionerà in Excel 2019, Excel 2016 o qualsiasi versione precedente del programma.
Se preferisci un approccio basato su macro, la seguente breve macro farà il trucco:
Sub DelRows() Dim LastRow As Long Dim J As Long LastRow = Cells(Rows.Count, "A").End(xlUp).Row LastRow = LastRow - 1 For J = LastRow To 2 Step -1 If Month(Cells(J, 1)) = Month(Cells(J + 1, 1)) Then Rows(J).EntireRow.Delete End If Next J End Sub
La macro determina l’ultima riga nel foglio di lavoro (memorizzata nella variabile LastRow) e quindi utilizza un ciclo For … Next per scorrere le righe all’indietro. Se il mese della riga corrente è uguale al mese della riga successiva, la riga viene eliminata. Nota che la macro diminuisce LastRow prima di saltare nel ciclo For … Next. Questo viene fatto perché si presume che l’ultima riga di dati sarà sempre l’ultimo giorno di negoziazione dei tuoi dati, quindi rimane sempre con i dati ridotti.
Questa macro può essere lenta da eseguire, poiché elimina la maggior parte delle righe nel foglio di lavoro, una per una. Quando sarà completo, tuttavia, ti resteranno solo i dati di fine mese.
Un’ultima nota: gli approcci utilizzati in questo suggerimento sono, ad eccezione della funzione FILTER, distruttivi per i dati. Quando li usi, i dati nel tuo foglio di lavoro andranno persi per sempre. Ciò significa che dovresti pensarci due volte (o tre volte) prima di eseguirli su qualsiasi cosa tranne una copia dei tuoi dati originali.
_Nota: _
Se desideri sapere come utilizzare le macro descritte in questa pagina (o in qualsiasi altra pagina dei siti ExcelTips), ho preparato una pagina speciale che include informazioni utili.
ExcelTips è la tua fonte di formazione economica su Microsoft Excel.
Questo suggerimento (13768) si applica a Microsoft Excel 2007, 2010, 2013, 2016, 2019 e Excel in Office 365.