Discussione: Corso VBA
Visualizza messaggio singolo
Vecchio 01-06-2014, 10.23.50   #24
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
#4

Salva e Richiama Preventivo

Una volta che il preventivo è stato compilato in tutte le sue parti si può procedere con la stampa e il trasferimento dei dati in archivio cliccando sul pulsante Memorizza che si occupa di inviare il documento prima alla stampante di sistema e successivamente di archiviarlo. Una volta premuto il pulsante viene visualizzato questo avviso


Fig. 1

In questa finestra di scelta prima dell’archiviazione è possibile scegliere se stampare il documento oppure no. Se viene premuto il pulsante Si il Preventivo viene inviato alla stampante di sistema e poi archiviato, cliccando invece sul pulsante No si archivia direttamente il preventivo senza eseguire la routine di stampa. Il codice associato al pulsante Memorizza è il seguente
Codice:
Sub Memorizza()
1.	m = Sheets("Setup").[B3]                 'riga dove scrivere
2.	posiz = Sheets("Setup").[B4]             'colonna dove scrivere

3.	If Sheets("Setup").[B2] = True Then      'controllo il flag
4.	Mt = Mt & "Attenzione Il Preventivo era già in memoria " & Chr(13) & Chr(13)
5.	Mt = Mt & "Vuoi Sovrascriverlo??" & Chr(13) & Chr(13)
6.	rs = MsgBox(prompt:=Mt, Title:="Gestione Preventivi", Buttons:=vbYesNo + vbQuestion)
7.	If rs = vbNo Then Exit Sub
8.	salva
9.	svuota_prev
10.	ElseIf Sheets("Setup").[B2] = False Then
11.	Sheets("Setup").[B1] = [P14]
12.	controllo
13.	End If
End Sub
Alla riga 1 e alla riga 2 vengono assegnati alle variabili m e posiz il valore presente nelle celle B3 e B4 del foglio Setup, che rappresentano rispettivamente il numero di riga e il numero di colonna che riceveranno il preventivo nel foglio Archivio. Il calcolo dei valori da assegnare alle due variabili è stato eseguito nella fase di creazione del documento tramite la routine Nuovo che è stato affrontato nella lezione precedente. Basti solo ricordare che al momento della creazione del documento viene calcolata la colonna che riceverà il preventivo in base al mese di emissione e in base a questa colonna verrà calcolata la riga in cui memorizzare i dati del documento.

Alla riga 3 viene posta una condizione tramite il ciclo IF per scegliere quali istruzioni eseguire. Questa scelta si basa esclusivamente sul tracciato di “provenienza” del documento. Per riconoscere se si sta operando su un nuovo preventivo oppure su un documento caricato dall’archivio per modificarlo, si procede con la lettura del valore presente nella cella B2 del foglio Setup, nella quale è stato inserito un valore Booleano al momento della creazione del documento. La cella B2 contiene il valore FALSE se viene creato un nuovo documento e TRUE se si sta operando su un documento estratto dall’archivio, pertanto alla riga 3 viene verificato il valore nella cella B2 e se il valore corrisponde a TRUE, pertanto si sta operando su un documento già archiviato, alla riga 45 e 6 si richiede l’autorizzazione all’operatore di procedere al salvataggio delle modifiche tramite un messaggio a video. Il messaggio visualizzato è il seguente

Fig. 2

