Discussione: Corso VBA
Visualizza messaggio singolo
Vecchio 01-06-2014, 10.20.05   #23
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
#3

Struttura Foglio Principale

La scelta dell’aspetto grafico è uno dei momenti più delicati quando si crea un nuovo programma. Innanzi tutto bisogna tenere presente che il foglio deve essere strutturato in modo da poter presentare un layout adeguato ad un documento commerciale, pertanto si deve prestare attenzione a dove vengono posizionati i vari campi e al loro contenuto, che deve essere conforme al documento che si sta preparando. Iniziamo suddividendo le colonne e le righe e dimensionare la loro larghezza, che nel nostro esempio riporta queste dimensioni:

Colonna A = 0,5 dalla B alla K = 6 L e M = 4 N = 6 O e P = 4 Q = 8, mentre le righe sono tutte alte 14 ad eccezione di: riga 2 = 37 11, 14, 16 e 55 = 18 12 e 15 = 7. Il foglio così dimensionato si presenta come in figura sotto riportata

Fig. 1

Mentre invece nella parte finale del documento, dove totalizziamo gli importi, è stato inserito un campo note e un campo per l’accettazione del preventivo da parte del cliente; la struttura si presenta come in figura 2

Fig. 2

In questo nostro esempio è stata definita l’area di lavoro principale nel foglio “Preventivi”, che ne abbiamo appena visto la struttura, ora per emettere un preventivo si devono eseguire queste operazioni.

1) Come prima operazione si deve cliccare sul pulsante Nuovo documento, tramite il quale verrà inserita la data corrente e il numero del documento
2) Successivamente apparirà un box in cui scegliere il cliente destinatario del documento
3) In seguito vanno compilati i campi Agente e Trasporto agendo sulle frecce di selezione del campo
4) Infine si devono inserire gli articoli cliccando sul pulsante Inserisci Articoli e scegliere gli articoli dal box che apparirà

Una volta eseguite queste operazioni il documento è compilato in tutte le sue parti e si può eseguire la stampa e salvare il documento in archivio premendo il pulsante “Memorizza”. Per automatizzare queste operazioni si inizia cliccando sul pulsante Nuovo Documento che manda in esecuzione questo codice:

Codice:
Sub nuovo()
1)	If Left(ActiveSheet.Name, 10) = "Preventivi" Then
2)	svuota_prev
3)	[M14] = Date
4)	[P14] = Sheets("Setup").[B1].Value + 1  ' incremento n° preventivo
5)	Sheets("Setup").[B2] = False            ' Flag
6)	calcola
7)	cliente
8)	End If
9)	[H14].Select
End Sub
Nota: Il codice sorgente esposto NON include un numero davanti ad ogni linea, La numerazione delle linee dei listati rappresentati è stata usata solo per facilitare l’identificazione e la discussione di particolari linee nei vari listati

La procedura inizia con un ciclo IF alla riga 1, che consente l'esecuzione della macro solo se il foglio "Preventivi" è attivo. Il compito della riga di codice sopra esposta è quella di leggere, partendo da sinistra, il nome del foglio attivo tramite l’istruzione ActiveSheet.Name per 10 caratteri e se il valore verificato è uguale a Preventivi esegue il resto del codice, altrimenti salta tutte le istruzioni ed esce dalla Sub. Per personalizzare questo procedimento si devono contare i caratteri del nome del foglio e dopo l'istruzione ActiveSheet.Name mettere la cifra dei caratteri contati separati da una virgola. Alla riga 2 la macro svuota_prev si occupa di svuotare tutti i campi del foglio, in quanto si deve partire col foglio pulito; il codice è il seguente

Codice:
Sub svuota_prev()
    Range("M6:M8,B11:L11,B14:Q14,B17:Q48,P50:Q50,P52:Q52,P54:Q54").ClearContents
    Sheets("Setup").Range("B2:B4,B8:B9,B11:B12").ClearContents
End Sub
Se avete personalizzato la struttura del vostro foglio dovete modificare gli intervalli di cella elencati nell'istruzione Range inserendo quelli che conterranno i vostri dati, viene inoltre cancellata anche parte dei dati del foglio Setup, dove vengono memorizzate le impostazioni del programma utilizzate anche in altre procedure durante la stesura del preventivo. A tal proposito è opportuno sapere che viene usato un foglio di appoggio nominato Setup per memorizzare informazioni utili alle varie routine, sia per velocizzare le procedure che per semplificare il reperimento di dati importanti. Alla riga 3 viene inserita la data nel foglio di lavoro, assicuratevi che la cella sia formattata nel modo giusto per ricevere il formato data che più preferite e alla riga 4 si assegna il numero di preventivo andando a leggere il valore presente nella cella B1 nel foglio Setup.

