Macro per stampare ricevute di condominio

niknes

Utente junior
3 Marzo 2017
22
1
53
Bari
Excel 2013
0
Buongiorno a tutti.
Avrei bisogno del Vs prezioso aiuto per risolvere il mio problema. Sto cercando di creare un piccolo file che mi permetta di impostare delle ricevute di condominio per poi stamparle.
Il file l'ho già impostato partendo da un vecchio mio file per la stampa dei documenti di trasporto, a mezzo destinatario o vettore, ma non mi funziona bene perchè non ho modificato bene le macro inserite.
Nello specifico avrei bisogno che cliccando sul pulsante "Stampa"
  1. si aggiorni il numero progressivo della ricevuta (G2) prendendo il riferimento dall'ultima registrata sulla scheda "registro";
  2. il totale dell'importo incassato (C17), espresso in cifre, si aggiorni, nell'apposito campo (F17) in lettere
  3. tutti i dati della ricevuta (nome condomino, n° villa, data, importo, causale.........) vengano registrati automaticamente nella scheda "registro" nelle apposite colonne
  4. Tutte queste operazioni debbano avvenire cliccando il pulsante "Stampa" già presente. Non saprei se è possibile assegnare ad un solo pulsante più macro, o creare un'unica macro.
Allego il file che ho creato. Sicuramente troverete tracce del vecchio progetto.
Grazie in anticipo a chi vorrà perderci un pò di tempo.
Saluti
Nico
 

Allegati

Ultima modifica di un moderatore:

Marius44

VBA Expert
Moderatore
9 Settembre 2015
7.559
145
77
Catania
Excel2010
364
Ciao nicknes
a mio avviso non "mastichi" molto di VBA (ma anche di Excel).

Perchè dico questo? Per i seguenti motivi:
- se vi sono "grandi" differenze (e fra un DDT e una Ricevuta ci sono, eccome) fra un programma ed un altro, non si tenta di "adattarlo", si compila nuovo;
- se cerchi di adattare una macro NON puoi lasciare riferimenti al precedente lavoro e NEPPURE una macro senza End Sub;
- non ha senso lasciare dei Moduli di VBA in bianco

