Capisco che tu sai benissimo di cosa parli, ma noi ultimamente ci siamo occupati di cose diverse e quindi facciamo fatica a seguirti...
Comunque, la prima richiesta mi pare si possa tradurre in:
-sul foglio "pannello" c'e' un pulsante "Inserisci Incasso", che avvia l'inserimento su foglio "PDR" di nuove righe di dati. Vorresti che i nuovi record inseriti si accodino automaticamente ai precedenti
A me pare che questo sia gia' fatto, se rispetti il modo di funzionamento del "modulo dati", che viene visualizzato tramite Macro2 quando premi il pulsante "Inserisci incasso":
lo strumento "modulo dati" ti consente di
esaminare i record presenti (modalita' di default; la barra di scorrimento ti consente di scorrere i record presenti); di
modificarli (selezioni un record, modifichi il campo /i campi che ti interessa /interessani; premi Enter); di
cercare (immettere uno o piu' criteri, cercare il precedente o il successivo); di
inserire un nuovo record (si preme "Nuovo", si inseriscono i campi; si preme Enter). Quando hai finito col "modulo dati" chiudilo con... "Chiudi".
Per informazioni sul "modulo dati" guarda questo articolo Microsoft:
https://support.office.com/it-it/articl ... ce70609374La seconda richiesta la traduco in:
-sul foglio PDR e' presente un pulsante "SPLITTA PDR" a cui e' assegnata la Sub Aggiorna inserita nel modulo vba di Foglio5
L'obiettivo di questa macro e' di "lavorare" tutte le singole righe presenti sul foglio PDR, inserendole sul foglio "db_fdm" come tante righe quante indicate in colonna B (NR EFFETTI); purtroppo la macro attuale (Sub Aggiorna) crea sì tante righe, ma non le posiziona correttamente in coda all'elenco gia' presente nel foglio di destinazione (db_fdm). Inoltre non riesce a individuare pratiche gia' posizionate su db_fdm.
Sarebbe anche necessario svincolare i dati del foglio db_fdm dal contenuto del foglio PDR, in modo che si possa procedere senza problemi all'eventuale cancellazione del contenuto di PDR.Supponiamo che questo sia vero (e ovviamente avrei voluto che queste cose le avessi spiegate tu, usando il tuo tempo e la tua conoscenza del tuo processo); prima di suggerire come indirizzare la questione mi preme farti notare che hai creato un file da 16 Mbyte per una cinquantina di righe di dati (capisco che 50 righe sono solo dimostrative, ma per 16 MB mi sarei aspettato di trovare decine di migliaia di righe).
Questa enormita' di spazio occupato e' data dal fatto che hai creato un file che contiene formule e formattazioni dalla riga 2 alla riga ultima, cioe' oltre 1 milione di righe.
Tutto questo e' ovviamente inutile, anzi dannoso in termini di performance e occupazione spazio.
Il modo piu' efficace di risolvere questo fatto e' di trasformare, nel foglio db_fdm, i dati presenti in una "struttura tabella"; questa struttura ha il pregio che le caratteristiche delle celle (formattazione, formule) si propagano automaticamente sulle nuove righe aggiunte, risparmiandoci di metterne in abbondanza (fino all'ultima riga, nella tua interpretazione).
In modo dimostrativo, ho trasformato in "tabella" del range A1:AC62 (selezionato intervallo; Menu /Inserisci /Tabella, tabella con intestazioni); poi ho eliminato le righe da 63 fino all'ultima. Il nome che Excel ha assegnato alla tabelle e' Tabella1, ma eventualmente puo' essere modificato.
Il file cosi' composto ora occupa circa 60 Kbyte
Possiamo ora passare alla risoluzione del problema, che ora ha una complicazione in piu': prima di copiare le N righe prodotte dallo splittamento bisognera' preventivamente allungare la tabella di N righe.
Cio' detto, possiamo utilizzare una macro come questa:
- Codice: Seleziona tutto
Sub AggiornaTab()
Dim uRiga As Long
Dim iRow As Long
Dim Sh1 As Worksheet
Dim Sh2 As Worksheet
Dim myNext As Long, cRan As String
'
Set Sh1 = Sheets("pdr")
Set Sh2 = Sheets("db_fdm")
uRiga = Sh1.Cells(Rows.Count, 1).End(xlUp).Row
'
For iRow = 2 To uRiga
'Controlla se la "pratica" esiste gia' in db_fdm:
If Application.WorksheetFunction.CountIf(Sh2.ListObjects("Tabella1").ListColumns(5).Range, Sh1.Cells(iRow, 5)) = 0 Then
With Sh2.ListObjects("Tabella1")
'Allunga la struttura tabella:
cRan = .Range.Address
.Resize Range(cRan).Resize(Range(cRan).Rows.Count + Sh1.Cells(iRow, 2))
'Determina prima riga libera:
myNext = Sh2.Range("Tabella1").Cells(1, 3).End(xlDown).Row + 1
'Copia N record in db_fdm:
Sh1.Cells(iRow, 3).Resize(1, 8).Copy Sh2.Cells(myNext, 3).Resize(Sh1.Cells(iRow, 2), 1)
'Copia la data sul primo record:
Sh1.Cells(iRow, "K").Copy Sh2.Cells(myNext, "K")
End With
End If
Next iRow
'
End Sub
Nel file dimostrativo che ho preparato questa macro e' inserita in Modulo1 ed e' gia' agganciata al pulsante "SPLITTA PDR" presente sul foglio db_fdm
Il foglio dimostrativo e' scaricabile qui:
https://www.dropbox.com/s/mogcqcebxbydu ... .xlsm?dl=0La Sub Aggiorna inserita sul modulo vba di Foglio5 (pdr) puo' essere cancellata.
Tutte le macro "di evento" presenti sui Moduli standard del vba (vedi Modulo11, Modulo2 e Modulo3) non sono utilizzabili e possono essere cancellate. Le macro "di evento" vanno infatti inserite nel moduli vba del rispettivo oggetto a cui si riferiscono (il Foglioxx, oppure Questa_cartella_di_lavoro).
Ciao