Qualora si negasse l’autorizzazione cliccando sul pulsante NO, con l’istruzione alla riga 7 vengono saltate tutte le istruzione e si esce dalla routine ritornando al foglio preventivi. Nel caso sia stato cliccato il pulsante SI alla richiesta di procedere con il salvataggio dei dati si richiama la routine salva alla riga 8, che commenteremo Alla riga 9 viene svuotato il documento tramite la routine svuota_prev che è stata commentata nella lezione precedente chiudendo così la prima istruzione del ciclo IF. Qualora il valore della cella B2 del foglio Setup fosse stato uguale a FALSE, confermando così la presenza di un nuovo documento, tutte le istruzioni dalla riga 3 alla riga 10 non sarebbero state eseguite e il controllo della routine sarebbe passato alla riga 10 per la verifica del valore della cella B2, per poi assegnare alla cella B1 del foglio Setup il valore presente nella cella P14 del foglio Preventivi che rappresenta il numero di documento alla riga 11. Alla riga 12 si esegue la routine controllo e alla riga successiva si termina ciclo e routine. La routine controllo presenta questo codice
Codice:
Private Sub controllo()
1.	If [M6] = "" Then: MsgBox "Inserire nome cliente": [M6].Select: Exit Sub
2.	salva
3.	svuota_prev
End Sub
Innanzi tutto una precisazione, questa parte della routine viene eseguita solo se il valore della cella B2 del foglio Setup contiene il valore FALSE, pertanto quando viene creato un nuovo preventivo. Alla riga 1 della routine si verifica che la cella M6 del foglio Preventivi contenga dei dati, per essere certi che sia stato selezionato un cliente, se la cella fosse vuota, viene visualizzato un messaggio a video avvisando di selezionare un cliente tramite il pulsante Carica Cliente del foglio Preventivi, e portando il cursore sulla cella M6 e uscendo dalla sub. Alla riga 2 si richiama la routine salva, che vedremo fra poco e alla riga 3 viene svuotato il foglio Preventivi. Rimane ora da vedere il listato della routine salva, così rappresentato
Codice:
Private Sub salva()
1.	j = 17
2.	With Sheets("Archivio")
3.	.Cells(m, posiz) = [M6]                       'Cliente
4.	.Cells(m, posiz + 1) = [M7]                  'Indirizzo
5.	.Cells(m, posiz + 2) = [M8]                  'Città
6.	.Cells(m, posiz + 3) = [B11]                 'pagamento
7.	.Cells(m, posiz + 4) = [G11]                 'banca
8.	.Cells(m, posiz + 5) = [M14].Value    'data preventivo
9.	.Cells(m, posiz + 6) = [P14]                 'n° preventivo
10.	.Cells(m + 1, posiz) = [D14]                 'email
11.	.Cells(m + 1, posiz + 1) = [H14]            'Agente
12.	.Cells(m + 1, posiz + 2) = [J14]             'trasporto
13.	.Cells(m + 1, posiz + 3) = [P50]             'tot. imponibile
14.	.Cells(m + 1, posiz + 4) = [P52]             'importo iva
15.	.Cells(m + 1, posiz + 5) = [P54]             'totale
16.	.Cells(m + 1, posiz + 6) = [B56]             'note 
17.	End With

18.	m = m + 2
19.	Do Until Sheets("Preventivi").Cells(j, 2) = Empty
20.	With Sheets("Archivio")
21.	.Cells(m, posiz) = Sheets("Preventivi").Cells(j, 2).Value               'codice
22.	.Cells(m, posiz + 1) = Sheets("Preventivi").Cells(j, 3).Value         'descrizione
23.	.Cells(m, posiz + 2) = Sheets("Preventivi").Cells(j, 14).Value       'quantità
24.	.Cells(m, posiz + 3) = Sheets("Preventivi").Cells(j, 15).Value       'prezzo
25.	.Cells(m, posiz + 4) = Sheets("Preventivi").Cells(j, 17).Value       'importo
26.	End With
27.	j = j + 1: m = m + 1
28.	Loop
29.	Mt = Mt & "Stampo il Preventivo?" & Chr(13) & Chr(13)
30.	rs = MsgBox(prompt:=Mt, Title:="Gestione Preventivi", Buttons:=vbYesNo + vbQuestion)
31.	If rs = vbNo Then
32.	Exit Sub
33.	Else
34.	ActiveSheet.PrintOut copies:=1
35.	End If
End Sub
Alla riga 1 viene posta la variabile j uguale a 17, che corrisponde al numero della prima riga del foglio Preventivi che inizia a ricevere gli articoli del preventivo, come si può vedere in figura 3

Fig. 3

Dalla riga 2 alla riga 17 tramite il ciclo With vengono inseriti i valori presenti nei campi del foglio Preventivi alle coordinate specificate, e scritti nel foglio archivio su 2 righe. Il valore e la procedura di estrazione delle variabili m e posiz è stato visto poco sopra, ricordiamo solo che identificano rispettivamente riga e colonna del foglio Archivio, pertanto con la procedura descritta nel ciclo With viene assegnato il valore presente nei vari campi rappresentati dai rispettivi Range alle coordinate di riga e colonna determinate dai valori delle variabili m e posiz.

