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-16T12:39:02+00:00

    Ciao,

    prova così:

    • nell'editor vba inserisci un nuovo modulo standard e copiaci dentro:

    Public Sub m()

        UserForm1.Show vbModeless

    End Sub

    Public Sub SelectionChange(ByVal Sh As Object, ByVal Target As Range)

        If Target.Cells.Count > 1 Then Exit Sub

        Dim lRiga As Long

        With Sh

            If Not IsEmpty(Target.Value) Then

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

                .Cells(lRiga, Target.Column).Value = "ciao io scrivo in ogni foglio :D"

            End If

        End With

    End Sub


    poi nell'evento click del tuo pulsante inserisci:


    Private Sub CommandButton1_Click()

        Call SelectionChange(Application.ActiveSheet, Application.Selection)

    End Sub


    poi torna al foglio Excel e con Alt + F8 visualizza la finestra relativa alle macro. Seleziona la macro m e clicca su opzioni. Nella finestra che si apre potrai impostare la lettera a come scorciatoia da tastiera (insieme a Control) per aprire la tua maschera.

    P.S.: OP non è un offesa!!! :-)))  E' un acronimo che significa Origina Poster ovvero colui che ha posto la domanda iniziale

    David

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2012-11-16T12:15:29+00:00

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

     Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    ...    

    End Sub

    Ciao e grazie,

    l'ho inserito quì *gestione colonne-2012-11-15*e funziona egregiamente (non avevo dubbi) :D

    ...ora però non riesco più ad aprire il form (ctrl+a) che contiene il filtro che richiama il tuo precedente codice che gestisce le colonne... per quale motivo?

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

    Quindi dici che se io voglio legare il codice che mi porta nella prima cella vuota della colonna B (senza scrivere più nulla questa volta), dovrei usare l'evento click di un nuovo pulsante e incollargli dentro il codice che mi avete suggerito? ... io credevo di sì ed ho provato (sempre nel file gestione colonne-2012-11-15) ma (ovviamente) non sono riuscito a farlo partire ... :( sob 

    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.

    ... lo sò benissimo, non credere che non ve ne sia VERAMENTE grato (sia degli aiuti che della pazienza che dimostrate ogni volta nei miei confronti), e certamente non pretendo nulla, solo ... io ci spero (non mi vorrai mica togliere la speranza vero? ;P)

    PS: "Chissà cosa vuole realmente l'OP... ;-)" cosa significa "OP"?

    grazie ancora e a presto :D

    ... continua ...

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2012-11-16T09:01:16+00:00

    Ciao Reggio,

    provo a rispondere, almeno in parte, alle tue domande:

    • xls Vs xlsx: la tua intuizione è corretta. Il formato xls è un formato binario che prevede la possibilità di inserire macro nel file excel. E' il formato predefinito fino alla versione 2003. Dalla versione 2007 in avanti il formato predefinito per file non contenenti codice è xlsx mentre per quelli contenente codice è xlsm.
    • utilizzo del codice: la differenza tra il codice che ti ho indicato io e quello indicato da Mauro è che Mauro prevede la possibilità di riutilizzare delle righe vuote che si trovino in mezzo alla tua tabella. Nel mio codice invece vai sempre e comunque alla prima riga vuota che si trova in fondo alla tabella. Nel caso fosse più attinente alle tue esigenze puoi tranquillamente utilizzare la soluzione di Mauro.

    Nel caso tu volessi utilizzare la mia seconda macro (quindi a livello di cartella di lavoro) il secondo codice Private Sub Workbook_SheetSelectionChange .... e quanto segue va inserito nel modulo di classe relativo alla cartella di lavoro e quindi, all'interno dell'editor VBA sotto "Microsoft Excel Oggetti", tasto dx su ThisWorkbook (o Questa_cartella_di_lavoro se usi Excel 2010), visualizza codice, incolla codice. Ovviamente se scegli questa strada elimina il codice della prima macro nel foglio1.

    • interpretazione del codice: spiegare la procedura riga per riga diventa estremamente lunga. Io direi che la lettura di un libro che affronti i temi fondamentali del VBA possa risolvere il 90% delle domande che hai posto e metterti di conseguenza in grado di capire, eventualmente modificare, e quindi utilizzare consapevolmente il codice che ti viene suggerito.

    In merito all'ultima domanda: come faccio a legare l'intero evento al bottone "Inserisci nuovo TIPO" (form1)?, non riesco a trovare il file con la maschera. Puoi ripostare il link?

    David

    La risposta è stata utile?

    0 commenti Nessun commento