Copia nella riga vuota successiva - Suggerimenti per Excel

Sommario

Scrive NYARCH

Voglio che Excel copi un'intera riga in un nuovo foglio di lavoro Excel basato su una voce di cella. Ad esempio, ho dati nelle celle A8: AG8, desidero che Excel copi l'intera riga nel foglio "a" se il valore in H8 è "ir" e nel foglio "b" se il valore in H8 è "RR". La parte più complicata e non solo copiata, ho bisogno che venga copiata nella riga vuota successiva del foglio di lavoro. Delle 150 righe circa, solo circa 15 di ciascun tipo verranno effettivamente copiate in un nuovo foglio.

MrExcel assegnerà 50 punti bonus a ogni lettore che ricorda l'articolo di Lotus Magazine che offre 10 ottimi suggerimenti, dove il suggerimento n. 4 era "Usa il tasto Fine per spostarti alla fine di un intervallo". Tornando ai giorni di Lotus, potresti mettere il puntatore di cella ovunque in un blocco di dati, premere FINE e poi giù, e il puntatore di cella andrebbe alla fine dell'intervallo. Excel ha funzionalità simili, VBA ha funzionalità simili e questa è la chiave per trovare l'ultima riga di dati su un foglio.

La tecnica VBA consiste nell'usare End (xlDown) per simulare il tasto End + Down o End (xlUp) per simulare il tasto End + Up. Premendo questa sequenza di tasti si sposterà il puntatore della cella sul bordo successivo di un intervallo di dati contiguo. Immagina che ci siano valori in A1: A10 e A20: A30. Inizia in A1. Premi Fine + Giù e il puntatore della cella si sposta su A10. Premi Fine + Giù e vai su A20, che è il bordo superiore del successivo intervallo di dati contiguo. Premi Fine + Giù e andrai in A30. In realtà non riesco a spiegare questo comportamento in un inglese semplice. Provalo e vedrai come funziona.

Il trucco che uso è iniziare dalla colonna A nell'ultima riga del foglio di calcolo e poi premere Fine + Su. Questo mi porterà all'ultima riga con i dati. Quindi so di usare la riga successiva come riga vuota.

Ecco una macro di forza bruta per risolvere il problema di questa settimana. Sì, potresti certamente farlo in modo più elegante con un filtro automatico. I dati attualmente si trovano sul Foglio1, con le intestazioni nella riga 2.

Public Sub CopyRows() Sheets("Sheet1").Select ' Find the last row of data FinalRow = Range("A65536").End(xlUp).Row ' Loop through each row For x = 2 To FinalRow ' Decide if to copy based on column H ThisValue = Range("H" & x).Value If ThisValue = "ir" Then Range("A" & x & ":AG" & x).Copy Sheets("a").Select NextRow = Range("A65536").End(xlUp).Row + 1 Range("A" & NextRow).Select ActiveSheet.Paste Sheets("Sheet1").Select ElseIf ThisValue = "RR" Then Range("A" & x & ":AG" & x).Copy Sheets("b").Select NextRow = Range("A65536").End(xlUp).Row + 1 Range("A" & NextRow).Select ActiveSheet.Paste Sheets("Sheet1").Select End If Next x End Sub

Dato che Excel 2007 ha più di 65.536 righe, è possibile utilizzare questa macro in modo che sia compatibile con le versioni successive. Nota che utilizzo CELLS (Row, Column) invece di RANGE qui:

Public Sub CopyRows() Sheets("Sheet1").Select ' Find the last row of data FinalRow = Cells(Rows.Count, 1).End(xlUp).Row ' Loop through each row For x = 2 To FinalRow ' Decide if to copy based on column H ThisValue = Cells(x, 8).Value If ThisValue = "ir" Then Cells(x, 1).Resize(1, 33).Copy Sheets("a").Select NextRow = Cells(Rows.Count, 1).End(xlUp).Row + 1 Cells(NextRow, 1).Select ActiveSheet.Paste Sheets("Sheet1").Select ElseIf ThisValue = "RR" Then Cells(x, 1).Resize(1, 33).Copy Sheets("b").Select NextRow = Cells(Rows.Count, 1).End(xlUp).Row + 1 Cells(NextRow, 1).Select ActiveSheet.Paste Sheets("Sheet1").Select End If Next x End Sub

Per suggerimenti su come utilizzare una macro, vedere Introduzione all'editor VBA di Excel.

Articoli interessanti...