Un'altra procedura per copiare/incollare.

Utilizzo: Copia/Incolla con ricerca della prima riga libera per incollare.

Questa procedura è meno complessa della precedente, ed è documentata in parte su Excel. 

Riguarda la proprietà End. Riporto la spiegazione che ne dà la guida in linea: Proprietà End
Restituisce un oggetto Range che rappresenta la cella alla fine dell'area contenente l'intervallo di origine. Equivale a premere FINE+ FRECCIA SU, FINE+ FRECCIA GIÙ, FINE+ FRECCIA SINISTRA o FINE+ FRECCIA DESTRA. Proprietà di tipo Range di sola lettura.
espressione.End(Direction)
espressione: Argomento necessario. Un'espressione che restituisce un oggetto nell'elenco Si applica a
Direction : Argomento necessario di tipo XlDirection. Specifica la direzione dello spostamento.
XlDirection può essere una delle seguenti costanti XlDirection.
xlDown       'direzione giù
xlToRight    'direzione a destra
xlToLeft      'direzione a sinistra
xlUp           'direzione su

Esempio
Questo esempio seleziona la prima cella (la B1) della colonna B nell'area contenente la cella B4.
Range("B4").End(xlUp).Select
se le celle fossero vuote, altrimenti se per esempio la cella B3 fosse occupata con un valore, l'istruzione avrebbe fatto fermare la selezione a questa cella. Quindi si può dire che End Select viene usata per rintracciare la prima cella occupata, data una cella di partenza e con la direzione desiderata. Nel caso che nessuna cella sia occupata, verrà selezionata l'ultima cella del foglio. (verso dx. sx, su o giù).


Ed ecco invece l'istruzione usata per incollare dei dati, sfruttando la succitata proprietà End, ma per trovare la prima riga libera dove "scaricare" i dati. Supponiamo quindi di avere un foglio, che chiameremo "Archivio", nel quale vorremo "incollare" dei dati provenienti da un altro foglio. Decideremo che i dati verranno inseriti a partire dalla colonna A. In genere sceglieremo la prima cella del foglio, la A1, per iniziare a formare il nostro archivio. Solo che dovremo usare un accorgimento, per evitare che se nell'istruzione usiamo la cella A1 come inizio di selezione, non ci ritroviamo ad avere l'ultima cella del foglio come cella individuata dell'istruzione Selection.End(xlDown).Select  (infatti il comando porterebbe, non trovando celle occupate, alla fine del foglio). L'accorgimento consiste nel tenere le prime due celle A1 e A2 occupate, con un qualsiasi valore, tipo un intestazione colonna, e indicare nel codice a questo punto la cella A1 come cella da selezionare per iniziare il ciclo. Poichè l'istruzione ora si fermerebbe alla cella A2, e noi invece cerchiamo una riga vuota, aggiungiamo l'istruzione "Offset" che sposta la selezione sulla cella sottostante, la A3 (vuota), e qui avviene l'incollaggio. Ripetendo il ciclo, troveremo sempre l'ultima cella e la successiva libera. Questo è il codice:

Sub CopiaIncolla2()
 Worksheets("Archivio").Select
Range("A1").Select
'bisogna fargli trovare 2 celle occupate la A1 e la A2,
'altrimenti l'istruzione seguente porterebbe alla fine del
'foglio generando un errore per via dell'istruzione Offset

'successiva.
Selection.End(xlDown).Select
ActiveCell.Offset(1, 0).Select 
'mi sposto alla successiva che è libera

'incollo i dati.
With ActiveCell
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End With

'esco
End Sub
 

oppure sfruttando la direzione su (xlUp) ma iniziando dall'ultima riga del foglio (la riga 65536), il vantaggio rispetto all'uso della costante per la direzione giù (xlDown) è che NON occorre far trovare nessuna cella occupata dal Range inziale; come controindicazione è che non è possibile usare questa costante se sotto alla tabella di cui cerchiamo la riga libera esistono tabelle successive che quindi indurrebbero a trovare righe non pertinenti l'intervallo che interessa; comunque una variante è questa:

Sub CopiaIncolla3()
Worksheets("Archivio").Select

'ora con xlUp troviamo l'ultima cella occupata della colonna A; poichè abbiamo 'bisogno di incollare nella cella immediatamente sotto che è liberà, usiamo Offset 'per spostarci e selezionare detta cella libera, in unica istruzione:
Range("A65536").End(xlUp).Offset(1, 0).Select

'e ora incollo i dati.
With ActiveCell
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End With

'esco
End Sub