E adesso veniamo alla "tua ricevuta"
- per non far inc...re VBA è meglio evitare le celle unite! Adatta una cella.
- la "convalida dati" relativa al nominativo non deve partire dalla riga 1 bensì dalla 2 e non deve consentire l'inserimento manuale (se nel tuo esempio inserisco Mario la formula della ricerca della villa va a farsi benedire);
- il totale è meglio metterlo PRIMA delle righe che si riferiscono al dettaglio (non avrai problemi se il dettaglio è composto da una o 10 righe)
- la numerazione deve essere "automatica" (assumerla dall'ultima registrata e incrementarla di 1) e non farla inserire all'utente (può sempre sbagliare)

Tutto ciò premesso, siamo qui pronti ad aiutarti "ad aggiustare" un codice, non certamente fartelo di sana pianta.
Scusa la franchezza. Ciao,
Mario
 

niknes

Utente junior
3 Marzo 2017
22
1
53
Bari
Excel 2013
0
Grazie della franchezza Marius. Mi hai dato comunque dei preziosi suggerimenti. Effettivamente non mastico molto di excel e molto meno di VBA. Quella macro presente nel file l'ho avuta da un altro amico in rete. Io poi l'ho integrata, nel tempo, per adattarla alle mie esigenze. Ma sono passati diversi anni, oramai, e comunque non riesco a star dietro a tutto. Ma se son riuscito una volta posso riuscirci anche una seconda, no?
Veniamo alla mia ricevuta:
  • eviterò le celle unite ed adatterò le celle
  • Ho sistemato la convalida dati. Gustamente doveva partire dalla riga 2 e non 1
  • il totale posso metterlo prima, volendo, ma io ho intenzione di inserire solo tre righe di dettaglio
  • La numerazione è automatica, o almeno nel mio vecchio file è così. Cliccando sul tasto "Stampa" aggiorna il numero, incrementandollo di 1, rispetto all'ultimo registrato nella scheda "Registro".
Per il codice effettivamente mancava End Sub e il codice di stampa che dovrebbe essere questo
"ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True"
ma c'è molto altro da sistemare. Un passo alla volta ci arriverò. Oggi ho comunque fatto progressi.
E poi se fosse troppo facile, almeno per me, che gusto ci sarebbe.
Ciao
 

Marius44

VBA Expert
Moderatore
9 Settembre 2015
7.559
145
77
Catania
Excel2010
364
Ciao nicknes
Ecco quello che volevo. Sollecitarti ad essere più intraprendente e meno ... copione SmileForum

Iniziamo con l'apertura del file. Inserisci in ThisWorkbook (o QuestaCartelladiLavoro) il seguente codice
Codice:
Option Explicit
Private Sub Workbook_Open()
dim ur as Long, nr as Integer
    ur = Sheets("Registro").Cells(Rows.Count, 1).End(xlUp).Row
    nr = Sheets("Registro").Cells(ur, 1).Value + 1
    Sheets("Ricevute").Range("G2") = nr
End Sub
Se è tutto OK non appena apri il file, la ricevuta porta il suo numero. Fin tanto che non stampi (e quindi hai registrato i dati nel Foglio Registro) il numero non verrà salvato ma bisogna prevedere la registrazione dei dati. Per chiarire: la macro legge l'ultimo valore della col.A del Foglio Registro e lo incrementa di 1.

Prova e fai sapere. Ciao,
Mario
 

niknes

Utente junior
3 Marzo 2017
22
1
53
Bari
Excel 2013
0
Grazie Marius, funziona. Quando apro il file mi mostra subito il numero progressivo che verrà stampato anche se non salvato nel registro. Nel mio vecchio file mi chiedeva se volessi aggiornare il numero. Questo mi serviva nel caso volessi solo ristampare un vecchio DDT. Ho eliminato tutte le unioni celle e le ho adattato tutte le celle al contenuto e funziona allo stesso modo. Ho impostato tutte le schede e relativi campi di cui avrò bisogno. Ora dovrò solo collegarli con appositi codici. E qui casca l'asino!!
Questo è il codice che avevo nel mio vecchio file:

Codice:
[COLOR=#0000ff]Sub StampaDDT()
    risposta = MsgBox("Aggiornare il numero documento prima di stampare?", vbYesNo + vbQuestion, "Stampa DDT")
    If risposta = vbYes Then                                ' se vuoi aggiornare
        If Range("TipoDoc") = "DDT" Then
             NomeFoglio = "Mitt.Dest."
        Else
             NomeFoglio = "Vettore"
        End If
        With Sheets(NomeFoglio)
             Riga = .Range("A" & Rows.Count).End(xlUp).Row   'trova l'ultima riga dell'elenco bolle emesse
             If Riga = 1 Then
                 NumeroDDT = 1
             Else
                 NumeroDDT = CInt(.Range("A" & Riga)) + 1    'definisce il numero del documento
             End If
             If Range("TipoDoc") = "DDT" Then
                 Range("NumDoc") = NumeroDDT
             Else
                 Range("NumDoc") = NumeroDDT & "/VE"         'e lo copia sul foglio del DDT
             End If
             Riga = Riga + 1
             .Range("C" & Riga) = Range("Cliente").Value     ' poi salva Numero e cliente nello storico
             .Range("A" & Riga).Value = NumeroDDT
             .Range("D" & Riga) = Range("Data").Value
             .Range("E" & Riga) = Range("Quantita").Value & " Kg"
             .Range("F" & Riga) = Range("Qualita").Value
             .Range("G" & Riga) = Range("Quantita2").Value & " Kg"
             .Range("H" & Riga) = Range("Qualita2").Value
             .Range("I" & Riga) = Range("Quantita3").Value & " Kg"
             .Range("J" & Riga) = Range("Qualita3").Value
             .Range("K" & Riga) = Range("Mezz").Value
             .Range("B" & Riga) = Range("anno").Value
             
             End With
    End If
    ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True   'stampa

End Sub

[/COLOR]
Partendo da questo codice vorrei capire come ragiona Excel e di conseguenza modificarlo per il mio scopo. Mi piace imparare sul campo.
Ciao
Nico
 
Ultima modifica di un moderatore:

Berna11

Excel Expert
Moderatore
20 Febbraio 2016
8.983
345
Latina
Excel 2010
958
Un saluto a tutti

@nikness

ricordo che il codica va inserito tra i Tag Code
il segno #
per questa volta l'ho inserito io.
 

Marius44

VBA Expert
Moderatore
9 Settembre 2015
7.559
145
77
Catania
Excel2010
364
Ciao
ti consiglierei di lasciar perdere il vecchio codice (non perchè non si possa adattare, ma perchè facendolo ex novoi ci ragioni sopra e impari).
Nella macro che ho postato più sopra, all'apertura del file il codice pesca l'ultima riga non vuota della col.A di Foglio2 (Registro) e ne assume il valore, lo incrementa di una unità e lo scrive nella cella adatta di Foglio1 (Ricevute). Se adesso rileggi il codice dovrebbe sembrarti più chiaro.

Come certamente sai (ma io lo ribadisco) il range di sinistra assume il valore del range di destra quando in mezzo c'è il segno di = (uguale).
Adesso seguendo questo ragionamento prova a far sì che il codice "legga" il dato nel foglio1 e lo scriva nella cella adatta di foglio2.
Prova e, se hai bisogno, siam qui. Ciao,
Mario

PS - quando posterai il codice mettilo fra i TAG CODE altrimenti Berna11 fa il burbero SmileForum
 

niknes

Utente junior
3 Marzo 2017
22
1
53
Bari
Excel 2013
0
Ok Marius, mi hai convinto. Studierò un pò VBA e proverò ad avanzare passo passo. Guide online da suggerirmi?
Nico
 

niknes

Utente junior
3 Marzo 2017
22
1
53
Bari
Excel 2013
0
Nel frattempo sono riuscito a far funzionare il mio file, che allego. Unico problema non riesco ad attivare l'anteprima di stampa. Quando clicco sul pulsante di stampa vorrei che aggiornasse la numerazione, salvasse i dati nell'archivio ed, invece di stampare una copia, mi aprisse l'anteprima di stampa.
Ho provato ad inserire il codice
"ActiveWindow.SelectedSheets.PrintPreview"
al posto del codice di stampa
"ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True"
ma fà tutto meno che aprirmi l'anteprima (naturalmente non stampa).
Dove sbaglio, stavolta?
Grazie in anticipo
Nico
 

Allegati

alfrimpa

VBA Expert
Supermoderatore
18 Dicembre 2015
34.964
2.445
67
Napoli
2019 Pro Plus
1.046
Ciao

Prova a sostituire

Codice:
[COLOR=#333333]ActiveWindow.SelectedSheets.PrintPreview[/COLOR]
con

Codice:
[COLOR=#333333]ActiveSheet.PrintPreview[/COLOR]
 

alfrimpa

VBA Expert
Supermoderatore
18 Dicembre 2015
34.964
2.445
67
Napoli
2019 Pro Plus
1.046
Ciao nicknes

Non entro nel merito della macro StampaDDT ma vedo che c'è un istruzione Exit Sub che non so a cosa serva; se la cancelli (e cancella anche l'istruzione Return che è un po' più sotto) a me pare funzionare.
 

niknes

Utente junior
3 Marzo 2017
22
1
53
Bari
Excel 2013
0
Grazie Alfrimpa.
La macro è un risultato di un collage di varie macro.
Cancellando l'istruzione Exit Sub e Return funziona l'anteprima ma non mi converte più la cifra in numeri, della cella "Range Importototale" in lettere nella cella "Importolettere".
 

alfrimpa

VBA Expert
Supermoderatore
18 Dicembre 2015
34.964
2.445
67
Napoli
2019 Pro Plus
1.046
E allora quell'exit sub va posizionato in maniera diversa ma non saprei dire dove.
 

ges

Excel/VBA Expert
Amministratore
21 Giugno 2015
28.926
1.865
Como
2011MAC 365WIN
925
Ciao a tutti,
scusate se m'intrometto.
Non entro nel merito della macro ma credo che il problema sia proprio quell' Exit Sub che fa uscire senza permettere di completare l'ultima istruzione.

Proverei a mettere un apice a Exit Sub e a toglierlo a Goto Fine , così:

Codice:
.....
.....

LLL$ = LLL$ + Decim$
Range("importolettere").Select             'cella che riporta la conversione il lettere
ActiveCell.Value = LLL$
'ActiveCell.Offset(1, -1).Range("A1").Select

[COLOR=#008000]'Exit Sub

[/COLOR]
[COLOR=#000000]GoTo Fine[/COLOR]


.....
.....


Return


Fine:




    End If
     ActiveWindow.SelectedSheets.PrintPreview   [COLOR=#008000]'anteprima di stampa[/COLOR]


End Sub
 

alfrimpa

VBA Expert
Supermoderatore
18 Dicembre 2015
34.964
2.445
67
Napoli
2019 Pro Plus
1.046
Ciao a tutti,
scusate se m'intrometto.
Non entro nel merito della macro ma credo che il problema sia proprio quell' Exit Sub che fa uscire senza permettere di completare l'ultima istruzione.

Proverei a mettere un apice a Exit Sub e a toglierlo a Goto Fine , così:

Codice:
.....
.....

LLL$ = LLL$ + Decim$
Range("importolettere").Select             'cella che riporta la conversione il lettere
ActiveCell.Value = LLL$
'ActiveCell.Offset(1, -1).Range("A1").Select

[COLOR=#008000]'Exit Sub

[/COLOR]
[COLOR=#000000]GoTo Fine[/COLOR]


.....
.....


Return


Fine:




    End If
     ActiveWindow.SelectedSheets.PrintPreview   [COLOR=#008000]'anteprima di stampa[/COLOR]


End Sub
E se lo dice il Prof. Ges.....Muoio_muoio
 

Sostieni ForumExcel

Aiutaci a sostenere le spese e a mantenere online la community attraverso una libera donazione!