Per salvare il corpo del preventivo viene usato un ciclo Do Loop. Alla riga 18 la variabile m, che rappresenta la riga iniziale del foglio Archivio che riceve i dati dei documenti, viene incrementata di 2 unità in quanto le prime 2 righe sono dedicate ai dati generali del preventivo (N° documento, data, cliente etc.), e nelle righe successive del foglio Archivio si inseriscono i valori presenti nelle righe del foglio Preventivi usando un ciclo With, utilizzando le variabili m e posiz per identificare le coordinate del foglio Archivio, e la variabile j per identificare il range del foglio Preventivi, che è stata inizializzata con un valore pari a 17 alla riga 1 del listato, che rappresenta la riga iniziale del corpo del preventivo. Dalla riga 29 alla riga 33 viene visualizzato a video il messaggio di figura 1, per chiedere conferma di proseguire con la stampa del documento e alla riga 35 si chiude il ciclo e termina la routine.

Ora vediamo il pulsante Richiama che si occupa di recuperare un preventivo dall’archivio e caricare tutti i dati nel foglio Preventivi. Al pulsante è stato assegnato questo codice
Codice:
 Sub recupera()
    FormFM.Show
End Sub
FormFM è una finestra di dialogo così strutturata


Fig. 4

Da ricordare che i preventivi vengono divisi per periodo e assegnati al mese di emissione nel momento della creazione del documento stesso, pertanto all'attivazione della Form comparirà una casella di selezione denominata “Periodo” che viene popolata col seguente codice
Codice:
 Private Sub UserForm_Activate()
Dim elemento As String
If ListBox1.ListCount >= 1 Then ListBox1.Clear
i = 1
Do Until Sheets("Archivio").Cells(1, i).Value = Empty
 With Sheets("Archivio")
  elemento = .Cells(1, i).Value
 End With
  ListBox1.AddItem elemento
  i = i + 8
Loop
ListBox1.ListIndex = 0
svuota_box
 End Sub
Con il listato sopra esposto si scorrono tutte le colonne del foglio Archivio alla riga 1, definita dalla variabile i e con un “salto” di 8 colonne ad ogni ciclo. Dato che i preventivi sono stati divisi per periodo, nella prima casella di selezione compariranno i mesi, che corrispondono all'etichetta della colonna che il ciclo andrà a leggere alle coordinate di riga 1 e colonna i. Prima di uscire dalla routine si svuotano tutti i campi della Form tramite la routine svuota_box con questo codice
Codice:
 Private Sub svuota_box()
conta = 1
For conta = 1 To 5
    Controls("TextBox" & conta) = ""
  Next conta
End Sub
I vari controlli di testo sono tutti denominati TextBox1, TextBox2 etc. con un ciclo FOR si scorrono tutti i controlli TextBox assegnandone il contenuto uguale a stringa vuota. Quando si preme sul mese desiderato nella casella di selezione “Periodo” si popola la seconda casella denominate “Clienti” con questo codice
Codice:
 Private Sub ListBox1_Click()
Dim elemen As String, s As Integer
svuota_box
 posiz = (ListBox1.ListIndex + 1) * 8 – 7   ‘calcolo colonna
If ListBox2.ListCount >= 1 Then ListBox2.Clear
  s = 2
 
Do Until Sheets("Archivio").Cells(s, posiz) = Empty
  With Sheets("Archivio")
   elemen = .Cells(s, posiz).Value
  End With
  ListBox2.AddItem elemen
  s = s + 30
Loop
End Sub
Viene assegnato il valore alla variabile posiz determinando il numero della colonna in base alla voce selezionata (la prima voce, seconda, terza etc.) e moltiplicando questo valore (1,2 o tre) per il numero di colonne che formano la categoria e sottraendo 1 colonna che rappresenta la colonna di spazio tra una categoria e l’altra. Con il ciclo Do Loop si scorrono tutte le righe facendo un “salto” di 30 righe ad ogni ciclo e riempiendo il ListBox dei valori che vengono reperiti. In questo modo il ListBox viene riempito con i nomi dei clienti ai quali è stato emesso un preventivo e cliccando su uno di loro vengono riempiti i vari campi a fianco i dati identificativi con questo codice
Codice:
 Private Sub ListBox2_Click()
p = ListBox2.ListIndex + 1
p = (p * 30) - 29 + 1                   riga foglio archivio

TextBox1.Text = Sheets("Archivio").Cells(p, posiz)                      'cliente
TextBox2.Text = Sheets("Archivio").Cells(p, posiz + 5).Value     'data prev.
TextBox3.Text = Sheets("Archivio").Cells(p, posiz + 6)                 'n° prev.
TextBox4.Text = Format(CDbl(Sheets("Archivio").Cells(p + 1, posiz + 4)), "#,0.00")       'importo euro
TextBox5.Text = Sheets("Archivio").Cells(p + 1, posiz + 2)    'agente
End Sub
Nella routine precedente è stata identificata la colonna tramite la variabile posiz, in questa invece viene reperito il numero di riga usando la variabile p con lo stesso sistema, moltiplicando il numero della voce cliccata per il numero di righe disponibili e sottraendone lo stesso numero meno 1 unità. Identificata la colonna si esegue un’assegnazione ai vari controlli TextBox alle coordinate di riga p e colonna posiz dei valori presenti nel foglio Archivio. Una volta identificato il documento che si vuole recuperare vengono caricati tutti i dati nel foglio Preventivo con questo codice
Codice:
 Private Sub CommandButton1_Click()
FormFM.Hide
svuota_prev
Dim r As Integer

r = 17
  Sheets("Setup").[B2] = True           'scrivo flag per salvare modifiche
  Sheets("Setup").Range("B3") = p       'scrivo riga
  Sheets("Setup").Range("B4") = posiz   'scrivo colonna
 Sheets("Preventivi").Range("B17").Select
Sheets("Preventivi").Range("M6") = Sheets("Archivio").Cells(p, posiz)                'cliente
Sheets("Preventivi").Range("M7") = Sheets("Archivio").Cells(p, posiz + 1)            'indirizzo
Sheets("Preventivi").Range("M8") = Sheets("Archivio").Cells(p, posiz + 2)            'città
Sheets("Preventivi").Range("B11") = Sheets("Archivio").Cells(p, posiz + 3)           'pagamento
Sheets("Preventivi").Range("G11") = Sheets("Archivio").Cells(p, posiz + 4)           'banca appoggio
Sheets("Preventivi").Range("M14") = Sheets("Archivio").Cells(p, posiz + 5)           'data documento
Sheets("Preventivi").Range("P14") = Sheets("Archivio").Cells(p, posiz + 6)           'N° documento
Sheets("Preventivi").Range("B14") = Sheets("Archivio").Cells(p + 1, posiz).Value        'P.iva
Sheets("Preventivi").Range("D14") = Sheets("Archivio").Cells(p + 1, posiz + 1).Value    'email
Sheets("Preventivi").Range("H14") = Sheets("Archivio").Cells(p + 1, posiz + 2).Value    'agente
Sheets("Preventivi").Range("J14") = Sheets("Archivio").Cells(p + 1, posiz + 3).Value    'trasporto
Sheets("Preventivi").Range("P50") = Sheets("Archivio").Cells(p + 1, posiz + 4).Value    'Imponibile
Sheets("Preventivi").Range("P52") = Sheets("Archivio").Cells(p + 1, posiz + 5).Value    'iva
Sheets("Preventivi").Range("P54") = Sheets("Archivio").Cells(p + 1, posiz + 6).Value    'Totale
 p = p + 2
Do Until Sheets("Archivio").Cells(p, posiz) = Empty
 Cells(r, 2) = Sheets("Archivio").Cells(p, posiz)        'codice
 Cells(r, 3) = Sheets("Archivio").Cells(p, posiz + 1)    'decrizione
 Cells(r, 14) = Sheets("Archivio").Cells(p, posiz + 2)   'quant
 Cells(r, 15) = Sheets("Archivio").Cells(p, posiz + 3)   'prezzo
 Cells(r, 17) = Sheets("Archivio").Cells(p, posiz + 4)   'importo
  r = r + 1: p = p + 1
Loop
Sheets("Preventivi").Range("B17").Select
End Sub
Con questa ultima routine prima si nasconde la Form e si svuota il foglio Preventivi per poi salvare nel foglio Setup il flag che identifica il tipo di documento, cioè un preventivo recuperato dall'archivio e successivamente i valori di riga e colonna dove si trova ubicato il preventivo nel foglio Archivio. In seguito si assegnano i valori presenti nel foglio Preventivo nei rispettivi Range al corrispondente Range del foglio Archivio. In seguito si scorre il corpo del documento tramite un ciclo Do Loop e assegnando i valori trovati alle coordinate di riga p e colonna posiz del foglio Archivio. A questo punto è terminata la procedura di salvataggio del preventivo e del suo recupero dall'archivio in un secondo tempo.
___________________________________

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