Gestione Preventivi - Parte 3
In questa lezione vedremo la memorizzazione dei documenti e la loro consultazione, a completamento del file “Preventivi” usato finora per approfondire gli argomenti trattati nelle lezioni precedenti. L’area di lavoro principale è il foglio “
Preventivi” che abbiamo strutturato come da figura
Fig. 1
Abbiamo visto che per emettere il documento si deve agire nel seguente modo:
1) Cliccare sul pulsante “
Nuovo documento” per inserire data e numero del documento
2) Cliccare sul pulsante “
Cliente” per selezionare il destinatario del documento
3) Compilare manualmente i campi “
Agente” e “
Trasporto” agendo sulle frecce di selezione del campo
4) Inserire gli articoli cliccando sul pulsante “
Inserisci Articoli”
Una volta eseguite queste fasi il documento è compilato in tutte le sue parti e possiamo eseguire la stampa e la memorizzazione in archivio premendo il pulsante “
Memorizza” che ci mostrerà una finestra di scelta come questa
Fig. 2
Come si intuisce dall’immagine prima dell’archiviazione viene richiesto se vogliamo stampare il documento, se clicchiamo su
Si il Preventivo viene inviato alla stampante di sistema e poi archiviato, scegliendo
No si archivia direttamente svuotando il foglio. Vediamo il codice associato al pulsante Memorizza:
Codice:
Sub Memorizza()
m = Sheets("Setup").[B3] 'riga dove scrivere
posiz = Sheets("Setup").[B4] 'colonna dove scrivere
Dim Mt As String
If Sheets("Setup").[B2] = True Then 'controllo il flag
Mt = Mt & "Attenzione Il Preventivo era già in memoria ??" & Chr(13) & Chr(13)
Mt = Mt & "Vuoi Sovrascriverlo??" & Chr(13) & Chr(13)
rs = MsgBox(prompt:=Mt, Title:="Gestione Preventivi", Buttons:=vbYesNo + vbQuestion)
If rs = vbNo Then Exit Sub
salva
svuota_prev
ElseIf Sheets("Setup").[B2] = False Then
Sheets("Setup").[B1] = [P14]
salva
svuota_prev
End If
End Sub
In sintesi abbiamo raccolto in precedenza i dati necessari per eseguire la memorizzazione del documento nel foglio “
Archivio” e salvati anche nel foglio di appoggio “
Setup” come si può vedere dalla figura sotto riportata
Fig. 3
Tornando al codice della routine “
Memorizza”, commentiamo ora le prime due righe di codice
m = Sheets("Setup").[B3]
posiz = Sheets("Setup").[B4]
Con l’enunciato sopra esposto assegniamo alle variabili
m e
posiz il valore presente nelle celle
B3 e
B4 del foglio “
Setup” che rappresentano rispettivamente il numero di riga e colonna del foglio “Archivio” dove andremo a salvare i dati. Queste due variabili nel modulo VBA in cui sono alloggiate, sono utilizzate da varie Routine (Sub) per cui devono essere accessibili a tutte le procedure o Sub presenti nel modulo stesso. Per renderle disponibili alle varie Routine si devono dichiarare con l’enunciato
Dim all’inizio del modulo e prima di qualsiasi altra dichiarazione, come si può vedere dalla figura sottostante
Fig. 4
E’ risaputo che il salvataggio dei dati è una fase molto importante, pertanto dobbiamo verificare prima di eseguirla se il documento presente nel foglio “Preventivi” è un
Nuovo Documento o se è un documento esistente caricato dall’archivio, in quanto i valori delle variabili
m e
posiz variano per i due casi. Per identificare la “provenienza” del documento usiamo dei “
Segnalatori” o
Flag, in questo modo:
If Sheets("Setup").[B2] = True
In pratica abbiamo precedentemente salvato in una cella del foglio “Setup” la dicitura
FALSE o
TRUE in base all’operazione che stiamo facendo. Se iniziamo un nuovo documento al momento del click sul pulsante “
Nuovo Documento” andremo a scrivere nella cella B2 il valore
FALSE, mentre invece se clicchiamo sul pulsante “Richiama” per editare un documento presente in archivio, andremo a scrivere
TRUE. E’ come “Segnare il percorso” e in questo modo sappiamo se stiamo facendo un nuovo documento oppure se stiamo editandone uno dall’archivio. Per decidere quale operazione eseguire in base al Flag impostato inseriamo le varie operazioni da eseguire in un ciclo IF come il seguente
Codice:
If Sheets("Setup").[B2] = True Then 'controllo il flag
Mt = Mt & "Attenzione Il Preventivo era già in memoria ??" & Chr(13) & Chr(13)
Mt = Mt & "Vuoi Sovrascriverlo??" & Chr(13) & Chr(13)
rs = MsgBox(prompt:=Mt, Title:="Gestione Preventivi", Buttons:=vbYesNo + vbQuestion)
If rs = vbNo Then Exit Sub
salva
svuota_prev
ElseIf Sheets("Setup").[B2] = False Then
Sheets("Setup").[B1] = [P14]
salva
svuota_prev
End If
Come si vede dal codice sopra esposto abbiamo posto 2 condizioni nel ciclo IF
If Sheets("Setup").[B2] = True Then
…………………. Istruzioni ……….
ElseIf Sheets("Setup").[B2] = False Then
………… altre istruzioni ………..
End If
Possiamo interpretare il codice in maniera molto semplicistica affermando:
Se il documento corrente è un Nuovo documento allora esegui queste istruzioni,
Altrimenti Se il documento corrente è già presente in archivio e lo stai modificando esegui queste istruzioni. Pertanto in base al valore presente nella cella B2 abbiamo già impartito le istruzioni che devono essere svolte. Vediamo ora la 1° condizione del ciclo
If Sheets("Setup").[B2] = True Then
Con questa istruzione verifichiamo se il valore della cella B2 del foglio Setup è uguale a TRUE (cioè stiamo editando un documento già archiviato) allora si avvisa l’utilizzatore che il documento era già in memoria e si chiede se vuole sovrascriverlo. L’avviso riportato è come il seguente
Fig. 5
Il codice che si occupa di mostrare questo avviso è:
Codice:
Mt = Mt & "Attenzione Il Preventivo era già in memoria " & Chr(13) & Chr(13)
Mt = Mt & "Vuoi Sovrascriverlo??" & Chr(13) & Chr(13)
rs = MsgBox(prompt:=Mt, Title:="Gestione Preventivi", Buttons:=vbYesNo + vbQuestion)
A questo punto l’utilizzatore deve fare una scelta, se sceglie
NO allora tramite
IF rs = vbNo Then Exit Sub
Usciamo dalla Routine senza eseguire nessuna azione, scegliendo invece
SI vengono eseguite le Routine
salva e
svuota_prev e poi usciamo dalla Sub. Mentre invece la 2° condizione del ciclo, espressa con:
Codice:
ElseIf Sheets("Setup").[B2] = False Then
Sheets("Setup").[B1] = [P14]
salva
svuota_prev
Viene eseguita se il valore nella cella B2 del foglio “Setup” è uguale a FALSE (per cui stiamo facendo un nuovo preventivo), non riporta nessun avviso, aggiorna il valore della cella B1 del foglio “Setup” ed esegue la Routine “controllo”. Bisogna prestare particolare attenzione all’enunciato
Sheets("Setup").[B1] = [P14]
Bisogna ricordare che per una corretta stesura del Preventivo è fondamentale emettere documenti con una
numerazione univoca, eseguire il processo di numerazione è abbastanza semplice. Quando si “stacca” il preventivo n° 1, nella cella B1 del foglio di appoggio “Setup” sarà presente il valore 0 [zero]
Nota: ricordo che in quella cella viene memorizzato il numero dell’ultimo preventivo memorizzato
Per cui quando clicchiamo sul pulsante “Nuovo Documento” andremo a leggere il valore presente nella cella B1 del foglio Setup incrementandolo di 1 unità e inseriamo tale valore nella cella P14 del foglio Preventivi. In seguito, quando memorizzeremo il preventivo nel foglio “Archivio” andremo a sovrascrivere il valore della cella B1 del foglio “Setup” col valore della cella P14 del foglio “Preventivi”. Il processo si ripete poi per ogni documento che salveremo, per cui diventa importante il salvataggio del documento. Vediamo ora la routine
salva
Codice:
Private Sub salva()
j = 17
With Sheets("Archivio")
.Cells(m, posiz) = [M6] 'Cliente
.Cells(m, posiz + 1) = [M7] 'Indirizzo
.Cells(m, posiz + 2) = [M8] 'Città
.Cells(m, posiz + 3) = [B11] 'pagamento
.Cells(m, posiz + 4) = [G11] 'banca
.Cells(m, posiz + 5) = [M14].Value 'data preventivo
.Cells(m, posiz + 6) = [P14] 'n° preventivo
.Cells(m + 1, posiz) = [D14] 'email
.Cells(m + 1, posiz + 1) = [H14] 'Agente
.Cells(m + 1, posiz + 2) = [J14] 'trasporto
.Cells(m + 1, posiz + 3) = [P50] 'tot. imponibile
.Cells(m + 1, posiz + 4) = [P52] 'importo iva
.Cells(m + 1, posiz + 5) = [P54] 'totale
.Cells(m + 1, posiz + 6) = [B56] 'note
End With
m = m + 2
Do Until Sheets("Preventivi").Cells(j, 2) = Empty
With Sheets("Archivio")
.Cells(m, posiz) = Sheets("Preventivi").Cells(j, 2).Value 'codice
.Cells(m, posiz + 1) = Sheets("Preventivi").Cells(j, 3).Value 'descrizione
.Cells(m, posiz + 2) = Sheets("Preventivi").Cells(j, 14).Value 'quantità
.Cells(m, posiz + 3) = Sheets("Preventivi").Cells(j, 15).Value 'prezzo
.Cells(m, posiz + 4) = Sheets("Preventivi").Cells(j, 17).Value 'importo
End With
j = j + 1: m = m + 1
Loop
Mt = Mt & "Stampo il Preventivo?" & Chr(13) & Chr(13)
rs = MsgBox(prompt:=Mt, Title:="Gestione Preventivi", Buttons:=vbYesNo + vbQuestion)
If rs = vbNo Then
Exit Sub
Else
ActiveSheet.PrintOut copies:=1
stampa
End If
End Sub
Commentiamo il codice iniziando da:
j = 17
Con la variabile
j indichiamo il numero di riga del foglio Preventivi dove iniziamo a inserire gli articoli del preventivo, lo possiamo vedere in
Figura 1 che la prima riga che riceve gli articoli del Preventivo è la 17, inoltre abbiamo precedentemente citato che le variabili m e posiz identificano rispettivamente riga e colonna del foglio Archivio” dove memorizzare i dati, che eseguiamo col ciclo With
Codice:
With Sheets("Archivio")
.Cells(m, posiz) = [M6] 'Cliente
.Cells(m, posiz + 1) = [M7] 'Indirizzo
.Cells(m, posiz + 2) = [M8] 'Città
.Cells(m, posiz + 3) = [B11] 'pagamento
.Cells(m, posiz + 4) = [G11] 'banca
.Cells(m, posiz + 5) = [M14].Value 'data preventivo
.Cells(m, posiz + 6) = [P14] 'n° preventivo
.Cells(m + 1, posiz) = [D14] 'email
.Cells(m + 1, posiz + 1) = [H14] 'Agente
.Cells(m + 1, posiz + 2) = [J14] 'trasporto
.Cells(m + 1, posiz + 3) = [P50] 'tot. imponibile
.Cells(m + 1, posiz + 4) = [P52] 'importo iva
.Cells(m + 1, posiz + 5) = [P54] 'totale
.Cells(m + 1, posiz + 6) = [B56] 'note
End With
Per comprendere meglio il codice aiutiamoci con l’immagine del foglio Archivio
Fig. 6
Come vedete nella prima riga del foglio abbiamo i mesi (riga di colore verde) e i dati principali del preventivo andiamo a salvarli nelle righe gialle (2° e 3° riga), per cui con m identifichiamo la 1° riga gialla e con posiz la 1° colonna del mese, per cui con:
.Cells(m, posiz) = [M6]
Nella cella alle coordinate m,posiz (1° riga e 1° colonna) del foglio “Archivio” andiamo a scrivere il valore della cella N6 del foglio “Preventivi”. Successivamente dobbiamo scrivere nelle colonne adiacenti, ma senza incrementare e/o modificare il valore delle variabili m e posiz, per cui usiamo l'enunciato
.Cells(m, posiz + 1) = [M7]
In pratica sommiamo al valore di posiz 1 unità per scrivere nella 2° colonna, 2 unità per scrivere nella 3° colonna e via di seguito fino alla 7° colonna, ultima colonna del mese. Usiamo lo stesso procedimento per scrivere nella 2° riga, incrementando il valore di m (la riga) di 1 unità e il valore di posiz come abbiamo fatto per la riga precedente, pertanto l'enunciato diventa
.Cells(m + 1, posiz) = [D14]
Ora dobbiamo scrivere il corpo del Preventivo, tramite il seguente codice:
Codice:
m = m + 2
Do Until Sheets("Preventivi").Cells(j, 2) = Empty
With Sheets("Archivio")
.Cells(m, posiz) = Sheets("Preventivi").Cells(j, 2).Value 'codice
.Cells(m, posiz + 1) = Sheets("Preventivi").Cells(j, 3).Value 'descrizione
.Cells(m, posiz + 2) = Sheets("Preventivi").Cells(j, 14).Value 'quantità
.Cells(m, posiz + 3) = Sheets("Preventivi").Cells(j, 15).Value 'prezzo
.Cells(m, posiz + 4) = Sheets("Preventivi").Cells(j, 17).Value 'importo
End With
j = j + 1: m = m + 1
Loop
In pratica aumentiamo il valore della variabile m di 2 unità, per cui passiamo alla 1° riga verde-chiaro sotto alle righe gialle in cui abbiamo salvato i dati principali del preventivo, e poi usiamo un ciclo Do Loop per scorrere le righe del preventivo e copiarle nel foglio “Archivio”. Interpretiamo il codice:
Do Until Sheets("Preventivi").Cells(j, 2) = Empty
Ripeti (il ciclo) finchè nel foglio Preventivi non ci sono celle vuote alle coordinate j, 2. Se le celle non sono vuote, tramite il ciclo with si copiano i dati dal foglio “Preventivi” nel foglio Archivio alle coordinate di riga e colonna pari ai valori di m,posiz, mentre invece per scorrere le righe di dati presenti nel foglio “Preventivi” si cicla alle coordinate di riga e colonna pari ai valori di j per la riga e ai valori fissi di colonna impostati nel ciclo. Si termina il ciclo incrementando il valore di m e di j finchè non si soddisfa la condizione iniziale e si esce dal ciclo. A questo punto i dati sono stati trascritti nel foglio “Archivio” e si manda in stampa il documento tramite il codice:
Codice:
Mt = Mt & "Stampo il Preventivo?" & Chr(13) & Chr(13)
rs = MsgBox(prompt:=Mt, Title:="Gestione Preventivi", Buttons:=vbYesNo + vbQuestion)
If rs = vbNo Then
Exit Sub
Else
ActiveSheet.PrintOut copies:=1
stampa
End If
End Sub
Che ci riporta un avviso a video come il seguente
Fig. 7
Cliccando su “
No” si esce dalla Routine tramite l’enunciato
If rs = vbNo Then Exit Sub
Altrimenti cliccando su “
Si” si invia il documento alla stampante di sistema e si termina la procedura.