Discussione: Corso VBA
Visualizza messaggio singolo
Vecchio 01-06-2014, 10.25.41   #25
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
#5

Inserimento Articoli

Vediamo ora come inserire un articolo tramite VBA direttamente nel foglio Preventivi. Essendo il foglio Listino uno dei punti focali della procedura, ricordiamo che è stato diviso per categorie merceologiche ed è strutturato come si vede in figura 1

Fig. 1

Ogni categoria ha a disposizione 14 colonne e sono separate da una colonna vuota (quella nera), la riga 1 ospita il titolo della categoria e la riga 2 le etichette delle varie colonne. Dalla riga 3 vengono inseriti gli articoli con i relativi dati. Fatta questa premessa, possiamo inserire gli articoli cliccando sul pulsante Inserisci Articoli che visualizzerà una finestra di dialogo in cui è possibile selezionare la categoria dell’articolo che mostrerà tutti gli articoli della stessa in una casella di riepilogo, che una volta selezionati possono essere inseriti nel foglio Preventivi. La finestra di dialogo è così strutturata

Fig. 2

Per popolare il primo Listbox con i nomi delle varie categorie è stato inserito nell’evento UserForm_Activate questo codice:
Codice:
Private Sub UserForm_Activate()
1.	If [P14] = "" Then MsgBox "Prima devi creare un nuovo documento", vbExclamation: End
2.	i = 1
3.	Do Until Sheets("Listino").Cells(1, i) = Empty
4.	FormArt.ListBox1.AddItem (Sheets("Listino").Cells(1, i).Value)
5.	i = i + 15
6.	Loop
End Sub
Alla riga 1 viene effettuato un controllo sulla cella P14 che corrisponde al numero del documento se contiene dei valori oppure se è vuota. Nel caso la cella fosse vuota significa che non è stata seguita la procedura di creazione di un nuovo documento e in questo caso la routine viene fermata e si rimanda un avviso all’operatore che deve creare un nuovo documento con un avviso come questo

Fig. 3

Dalla riga 2 alla riga 6 tramite un ciclo Do Loop si scorre la riga 1 con un salto di 15 colonne fino a trovare una colonna vuota che determina l’uscita dal ciclo e contestualmente viene riempito il ListBox con i valori trovati nelle colonne. Il procedimento è abbastanza semplice e già visto in altre lezioni, viene usata la variabile i e posta uguale a 1 e con il ciclo Do Loop si scorre tutto il foglio “Listino” nell’intervallo di riga 1 e colonna i, che al primo ciclo i vale 1, per cui la ricerca inizia dalla riga 1 colonna 1, notare che la variabile è stata inserita nell’enunciato come riferimento di colonna, per cui nel ciclo la riga rimarrà fissa mentre varieranno i riferimenti di colonna, in pratica mentre il flusso del programma scorre tutte le colonne della riga 1 vengono inseriti anche i valori che rappresentano il nome della categoria al ListBox, dove FormArt è il nome assegnato alla Userform come si vede in figura

Fig. 4

Per rilevare i nomi delle categorie presenti nella riga 1 del foglio Listino viene usata la variabile i in un ciclo, sapendo che il foglio è diviso in colonne, che costituiscono le varie categorie, e ogni categoria è composta da 14 colonne ed è divisa dalla prossima categoria da una colonna vuota (quella nera). Il nome della categoria è collocato nella prima colonna, e le colonne che ci sono tra un nome di categoria e l’altro sono 15 per cui se viene incrementato il valore della variabile i di 15 unità, e considerando che i al primo ciclo vale 1, la seconda categoria si trova alla colonna [i+15] cioè alla 16° colonna, come la terza categoria è situata alla colonna [i+15] cioè [16+15]=31, perché al secondo giro del ciclo la variabile i assume il valore 16.

Si ripete tutto questo finchè non viene trovata una colonna vuota [Empty] e il ciclo si ferma. Ora il primo Listbox è stato riempito con i nomi delle categorie, e cliccando su una voce vengono riportati tutti gli articoli in essa inseriti, come visto in figura 2. Per popolare il secondo ListBox è stato inserito nell’evento ListBox1_Clik il seguente codice
Codice:
Private Sub ListBox1_Click()
1.	posiz = (ListBox1.ListIndex + 1) * 15 - 14 ' calcolo la colonna
2.	If ListBox2.ListCount >= 1 Then ListBox2.Clear
3.	i = 3
4.	Do Until Sheets("Listino").Cells(i, posiz) = Empty
5.	With Sheets("Listino")
6.	elemen = .Cells(i, posiz + 1)
7.	End With
8.	ListBox2.AddItem elemen
9.	i = i + 1
10.	Loop
11.	Cancella
End Sub
Alla riga 1 del listato viene calcolata la colonna in cui cercare gli articoli della categoria selezionata, per cui si sfrutta l’evento Clik cominciando dalla funzione ListBox1.ListIndex, e possiamo capirne il funzionamento modificando il listato in questo modo
Codice:
Private Sub ListBox1_Click()
posiz = (ListBox1.ListIndex + 1) 
MsgBox posiz 
End Sub
Se facciamo “girare” questa routine ci appare un box come quello raffigurato qui sotto

Fig. 5

Ora è facile intuire che cliccando su una voce del Listbox la funzione riporta la posizione numerica della voce in elenco, in sostanza cliccando sulla prima voce riporta il valore 1, sulla seconda il valore 2 e così di seguito, ritornando al listato originale, risulta che la variabile posiz cliccando sulle voci del Listbox assume il valore calcolato in questo modo

Voce 1 = 1*15-14 = 1
Voce 2 = 2*15-14 = 16
Voce 3 = 3*15-14 = 31

Perché i valori 15 e 14? Perché il foglio che raccoglie le categorie degli articoli ha un intervallo di 15 colonne (compresa quella vuota) tra una categoria e l’altra. Per esempio, se l’intervallo fosse stato di 10 colonne si dovrebbe moltiplicare per 10 e sottrarre 9. In definitiva i valori 1-16-31 sono i numeri di colonna in cui sono collocate le categorie e nelle quali si devono scorrere le righe per trovare gli articoli inseriti. Alla riga 2 del listato viene eseguita una “conta” delle voci presenti nel ListBox2 e si verifica che il Listbox2 sia vuoto, per cui se il numero di voci nel Listbox2 sono maggiori o uguali a 1 allora vengono cancellate. Alla riga 3 si pone la variabile i uguale a 3 che rappresenta la riga di inizio in cui cercare gli articoli, dichiarandola con valore = 3 decidiamo di partire dalla terza riga, perché prima riga è destinata al nome della categoria, la seconda alle etichette delle colonne e dalla terza si trovano gli articoli. Il seguito del codice svolge la ricerca degli articoli e li aggiunge nel Listbox

Dalla riga 4 alla riga 10 si ripete l’operazione vista per il ListBox1, con la sola differenza che vengono incrementate le righe invece delle colonne finchè non viene trovata una riga vuota [= Empty] e tutte le voci trovate vengono caricate nel Listbox. Da notare che è stata usata la notazione +1, alla riga 6 del listato in quanto è stato preferito caricare nel Listbox2 la descrizione dell’articolo, che è più rappresentativa per riconoscere l’articolo, e si trova nella colonna a fianco di quella processata. Per caricare la colonna processata si deve togliere il valore +1 e il ListBox2 sarebbe stato popolato con il codice dell’articolo invece della descrizione
___________________________________

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