Una famiglia di software per fogli di calcolo Microsoft con strumenti per l'analisi, la creazione di grafici e la comunicazione dei dati.
Ciao,
ti aggiungo dei commenti passo passo. Per ulteriori approfondimenti ti consiglio però di utilizzare l'help in linea di VBA, risorsa troppo spesso sottovalutata.
Rispetto alla precedente ho aggiunto un'ulteriore riga di verifica
If Not .Row > 3 Then Exit Sub
in quanto, se ipotizziamo che in riga 1 ci sono i titoli allora se mi trovo in riga 3 e lancio la macro, finirei per copiare i titoli.
Sub IncollaRighe()
With Application.ActiveCell
'Se la cella corrente non si trova nell'ambito della colonna A esco dalla macro
If Not .Column = 1 Then Exit Sub
If .Value <> Empty Then Exit Sub
'Se la riga relativa alla cella corrente non è maggiore di 3 esco dalla macro
'questo perchè se ipotizzo di trovarmi nella riga 3 della colonna A e la
'cella è vuota, finirei per copiare la riga 2 e la riga 1. Quest'ultima, ipotizzo
'dovrebbe contenere i titoli.
If Not .Row > 3 Then Exit Sub
'Se una delle celle A delle due righe superiori è vuota, esco dalla macro
'Non conosco il tuo foglio e quindi ho ipotizzato che se la cella A è vuota
'l'intera riga non debba essere replicata
If .Offset(-1, 0).Value = Empty _
Or .Offset(-2, 0).Value = Empty Then _
Exit Sub
End With
'Dichiaro le variabili che mi servono per la macro
Dim sh As Worksheet
Dim lRiga As Long
'Assegno alla variabile oggetto il puntatore al foglio1 della cartella di lavoro
'da cui sto eseguendo la macro
Set sh = ThisWorkbook.Worksheets("Foglio1")
'con riferimento alla variabile oggetto appena creata, e quindi
'con riferimento al foglio1 della cartella di lavoro
With sh
'determino l'ultima riga "piena" della colonna A
lRiga = .Cells(.Rows.Count, 1).End(xlUp).Row
'L'istruzione che segue è un'alternativa al Copy and Past:
'.Range(.Cells(lRiga + 1, 1), .Cells(lRiga + 2, 14)).Value
'in sostanza sto dicendo che il valore delle due righe che si trovano
'subito sotto l'ultima riga "piena", ovvero
'.Range(.Cells(lRiga + 1, 1), .Cells(lRiga + 2, 14)).Value
'debbono essere = al valore delle due righe soprastanti la riga
'relativa alla cella attuale, ovvero:
'Application.ActiveCell.Offset(-2, 0).Resize(2, 14).Value
'Offset mi fa spostare dalla cella attuale di due righe sopra (-2) e di
'nessuna colonn a(,0), Resize(2,14) ridimensiona il range il range attuale
'riferito alla solo cella Axx in modo da farlo diventare di 2 righe e 14 colonne.
.Range(.Cells(lRiga + 1, 1), .Cells(lRiga + 2, 14)).Value = _
Application.ActiveCell.Offset(-2, 0).Resize(2, 14).Value
With Application.ActiveCell
'A questo punto rispetto alla cella attuale mi sposto di 11 colonne
'per posizionarmi nella cella Lxx da cancellare e ridimensiono il range
'in modo da eliminare 2 righe --> .Resize(2,1)
.Offset(0, 11).Resize(2, 1).ClearContents
'Seleziono la prima cella Lxx delle due righe appena copiate
.Offset(0, 11).Select
End With
End With
'Elimino, distruggendola la variabie oggetto creata
'liberando la memoria. In venerale questa istruzione non
'è obbligatoria in quanto VBA provvede a questa operazione
'automaticamente. Tuttavia è una pratica estremamente
'consigliata e consigliabile
Set sh = Nothing
End Sub
Tieni conto che lo stesso effetto, lo potresti ottenere con quest'altra macro
Sub IncollaRighe()
With Application.ActiveCell
If Not .Column = 1 Then Exit Sub
If .Value <> Empty Then Exit Sub
If Not .Row > 3 Then Exit Sub
If .Offset(-1, 0).Value = Empty _
Or .Offset(-2, 0).Value = Empty Then _
Exit Sub
.Resize(2, 14).Value = .Offset(-2, 0).Resize(2, 14).Value
.Offset(0, 11).Resize(2, 1).ClearContents
.Offset(0, 11).Select
End With
End Sub
David