Condividi tramite

Copiare le righe sopra e copiarle nella prima cella libera

Anonimo
2012-10-04T15:58:24+00:00

Buon pomeriggio a Tutti

Un altro piccolo quesito, ho questa macro che mi copia il testo delle due righe sopra e me le incolla nella prima cella libera della colonna A. La macro l'ho creata con il registratore; adesso vorrei che sia universale e cioé valida per tutte le righe e non solo per la 5 e 6, cancellando anche i due valori della colonna L e posizionandosi nella prima cella delal colonna L libera.

La macro dovrà partire solo all'attivazione di  CTRL+y, solo se mi trovo nella colonna A con cella libera. 

Sub Copia_due_righe_sopra()

'

' Copia_due_righe_sopra Macro

' Macro registrata il 04/10/2012 da andrea

'

' Scelta rapida da tastiera: CTRL+y

'

Range("A5:N6").Select

Selection.Copy

Range("A7").Select

ActiveSheet.Paste

Range("L7").Select

Application.CutCopyMode = False

Selection.ClearContents

Range("L8").Select

Selection.ClearContents

Range("L7").Select

End Sub

Grazie a tutti e buona serata

A

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2012-10-08T08:06:53+00:00

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

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

15 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2012-10-08T08:29:06+00:00

    Un altro Paladino dei giorni nostri!

    Grazie mille, adesso mi studio per benino tutto quello che mi hai scritto e terrò in giusta considerazione l'uso della guida!

    Buona giornata

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2012-10-07T14:01:03+00:00

    Fantastico

    Grazie mlt

    Provo a capire o meglio interpretare le tue "scritture"

    Sempre che abbia voglia di spiegarmele!

    Mi inchino alla Vostra disponibilità e vi saluto Brava gente (come cantava il grande Ivan Fossati)

    Iubilæum Bolero

    Ciao

    A

    Sub IncollaRighe()

    With Application.ActiveCell

      SULLA CELLA ATTIVA

    If Not .Column = 1 Then Exit Sub

    SE NON SEI SULLA COLONNA UNO NON FA RNIENTE

    If .Value <> Empty Then Exit Sub

     SE IL VALORE NON E' VUOTO, LA CELLA

    If .Offset(-1, 0).Value = Empty _

    Or .Offset(-2, 0).Value = Empty Then _

    QUESTE DUE NON LE CAPISCO

    Exit Sub

    End With

    Dim sh As Worksheet

    Dim lRiga As Long

    IDEM

    Set sh = ThisWorkbook.Worksheets("Inserimento_dati")

    ASSEGNO IL NOME AL FOGLIO

    With sh

    CON IL FOGLIO

    lRiga = .Cells(.Rows.Count, 1).End(xlUp).Row

    .Range(.Cells(lRiga + 1, 1), .Cells(lRiga + 2, 14)).Value = _

    Application.ActiveCell.Offset(-2, 0).Resize(2, 14).Value

    With Application.ActiveCell

    .Offset(0, 11).Resize(2, 1).ClearContents

    .Offset(0, 11).Select

    QUESTE 6 SOPRA LE CAPISCO POCO

    End With

    FINE DELLA CONDIZIONE WITH

    End With

    FINE DELLA CONDIZIONE WITH

    Set sh = Nothing

    ESCO DALLA MACRO? DALLA RIPETIZIONE DELLA STESSA?

    End Sub

    FINE MACRO

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2012-10-05T07:55:12+00:00

    L'ho provata velocemente e sembra funzionare alla Grande!! Più tardi lo verifico meglio

    Se non ci foste dovrebbero InventarVi!! Grazie per ora poi confermo

    Buona giornata

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2012-10-04T19:52:42+00:00

    Ciao Andrea,

    se ho capito correttamente la tua esigenza, prova così:


    Sub IncollaRighe()

        With Application.ActiveCell

            If Not .Column = 1 Then Exit Sub

            If .Value <> Empty Then Exit Sub

            If .Offset(-1, 0).Value = Empty _

                Or .Offset(-2, 0).Value = Empty Then _

                Exit Sub

        End With

        Dim sh As Worksheet

        Dim lRiga As Long

        Set sh = ThisWorkbook.Worksheets("Foglio1")

        With sh

            lRiga = .Cells(.Rows.Count, 1).End(xlUp).Row

            .Range(.Cells(lRiga + 1, 1), .Cells(lRiga + 2, 14)).Value = _

                Application.ActiveCell.Offset(-2, 0).Resize(2, 14).Value

            With Application.ActiveCell

                .Offset(0, 11).Resize(2, 1).ClearContents

                .Offset(0, 11).Select

            End With

        End With

        Set sh = Nothing

    End Sub


    per l'attribuzione dello shortcut da tastiera: Alt+F8, seleziona la macro, poi scegli il pusante opzioni. Nella maschera che si apre puoi attribuire la scorciatoia y per attivare la macro.

    David

    La risposta è stata utile?

    0 commenti Nessun commento