La numerazione univoca per un preventivo non è una procedura richiesta dalla vigente normativa, risulta però molto comoda e utile nella gestione futura della documentazione emessa. Nel nostro esempio viene memorizzato il numero del documento quando si esegue la routine di salvataggio sia in archivio che nel foglio Setup, in modo che emettendo un nuovo documento, conoscendo il numero dell’ultimo preventivo emesso, risulta facile numerare progressivamente i preventivi. Osservando in Fig. 1, il numero del preventivo è situato nella cella P14 che nel codice della macro è stata rappresentata in valore assoluto con la forma [P14] (che equivale a scrivere; Range("P14")) ed è stato posto il suo valore uguale al contenuto della cella B1 del foglio Setup, dove viene memorizzato il numero dell’ultimo preventivo emesso, che incrementandolo di 1 quando si emette un nuovo preventivo, si ottiene il numero progressivo per il nuovo preventivo e, al tempo stesso, una numerazione univoca dei documenti

Fig. 3

La riga 5 rappresenta un Flag (bandierina), che viene usato come indicatore dell’operazione in corso memorizzando nella cella B2 del foglio Setup un valore Booleano espresso con la dicitura FALSE oppure TRUE. Per il calcolatore risulta impossibile sapere se si sta operando su un nuovo documento oppure su un preventivo già memorizzato in archivio. In pratica questa semplice operazione servirà per contraddistinguere un nuovo preventivo, memorizzando il valore Booleano FALSE da un preventivo già memorizzato che stiamo modificando, utilizzando il valore TRUE. Quando viene eseguita l’operazione di memorizzazione in archivio di un preventivo, se il valore della cella B2 del foglio Setup è uguale a False, non viene richiesta nessuna azione all’utente, in quanto si tratta di un nuovo preventivo, mentre invece se il valore della cella B2 è uguale a True, significa che l’utente sta modificando un documento presente in archivio e il programma avverte l’operatore che il preventivo era già in memoria, chiedendo l'autorizzazione a salvare le modifiche fatte con un avviso come questo

Fig. 4

Altra riga 6 viene richiamata la routine calcola, vediamo il suo codice e di cosa si occupa.

Codice:
Private Sub calcola()
1.	Dim mydate, mystr
2.	mydate = [M14]
3.	mymonth = Month(mydate)
4.	posiz = mymonth * 8 - 7            'colonna
5.	Sheets("Setup").[B4] = posiz    'scrivo la colonna
6.	m = 2
7.	Do Until Sheets("Archivio").Cells(m, posiz).Value = Empty
8.	m = m + 30
9.	Loop
10.	Sheets("Setup").[B3] = m  ' scrivo n° di riga
End Sub
Questa routine ha il compito di reperire le coordinate di riga e colonna nel foglio Archivio, che conterrà tutti i preventivi emessi, suddividendoli per periodo (mese), facilitandone la ricerca e la consultazione; la struttura del foglio Archivio è così definita

Fig. 5

Approfondiremo in seguito e in maniera più dettagliata la struttura di questo foglio, ora proseguiamo a commentare il codice. Alla riga 1 vengono dichiarate due variabili, e alla riga 2 il valore della variabile mydate viene prelevato dalla cella N14 in cui è stata inserita la data del documento tramite la routine Nuovo. Alla riga 3 viene calcolato il mese corrente in formato numerico per cui Gennaio =1, Febbraio =2 etc. e alla riga 4 viene utilizzata la variabile posiz per memorizzare la colonna da utilizzare per salvare il preventivo in base al mese di emissione, con un calcolo matematico espresso in questo modo. Supponiamo, per esempio, di essere nel mese di Febbraio (per cui 2), utilizzando l’espressione rappresentata nella riga 4 il codice diventa: posiz = 2 * 8 - 7 che risulta 16-7 = 9.
Come si può vedere in Fig. 5 la prima colonna del mese di Febbraio corrisponde a I, che in forma numerica è la nona colonna, e sarà utilizzata come colonna iniziale per salvare i dati del mese di febbraio.

