Discussione: Corso VBA
Visualizza messaggio singolo
Vecchio 05-03-2012, 14.48.07   #14
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.208
Alexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raroAlexsandra è un gioiello raro
#14

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

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato