Discussione: Corso VBA
Visualizza messaggio singolo
Vecchio 13-02-2012, 16.54.55   #13
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
#2

Gestione Preventivi: Anagrafica Clienti


In un programma di gestione Preventivi non può mancare la gestione dell’anagrafica clienti. Ora vedremo come costruire e gestire un archivio anagrafico, visualizzarne i dati, modificarli e inserirne di nuovi. L’anagrafica oltre ad essere molto importante in ogni supporto informatico risulta essere molto utile in quanto la possiamo strutturare in modo da pianificare il lavoro quotidiano inserendo per ciascun cliente, oltre ai dati anagrafici, anche i recapiti telefonici, il fax, l’indirizzo email e tanto altro. Iniziamo strutturando il foglio clienti che conterrà l’elenco dei dati in questo modo.

Fig. 1

Nota: La larghezza delle colonne è stata volutamente ristretta per poterla rappresentare in questa guida in modo graficamente visibile, potete dare le dimensioni che volete alle varie colonne.

L’archivio clienti che utilizzeremo in questo contesto è rappresentato dal foglio di lavoro “clienti”, in cui la prima riga viene utilizzata per inserire le intestazioni delle colonne e dalla riga successiva andremo ad inserire l’elenco dei dati. Questa struttura ricalca il concetto di tabella nei database, dove le colonne rappresentano i campi della tabella e le righe i record. Inseriamo 5 clienti di prova e costruiamo una Userform per interrogare l’archivio come quella riportata in figura 2, con 1 controllo LisBox, 16 controlli TextBox inseriti in un controllo Frame e 3 controlli CommandButton

Fig. 2

Nell’evento Activate della Form è stato inserito il listato che permette di visualizzare l’archivio clienti in questo modo:

Codice:
Private Sub UserForm_Activate() 
aggiorna
End Sub
L’evento contiene una sola riga di codice che richiama la routine aggiorna, in quanto il codice che sarebbe stato inserito nell'evento Activate verrà usato in altri parti del programma per cui, in casi del genere, invece di continuare a ripetere lo stesso codice risulta più utile spostarlo in una procedura a sé e richiamarla quando ci ritorna utile. Ritornando al nostro evento, la prima istruzione che dobbiamo eseguire è quella di popolare il controllo ListBox presente sul lato sinistro della Form e la routine aggiorna si occupa proprio di questo utilizzando il seguente codice

Codice:
Private Sub aggiorna() 
1.	If ListBox1.ListCount >= 1 Then ListBox1.Clear
2.	i = 2
3.	Do Until Sheets("clienti").Cells(i, 2).Value = ""
4.	With Sheets("clienti")
5.	elemento = .Cells(i, 2).Value
6.	End With
7.	ListBox1.AddItem elemento
8.	i = i + 1
9.	Loop
10.	ListBox1.ListIndex = 0
End Sub
Alla riga 1 utilizziamo l’istruzione ListCount che inserendola in un enunciato IF verifica se nel ListBox sono presenti dei dati. Dalla sintassi si evince che se ListCount è maggiore o uguale a 1 allora il ListBox contiene dei dati e viene svuotato del contenuto tramite l’istruzione Clear, evitando così il rischio di trovarsi i dati ripetuti nella casella combinata. Alla riga 2 viene assegnato il valore 2 alla variabile i. Questo valore identifica la riga iniziale dove abbiamo archiviato i dati dei clienti. Dalla riga 3 e fino alla riga 9 tramite un ciclo DO Loop scorriamo tutto l’archivio, usando la variabile i per identificare la riga (che vale 2) e la colonna 2, dove abbiamo inserito la ragione sociale del cliente. Nel ciclo la variabile i viene incrementata di 1 unità alla riga 8 in modo da poter scorrere tutte le righe dell’archivio fino a trovare una cella vuota nella colonna 2 che interromperà l’esecuzione del codice in quanto l’istruzione inserita alla riga 3 viene stabilito come fine ciclo la presenza di una cella vuota nella colonna 2 che indica la fine dell’archivio.

Mentre il ciclo scorre le righe vengono letti i valori alle coordinate di riga i e colonna 2 e caricati nella matrice elemento per poi usarla per popolare il ListBox1 con l’istruzione AddItem, presente alla riga 7. Alla riga 9 la parola chiave Loop ci riporta a inizio del ciclo, alla riga 3, e si ripetono tutte le operazioni fino alla riga 9 che terminano quando viene trovata una cella vuota nella colonna 2 che segnala la fine dell’archivio. La riga 10 con l’istruzione ListIndex si Indica al programma che vogliamo far apparire come prima voce dell’elenco nel ListBox, la prima voce dell’elenco dell’archivio clienti, se avessimo assegnato a ListIndex il valore 1 avremmo come prima voce la seconda presente nell’elenco dei clienti, perché questo tipo di controllo ha come valore iniziale “0” [zero], per cui la prima voce presente nell’elenco di questo controllo avrà come valore List 0, la seconda valore 1, la terza valore 2 e così di seguito.

A questo punto del programma avremmo il ListBox1 con l’elenco dei clienti, se notate presenta un pallino sulla sinistra del nome del cliente, questa opzione è possibile ottenerla agendo sulla proprietà ListStyle dalla finestra delle proprietà una volta selezionato il controllo come evidenziato in Figura 3 dalla freccia rossa.

Fig. 3

Quando selezioniamo un cliente nel ListBox1 facendo clic col mouse su uno di loro, tutti i controlli TextBox verranno popolati con i dati presenti nell’archivio sfruttando l’evento Click del controllo ListBox tramite questo codice

Codice:
Private Sub ListBox1_Click()
1.	p = ListBox1.ListIndex + 2
2.	vedi
End Sub
Alla riga 1 ritorniamo ad usare l’istruzione ListIndex, che abbiamo appena visto, oltre a quanto appena detto possiamo aggiungere che per conoscere la riga del foglio a cui corrisponde la voce selezionata dobbiamo sommare al valore di ListIndex il valore 2 in quanto rappresenta il numero di riga iniziale dell’archivio anagrafico, pertanto la variabile p rappresenta il numero di riga iniziale del nostro archivio. Dobbiamo inoltre tenere presente che la variabile p è stata dichiarata pubblica a inizio modulo, per cui utilizzabile in tutte le routine del modulo

Fig. 4

Alla riga 2 viene richiamata la routine vedi, che si occupa di popolare tutti i controlli TextBox con i dati del cliente scelto. Il codice della routine è il seguente:

Codice:
Private Sub vedi() 
TextBox1.Text = Sheets("clienti").Cells(p, 1)            'cod
TextBox2.Text = Sheets("clienti").Cells(p, 2)            'rag.sociale
TextBox3.Text = Sheets("clienti").Cells(p, 3)            'indirizzo
TextBox4.Text = Sheets("clienti").Cells(p, 4)            'cap
TextBox5.Text = Sheets("clienti").Cells(p, 5)            'città
TextBox6.Text = Sheets("clienti").Cells(p, 6)            'provincia
TextBox7.Text = Sheets("clienti").Cells(p, 7)            'p.iva
TextBox8.Text = Sheets("clienti").Cells(p, 8)            'pagamento
TextBox9.Text = Sheets("clienti").Cells(p, 9)            'banca+agenzia
TextBox10.Text = Sheets("clienti").Cells(p, 10)        'iban
TextBox11.Text = Sheets("clienti").Cells(p, 11)        'email
TextBox12.Text = Sheets("clienti").Cells(p, 12)        'telefono
TextBox13.Text = Sheets("clienti").Cells(p, 13)        'telefono diretto
TextBox14.Text = Sheets("clienti").Cells(p, 14)        'fax
TextBox15.Text = Sheets("clienti").Cells(p, 15)        'responsabile
TextBox16.Text = Sheets("clienti").Cells(p, 16)        'cellulare
End Sub
Credo che sia molto semplice il codice esposto, si prendono tutti i valori presenti nel foglio clienti alle coordinate di riga p e colonna fissa data dalle impostazioni dell’archivio anagrafico che abbiamo visto in figura 1 e si inseriscono nei vari controlli TextBox

Nota: Con il termine colonna fissa si intende una colonna definita da un numero preciso e NON da una variabile

Abbiamo citato varie volte la routine cancella, vediamo ora il suo codice
Codice:
Private Sub cancella()
1.	conta = 1
2.	For conta = 1 To 16
3.	Controls("TextBox" & conta) = ""
4.	Next conta 
End Sub
Alla riga 1 assegniamo alla variabile conta il valore 1 e alla riga 2 viene usata in un ciclo For per scorrere tutti I controlli TextBox, tenendo presente che la variabile conta determina il valore iniziale del ciclo, sempre nella riga 2 viene determinato il valore finale del ciclo, che nel nostro caso è rappresentato dal valore 16 che corrisponde al numero dei controlli che vogliamo svuotare. Alla riga 3, usiamo l’operatore di concatenamento & per “incollare” il valore della variabile conta, che rappresenta il contatore del ciclo, alla stringa TextBox ottenendo così la sintassi esatta per identificare i vari controlli (TextBox1, TextBox2 etc.) e assegnare così ai vari TextBox il valore di stringa vuota tramite le due virgolette poste dopo il segno di uguale. Alla riga 4 la parola chiave Next seguita dal nome della variabile conta (il contatore del ciclo) ci riporta alla riga 2 di inizio ciclo e si ripetono le operazioni appena descritte fino al raggiungimento del valore finale del ciclo.

Possiamo ora vedere le azioni svolte dai 3 pulsanti presenti nella Form. Il pulsante Uscita risulta molto semplice e oramai conosciuto per uscire da tutte le Form di VBA, questo è il codice

Codice:
Private Sub CommandButton1_Click() 
Unload Me
End Sub
L’ultimo pulsante presente nella Form è Inserisci Nuovo che si occupa di inserire un nuovo cliente. In questo contesto all’inserimento di un nuovo cliente viene assegnato un codice cliente numerico progressivo, questa non è da ritenere un’operazione indispensabile, il programma funziona anche con codici cliente personalizzati, possiamo considerarlo come un esempio per esporre una tecnica che ci permette di velocizzare le operazioni nei nostri programmi. La tecnica di cui parlo è quella di usare un foglio di appoggio che non è altro che un normale foglio di lavoro in cui andremo a inserire i dati più significativi che ci consentono di semplificare e velocizzare i nostri listati rendendo più lineare la programmazione dei nostri progetti. La struttura del foglio di appoggio Setup è la seguente

Fig. 5

Utilizzeremo il foglio di appoggio inserendo nelle varie righe della prima colonna (A) tutte le descrizioni delle operazioni che ci interessano e poi nella colonna 2 (B) inseriamo i dati che andremo ad utilizzare nelle nostre procedure. Come potete vedere dalla figura 5 il foglio di appoggio non viene utilizzato solo per creare un progressivo del codice cliente, ma dalle descrizioni delle varie operazioni si può ipotizzare che l’uso di questa “tecnica” all’interno dei nostri progetti sia molto vasta e diffusa. Passiamo ora a vedere il codice della routine di inserimento nuovo cliente

Codice:
Private Sub CommandButton3_Click() 
1.	cancella
2.	Mt = Mt & "Attenzione vuoi inserire un nuovo Cliente Confermi?" & Chr(13) & Chr(13)
3.	rs = MsgBox(prompt:=Mt, Title:="Gestione Clienti", Buttons:=vbYesNo + vbQuestion)
4.	If rs = vbNo Then Exit Sub
5.	x = Sheets("Setup").Cells(1, 2)
6.	TextBox1.Text = x + 1
7.	Sheets("Setup").Cells(3, 2) = True
8.	TextBox2.SetFocus
End Sub
Commentiamo il codice. Alla riga 1 c’è la chiamata alla solita routine cancella che svuota tutti I campi poi alla riga 2 e alla riga 3 ci sono le istruzioni che si occupano di portare a video un messaggio di avviso dell’azione che si sta per compiere, rimanendo in attesa di una risposta dall’utente che deve avvenire tramite la selezione del tasto Si oppure del tasto No. Alla riga 4 utilizziamo una condizione IF per uscire dalla routine nel caso si sia deciso di abbandonare la richiesta cliccando sul tasto No della finestra di avviso. Questo è il messaggio

Fig. 6

Se abbiamo deciso di proseguire con l’inserimento di un nuovo cliente cliccando sul pulsante Si, alla riga 5 assegniamo alla variabile x il valore che abbiamo precedentemente scritto con altra routine, che vedremo poco sotto, nella riga 1 e colonna 2 del foglio di appoggio Setup e alla riga 6 assegniamo tale valore al controllo TextBox1 della Form incrementandolo di 1 unità. In questo modo con una sola riga di codice abbiamo ottenuto il codice cliente in forma progressiva. Alla riga 7 del listato andiamo a scrivere il valore True alla riga 3 e colonna 2 del foglio setup, questa scrittura la utilizzeremo come Flag (bandierina) per segnalare ad altra routine da dove proviene una determinata richiesta. Nel nostro caso dobbiamo far sapere alla routine che si occupa di salvare tutti i dati che stiamo facendo un nuovo inserimento, per cui dobbiamo calcolare la riga in cui andare a scrivere i nuovi dati. Nel caso di un nuovo cliente si deve trovare la prima riga vuota dell’elenco e in quella inserire i nuovi dati. Alla riga 8 portiamo il focus, cioè portiamo il cursore sul controllo TextBox2 in attesa dell’inserimento da parte dell’utente della ragione sociale del cliente. Passiamo ora al pulsante Salva che si occupa di salvare i dati di un cliente nell’archivio anagrafico tramite questo codice