Alla riga 5 il valore della variabile posiz viene memorizzato nella cella B4 del foglio Setup. Ora si deve reperire il numero di riga che riceverà i dati del preventivo, pertanto dalla riga 6 alla riga 9 con un ciclo Do Loop scorriamo tutto il foglio Archivio alla colonna definita dalla variabile posiz, fino a trovare una riga vuota, che rappresenterà la riga da utilizzare. Questa ricerca inizia dalla riga 6 ponendo una variabile (m) uguale a 2, che rappresenta la riga iniziale dell’archivio dati, in quanto la riga uno viene utilizzata per le intestazioni delle colonne. Con il ciclo Do loop si scorrono le righe con un "salto" di 30 righe ad ogni ciclo, che rappresenta il valore in righe dello spazio destinato a contenere i dati. Una volta calcolata la riga, viene memorizzato il suo valore nella cella B3 del foglio Setup con l’istruzione alla riga 10. Riassumendo i valori della variabile m e della variabile posiz corrispondono alla riga e alla colonna da utilizzare per salvare i dati. Una dichiarazione molto importante a riguardo è l'uso delle variabili, che devono essere dichiarate Public (pubbliche), pertanto condivisibili in tutte le routine, ad inizio del listato in questo modo

Public m As Integer, posiz As Integer

Alla riga 7 viene eseguita la routine cliente, che si occupa di mostrare a video un box con una casella a discesa in cui scegliere a quale cliente intestare il preventive. Il box si presenta in questo modo

Fig. 6

Cliccando sulla freccia del box comparirà un elenco a discesa dei clienti archiviati, selezionando il cliente interessato e cliccando sul pulsante Procedi verranno caricati i dati del cliente dall’archivio anagrafico e inseriti negli appositi campi del preventivo. Vedremo il codice e le procedure di questa routine più avanti, adesso completiamo il listato iniziale con l’ultima istruzione presente nella routine Nuovo in cui viene selezionata la cella H14 che contiene l’agente di riferimento per il preventivo. In questo campo e nel campo trasporto, per facilitare l'inserimento di valori ripetitivi e al tempo stesso evitare di continuare a scriverli viene usato Convalida Dati, per inserire nelle rispettive celle i dati che verranno scelti di volta in volta. I due campi si presentano in questo modo

Fig. 7

Fig. 8

Per inserire nei due campi il menu a tendina si deve selezionare la cella e dal menù Dati - Convalida verrà portato a video un box come quello sotto riportato

Fig. 9

Cliccando sul box Consenti si deve scegliere la voce Elenco dal menu a tendina che compare e passando poi nel box Origine, cliccando sull'icona segnalata dalla freccia rossa nell’immagine sottostante, si può selezionare un intervallo di celle che i valori presenti in questo intervallo andranno a costituire l’elenco mostrato nel menu a tendina.

Fig. 10

Per inserire gli agenti e l’incaricato del trasporto utilizziamo il foglio di appoggio Setup, dove sono stati memorizzati i dati, come possiamo vedere in figura 3, dove alla riga 5 si trovano gli incaricati del trasporto (Mittente, Destinatario e Vettore) e nella riga successiva gli agenti commerciali dell’azienda.
Concludiamo questa prima parte con la routine collegata al pulsante Formule. A volte può succedere di dover ricorrere a modifiche manuali, oppure semplicemente a un copia/incolla di una riga, e si può correre il rischio che gli importi a seguito di queste operazioni non vengano calcolate, per cui basta cliccare sul pulsante per inserire automaticamente tutte le formule per calcolare gli importi e totalizzare il documento. La routine ha questo codice

Codice:
Sub formule()
1.	r = 17
2.	Do Until Sheets("Preventivi").Cells(r, 2) = Empty
3.	With Sheets("Preventivi")
4.	.Cells(r, 17).Formula = "=RC[-2]*RC[-3]"
5.	End With
6.	r = r + 1
7.	Loop

8.	[P50].Formula = "=sum(Q17:Q48)" 'totale imponibile
9.	[P52].Formula = "=(P50*22)/100" 'Importo iva
10.	[P54].Formula = "=sum(P50+P52)" 'totale ordine
End Sub
Con questo listato alla riga 1 si pone una variabile uguale a 17, che corrisponde alla prima riga che contiene gli articoli del preventivo, e si inserisce nella colonna 17 di ogni riga che viene trovata non vuota alle coordinate di riga r e colonna 2 la formula che calcola il prodotto tra la colonna prezzo e la colonna quantità. Successivamente alle righe 8-9 e 10 si inseriscono le formule per calcolare il totale imponibile del documento, l’importo iva e il totale documento.
___________________________________

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