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-11-16T09:00:40+00:00

    RIASSUNTO DELLE PUNTATE PRECEDENTI E SCOPO:

    <cut>

    Ora, mi direste come faccio a legare l'intero evento al bottone "Inserisci nuovo TIPO" (form1)?

    Non ho capito quasi nulla.

    Se vuoi scrivere nella prima riga vuota sotto a quella sulla quale hai fatto click:

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)

        Dim lRiga As Long

        With Target

            If .Cells.Count > 1 Then Exit Sub

            If .Value = "" Then Exit Sub

            lRiga = Me.Cells(.Row, .Column).End(xlDown).Row

            If lRiga = Me.Rows.Count Then

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

            Else

                lRiga = Me.Cells(.Row, .Column).End(xlDown).Row + 1

            End If

            Me.Cells(lRiga, .Column).Value = "Ciao amico"

        End With

    End Sub

    E comunque l'evento SelectionChange, si scatena quando selezioni una o più celle.

    Ti ricordo che il forum nasce per risolvere *piccoli problemi* relativi ad Excel e al suo vb, non per costruire da zero intere applicazioni e che tutto è lasciato alla buona volontà di chi gratuitamente da il suo contributo qui.

    Grazie.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2012-11-15T20:07:55+00:00

    RIASSUNTO DELLE PUNTATE PRECEDENTI E SCOPO:

    Lo scopo finale che mi sarei prefisso, è quello di completare il foglio di calcolo iniziato e portato avanti con/da MAURO e ora ancora parzialmente in standby che trovate quì

    "Filtrare anche le colonne o nascondere alcune colonne" e che vi invito a visitare e a lasciare un vostro gradito contributo ;P

    Cosa ci faccio quì?

    A parte le cose che ho provato a spiegare/chiedere laggiù, volevo aggiungere la possibilità di avere un bottone "Inserisci nuova riga" che, da qualunque cella mi portasse direttamente alla prima riga LIBERA per poter inserire i dati ... pensavo fosse più semplice per mè, ma come vedete mi stò perdendo in un bicchiere d'acqua ...

    Ora vediamo se riesco ad uscirne non troppo bagnato ;P

    Perchè ci sono rimasto male quando excel mi ha chiesto di salvare come xlsm?

    Perchè se guardate l'esempio allegato all'altro post di cui sopra, vedrete che MAURO ha inserito un codice VBA in un file excel NON xlsm (ho fatto caso solo poco fà che si tratta di xls)...

    Presumo quindi che la richiesta (lo ammetto, non ho letto "What’s the Difference Between VBA and a Macro?" in Inglese non ce la potevo fare...) di excel di salvare come xlsm appaia solo se inserisco macro o vba in file xlsx (cosa che mi riguarda perchè vorrei utilizzare la maggiore disponibilità di righe/colonne di xlsx) quindi in definitiva credo andrà a salvare tutto come xlsm.

    Cosa ho fatto finora?

    Ho inserito il 1° codice di DAVID nel file dell'altro post (l'ho appena aggiornato),

    sotto "Microsoft excel oggetti", tasto dx su foglio1, visualizza codice, incolla codice.

    (per ora ho provato quello di DAVID e non quello di MAURO perchè mi sembra più semplice e corto e sopratutto per quel "Scritta qui e non testata." che mi ha spaventato... già non ci capisco nulla, se ragiono su un codice potenzialmente sbagliato impazzisco.. ;P )

    Poi ho salvato e sono tornato in excel su foglio1 ed ho visto che FUNZIONA!!! :D

    Ho poi provato ad incollare anche il 2° codice di DAVID "se invece vuoi lavorare a livello di cartella di lavoro", per questo, ho pensato bene, visto che si tratta di un codice valido per tutti i fogli di excel, di dover inserire/modulo con il tasto DX su "Microsoft excel oggetti",

    ho quindi incollato ma in questo caso non ho visto nessuna cambiamento... (e non ho capito il perchè ...????).

    Vediamo se ho capito quello che ho copiato?

    Provo a tradurre:

    Private Sub???

    Worksheet_SelectionChange=[il codice che segue si accende quando nel worksheet cambia qualcosa]

    (ByVal Target As Range)????        If Target.Count > 1 Then Exit Sub=[se nella cella target c'è qlc maggiore di 1, insomma c'è qualcosa che la occupa allora esci dalla procedura??? perchè esci?]

    Dim lRiga As Long=[la variabile lriga è di tipo AS LONG - perchè?]

    With Me???

    If Not IsEmpty(Target.Value) Then=[se la cella selezionata non è vuota, allora]

    lRiga = .Cells(.Rows.Count, Target.Column).End(xlUp).Row + 1=[lRiga è uguale al comando ctrl+freccia giù della stessa colonna a cui aggiungi una riga in piu (+1)]

    .Cells(lRiga, Target.Column).Value = "ciao amico"=[adesso nella cella che è stata scritta nella variabile lRiga puoi scrivere "ciao amico"]

    End If=[fine]

    End With=[fine]

    End Sub=[fine]

    ....

    Ora, mi direste come faccio a legare l'intero evento al bottone "Inserisci nuovo TIPO" (form1)?

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2012-11-15T08:52:04+00:00

    Ciao Reggio

    i formato xlsx, a differenza del formato xlsm, non contiene codice vba, quindi per poter salvare un file che contenga codice, di qualsiasi natura, devi necessariamente scegliere il formato xlsm, che, nella finestra di salvataggio viene definito da Excel stesso "Cartella di lavoro con attivazione macro di Excel"

    Detto questo, se vuoi una spiegazione dotta della differenza tra Macro e Vba puoi riferirti a questo articolo MSDN: **What’s the Difference Between VBA and a Macro?**

    Nello specifico il codice che abbiamo riportato Mauro ed io fa riferimento ad un evento del foglio di lavoro ovvero all'evento che si scatena nel momento in cui cambia una selezione di celle all'interno del foglio (ti sposti di cella):

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    Per poter funzionare devi quindi copiare l'intero evento e incollarlo nel modulo di classe relativo al foglio che ti interessa e non in un modulo standard deputato invece ad accogliere procedure (sub o function).

    A quel punto non devi essere tu a lanciare il codice ma sarà il foglio stesso nel momento in cui ti sposti di cella, a scatenare l'evento SelectionChange e quindi a mandare in esecuzione il codice in esso contenuto.

    David

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2012-11-14T23:03:27+00:00

    Ciao e grazie a tutti, scusatemi per il ritardo...

    Ho recuperato solo ora il mio notebook ed ho provato ad aprire un nuovo file excel.xlsx

    e, dopo aver premuto ALT+F11 ed aver INSERITO NUOVO MODULO e quindi incollato il vs codice, mi sono accorto della mia profonda impreparazione.... :

    1. Quando vado per salvare, excel mi chiede di salvare in xlsm (cosa che con i vs esempi passati non era necessario se volevo far funzionare una routine vba, ma lo chiedeva solo per file contenenti macro che in questo caso non vi sono)
    2. Non sò come lanciare quel codice, pensavo bastasse premere CTRL+a ma vedo che così non è... ho anche provato a creare un bottone ma mi sono accorto di non essere in grado di legare la cs procedura al mio bottone...

    Insomma un disastro... :( pensavo di aver capito qlc ma mi accorgo di essere ancora molto acerbo...

    Mi date un altra spinta ancora?

    La risposta è stata utile?

    0 commenti Nessun commento