macro per inserire riga vuota in tabella non formattata

Anonimo
2018-04-18T09:02:59+00:00

Buongiorno,

Avrei un quesito da esporvi.

Io uso excel 2007 ed ho un file con una tabella non formattata.

Questa tabella la riempio con una macro di inserimento dati e fin qui tutto bene.

La mia macro trova la prima riga vuota della tabella non formattata e lì va ad inserire i miei dati.

Visto che in fondo alla tabella ho impostato le formule coi totali, per permettere alla macro di trovare la riga dove inserire,

ho fatto in modo che la tabella in questione contenesse un sacco di righe vuote. Così facendo, però,

il file si è appesantito un bel pò. Io vorrei togliere le righe vuote. A quel punto mi servirebbe una macro che

mi vada ad aggiungere una riga vuota compresa tra quella degl'ultimi dati inseriti e quella dei totali.

So che potrei risolvere il problema formattando la tabella e usando questo codice per inserire la riga vuota

Sub AGGIUNGI_RIGA_FINALE()

Dim ws As Worksheet

Set ws = ActiveSheet

Dim tbl As ListObject

Set tbl = ws.ListObjects("miatabella")

tbl.ListRows.Add

End Sub

Tuttavia, proprio perché desidero ridurre il peso e snellire il mio file, vorrei evitare di formattare la tabella (che già adesso contiene tanti dati ed è destinata a crescere).

Grazie in anticipo per la disponibilità

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
2018-04-18T16:02:20+00:00

Ciao Luigi,

Non va comunque, ma ho capito il perché.

Nel tuo esempio, nella riga dei totali, la cella A è piena. Così facendo funziona.

Nel mio file, nella riga dei totali, la cella A è vuota. Prova, infatti, a spostare quel

"Peso Totale" da A110 a B110 dopodiché lancia macro. Vedrai che la riga vuota verrà

creata alla 108 anziché alla 109. Comunque, l'importante era capire l'inghippo. In pratica devo

fare in modo che la cella A della riga dei totali sia piena. 

Per superare il problema, modifica l'istruzione:

      LRow = LastRow(SH, .Columns("A:A"))

con:

        LRow = LastRow(SH, .Columns("D:D"))

dove la colonna D restituisce l''ultima cella di interesse.

===

Regards,

Norman

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2018-04-18T15:20:01+00:00

Ciao Luigi,

Evidentemente non mi ero fatto capire e te ne chiedo scusa.

Nella seconda immagine che mi hai postato si vede esattamente ciò che accade a me quando lancio la tua macro. Quest'ultima crea una riga vuota "prima dell'ultima riga popolata" (per dirla alla tua maniera). Ebbene, a me non serve questo. Nel mio file la riga dei totali è immediamente dopo "l'ultima riga popolata". Attenendomi alla prima delle due immagini da te postate, è come se da me i totali fossero alla riga 109 (anziché alla 111); mentre alla 108 c'è l'ultima riga contenente dati (o popolata come dir si voglia). Io vorrei che la riga vuota fosse creata alla 109 e che quella dei totali scalasse alla 110 mentre l'ultima popolata dovrebbe restare alla 108. A quel punto, in fondo alla tua macro, col comando Call, io richiamo la mia (macro) per inserire i dati. In questo modo, essi vanno a mettersi nella riga vuota creata un attimo prima. 

Vabbene, proviamo il codice suggerito da me nella mia prima risposta!!

Cominciamo con la configurazione di dati enunciata da te qui sopra, ossia:

    ultima riga contenente dati =108

    riga con totali = 109

        

Eseguendo la prima versione del mio codice ottengo:

       

In questo modo credo che abbia ottento precisamente ciò richiesto da te. ovvero:

Io vorrei che la riga vuota fosse creata alla 109 e che quella dei totali scalasse alla 110 mentre l'ultima popolata dovrebbe restare alla 108.

Adesso dunque, che ne dici?

Potresti scaricare il mio file di prova Luigi20180418.xlsm

===

Regards,

Norman

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2018-04-18T09:57:49+00:00

Ciao Luca,

per questo motivo dicevo di tenere nascosta la riga.

Volendo si potrebbe anche pensare ad una procedura che inibisca la compilazione nelle celle di quella riga tramite l'evento change o selectionchange (in modo da rendere impossibile che le celle di quella riga vengano selezionate).

edit:

ad esempio inserendo nel modulo di classe del foglio di lavoro questo codice si impedisce la selezione di quella riga:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

   If Target.Row = Me.Range("RigaFormule").Offset(-1).Row Then Target.Offset(-1).Select

End Sub

In questo modo non è possibile compilare le celle di quella intera riga.

La risposta è stata utile?

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

13 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2018-04-18T09:44:21+00:00

    Ciao Casanmaner,

    Innanzitutto ti ringrazio per la cortese e celere risposta.

    Stavo pensando anch'io ad una soluzione del genere che è un buon modo per bypassare il problema.

    Tuttavia ha un inconveniente non da poco: dev'esserci sempre almeno una riga vuota prima di quella dei totali.

    Se qualcuno la riempisse manualmente, il tutto non funzionerebbe più correttamente. Ebbene, il file in questione non lo uso solo io e in futuro potrebbe aggiungersi qualcun altro. In mancanza di alternative adotterò questo sistema. Intanto aspetto altri eventuali suggerimenti.

    Ti ringrazio della disponibilità accordatami

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2018-04-18T09:30:19+00:00

    Ciao Luca,

    tra le varie possibilità una potrebbe essere questa.

    In corrispondenza di una cella della riga delle formule assegnare un nome, anche a livello di foglio, per avere un punto di riferimento non legato all'indirizzo delle celle che varierebbe.

    Mantenere una riga sempre vuota immediatamente precedente alle formule, in modo che non sia necessario, tramite vba, aggiornare tutte le formule le quali potranno avere come margine inferiore la riga che si andrà a nascondere.

    Tramite VBA inserire una riga immediatamente precedente alla riga "vuota".

    Qui trovi un file di esempio: File Esempio

    Nell'esempio in corrispondenza della prima cella delle formule ho assegnato il nome, a livello di foglio, RigaFormule.

    La riga con sfondo giallo rappresenterebbe la riga vuota da tenere nascosta.

    Nelle formule (ho usato la somma) il riferimento parte dalla prima cella dopo le intestazioni fino alla riga vuota da nascondere.

    Le celle con sfondo azzurro sarebbero quelle da "riempire" con i tuoi dati.

    Nel modulo1 ho inserito questo codice:

    Option Explicit

    Sub InserisciRiga()

       Const sNomeFoglio As String = "Foglio1"

       With ThisWorkbook

          With .Worksheets(sNomeFoglio)

             With .Range("RigaFormule")

                .Offset(-1).EntireRow.Insert

             End With

          End With

       End With

    End Sub

    Il codice inserisce una riga intera prima della riga "vuota" e da utilizzare come "ultima riga" di inserimento dati.

    Prova a vedere se una soluzione del genere, da adattare al tuo caso specifico, può soddisfare la tua esigenza.

    ciao

    La risposta è stata utile?

    0 commenti Nessun commento