Codice:
Private Sub CommandButton2_Click() 
1.	If Sheets("Setup").Cells(3, 2) = True Then
2.	Application.ScreenUpdating = False
3.	Sheets("clienti").Select
4.	ultima = Cells(Rows.Count, 1).End(xlUp).Row
5.	p = ultima + 1
6.	Sheets("Setup").Cells(1, 2) = TextBox1.Text
7.	Sheets("Setup").Cells(3, 2) = False
8.	ElseIf Sheets("Setup").Cells(3, 2) = False Then
9.	End If
10.	Sheets("clienti").Cells(p, 1) = TextBox1.Text           'cod
11.	Sheets("clienti").Cells(p, 2) = TextBox2.Text           'rag. sociale
12.	Sheets("clienti").Cells(p, 3) = TextBox3.Text           'indirizzo
13.	Sheets("clienti").Cells(p, 4) = TextBox4.Text           'cap
14.	Sheets("clienti").Cells(p, 5) = TextBox5.Text           'città
15.	Sheets("clienti").Cells(p, 6) = TextBox6.Text           'provincia
16.	Sheets("clienti").Cells(p, 7) = TextBox7.Text           'P.iva
17.	Sheets("clienti").Cells(p, 8) = TextBox8.Text           'Pagamento
18.	Sheets("clienti").Cells(p, 9) = TextBox9.Text           'Banca
19.	Sheets("clienti").Cells(p, 10) = TextBox10.Text         'Iban
20.	Sheets("clienti").Cells(p, 11) = TextBox11.Text         'email
21.	Sheets("clienti").Cells(p, 12) = TextBox12.Text         'Telefono1
22.	Sheets("clienti").Cells(p, 13) = TextBox13.Text         'Telefono diretto
23.	Sheets("clienti").Cells(p, 14) = TextBox14.Text         'fax
24.	Sheets("clienti").Cells(p, 15) = TextBox15.Text         'responsabile
25.	Sheets("clienti").Cells(p, 16) = TextBox16.Text         'cellulare
26.	aggiorna
27.	cancella
End Sub
Alla riga 1 tramite un ciclo If verifichiamo se si tratta di un salvataggio normale o di un nuovo inserimento, infatti se il valore contenuto nella cella alla riga 3 colonna 2 del voglio setup contiene il valore di True (Vero) allora si tratta di un nuovo cliente e vengono eseguite tutte le istruzioni del ciclo fino alla riga 7. Alla riga 2 evitiamo il saltellio dello schermo e alla riga 3 selezioniamo il foglio clienti. Alla riga 4 assegniamo il valore numerico, tramite una funzione, dell’ultima riga scritta alla variabile ultima e alla riga 5 assegniamo alla variabile p il valore della variabile ultima incrementata di 1 unità, in questo modo il valore di p rappresenta il valore numerico della riga che andrà a ricevere i nuovi dati del cliente. Alla riga 6 il valore contenuto nel TextBox1 (che sarebbe il codice cliente) viene scritto nella riga 1 colonna 2 del foglio setup. Se ricordate al clic sul pulsante Nuovo inserimento abbiamo letto il valore dell’ultimo codice cliente inserito nel foglio setup e lo abbiamo incrementato di 1 unità. Alla riga 7 andiamo a scrivere nel foglio setup alla riga 3 colonna 2 il valore di False in modo che nelle normali operazione di modifica di un campo qualsiasi non vengano interpretate come nuovi inserimenti. Alla riga 8 poniamo una condizione in caso il valore letto nel foglio setup alla riga 3 colonna 2 sia Falso, ma in questo caso non viene eseguita nessuna operazione in quanto alla riga 9 termina il ciclo If.

Con il codice presente dalla riga 10 alla riga 25 vengono sostituiti i valori presenti nel foglio clienti alle coordinate di riga p e colonna fissa con il valore contenuto nei controlli TextBox. Alla riga 26 viene richiamata la routine aggiorna, che ripopola il controllo ListBox, se questo non avvenisse, e andiamo a modificare solo il nome del cliente, tale modifica non comparirebbe nel ListBox, mentre invece ricaricando i dati avremo istantaneamente la modifica fatta anche nel ListBox. Alla riga 27 viene richiamata la solita routine cancella, che svuota tutti i controlli TextBox
___________________________________

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