Condividi:        

MACRO VBA PER DATABASE PAGAMENTI

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

MACRO VBA PER DATABASE PAGAMENTI

Postdi FDM82 » 08/05/18 11:51

Buongiorno a tutti,
ho bisogno del vostro aiuto per il perfezionamento di una macro in vba per un file di registro di pagamenti.
Allego quello che sono riuscito (con estrema fatica, essendone a digiuno") ad elaborare.

http://www.filedropper.com/scadenziariopdr

Nel foglio "pdr" ho elaborato una Macro (INSERISCI PDR) per l'inserimento dei piani di rientro.
Al di sotto un'altra macro mi permette di splittare il pdr nel foglio "db_fdm": in base al n. di effetti indicato, la macro duplica i dati per tante righe quante sono gli effetti.

1 - nel foglio "db_fdm" la colonna B deve restituire un numero progressivo in funzione del numero di effetti che costituisce il pdr (la macro che ho elaborato lo fa ma nel foglio sbagliato! e non riesco a sistemarla!);

2 - nel foglio "db_fdm" la colonna O deve restituire una data progressiva in funzione della prima scadenza indicata nel foglio "pdr" cella O2 (la macro che ho elaborato lo fa ma partendo da un cerca.vert e cmq nel foglio sbagliato! e non riesco a sistemarla!)

Spero possiate essermi di aiuto!

Grazie in anticipo
FDM82
Newbie
 
Post: 3
Iscritto il: 08/05/18 10:14

Sponsor
 

Re: MACRO VBA PER DATABASE PAGAMENTI

Postdi FDM82 » 08/05/18 12:22

Aggiungo un ulteriore problema ... le macro relative alla numerazione progressiva e alle scadenze progressive hanno sicuramente l'errore di ragionare per rage fisso di celle mentre il numero degli effetti è ovviamente una variabile ...
FDM82
Newbie
 
Post: 3
Iscritto il: 08/05/18 10:14

Re: MACRO VBA PER DATABASE PAGAMENTI

Postdi Anthony47 » 09/05/18 00:30

Hummm...
Nel file che hai pubblicato hai inserito le macro "di evento" (es Sub Worksheet_Change e Sub workbook_open) all'interno di "Moduli standard" vba e le macro standard (es Sub Aggiorna) nei Moduli di classe; mi confermi che l'hai fatto solo per confonderci?

Comunque, stai chiedendo aiuto per "il perfezionamento" di una macro. Tuttavia non hai descritto cosa dovrebbe fare questa macro, quindi personalmente non saprei cosa suggerire.

Insomma (oltre ai chiarimenti circa lo strano posizionamento delle macro) dovresti spiegare l'obiettivo complessivo del processo, come hai cominciato a risolverlo e su che cosa ti sei arenato.

Ciao, ti aspettiamo.
Avatar utente
Anthony47
Moderatore
 
Post: 19221
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: MACRO VBA PER DATABASE PAGAMENTI

Postdi FDM82 » 11/05/18 09:57

Buongiorno e grazie per l'interessamento.
gli errori di scrittura sono derivati dal fatto che non essendo pratico di VBA ho provado a fare una scrittura "deduttiva": sono partito da formule già scritte e ho cercato di adattarle alle mie esigenze dopo aver cercato di capirne il funzionamento ...

In questi giorni ho provao a ovviare ai malfunzionamenti delle macro usando formule di excel, per tanto riallego il file riveduto e corretto.

http://www.filedropper.com/scadenziariobozza

Al momento, l'aiuto che chiedo è:

1 - correggere la macro "INSERISCI INCASSO" in modo che quando si apre la maschera per l'inserimento dei dati, vada direttamente al "nuovo", anziché al primo già compilato;
2 - correggere la macro "SPLITTA PDR" in modo che quando compilo nuovi dati nella precedente macro, li accordi ma senza sovrascrivere i pdr già splittati
FDM82
Newbie
 
Post: 3
Iscritto il: 08/05/18 10:14

Re: MACRO VBA PER DATABASE PAGAMENTI

Postdi Anthony47 » 13/05/18 00:33

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 ... ce70609374


La 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=0

La 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
Avatar utente
Anthony47
Moderatore
 
Post: 19221
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "MACRO VBA PER DATABASE PAGAMENTI":


Chi c’è in linea

Visitano il forum: papiriof e 51 ospiti