register.png   lostpass.png
Benvenuto nella Community di Alexsandra.it
05 Febbraio 2012 04:00:11
Shoutbox
Devi essere loggato per poter inserire un messaggio.

Faby
28/01/2012 13:48
Buon week end anche ate Delfi Smile

DELFINO
28/01/2012 11:03
buon sabato e buon weekend a tutti... E un bacio alle ragazze Bacio

Faby
27/01/2012 18:21
Ciao Angarat

angarat
27/01/2012 14:38
ciao belli e brutti Bacio ao! ciaooooo! Biggrin

Faby
26/01/2012 13:52
Ciao Delfi, sono di corsa.. a presto

Utenti Connessi
· Gianca05:01:48
· Alex08:02:10
· SALVO18:23:01
· Mirko 1 giorno
· carlo1973 1 giorno
· Spawn 2 giorni

· Totale iscritti: 553
· Nuovo iscritto: SALVO
RSS Feeds
Subscribe to our Feeds

Latest News Latest Articles
Le nostre rubriche

Quotidiani online

Siti Web Visti per Voi

Fotogallery
Siti Amici

Siti Amici

Noi diciamo no

No alla Pedofilia

Page Rank

Powered by  MyPagerank.Net

Pagerank
Award
Corso VBA #10 : Userform e codice per Combobox
Pubblicato da :Alex | 6354 letture | Stampa
Premessa

Nelle due lezioni precedenti abbiamo visto come possiamo personalizzare le nostre Form, abbiamo conosciuto i vari controlli e come modificarli, ora giunti a questo punto e visto anche l'argomento di grande utilità ho pensato di creare una form con i vari controlli e inserire il codice che interfacci la form con i dati di un foglio di Excel.

Dopo tanta teoria un esempio pratico è molto più utile per capire come usare i comandi che abbiamo visto finora. Cominciamo

Gestione Preventivi con VBA

Ho preparato un foglio con dei dati e l'ho strutturato così



Ho preso solo l'intestazione per mostravi i vari controlli usati, e tolto anche altri pulsanti, es. : numerazione univoca del preventivo, svuota documento etc.. che affronteremo più avanti.

Ora cominciamo a vedere cosa fanno i vari pulsanti che vedete nella, affronteremo il codice in maniera molto semplice, solo per farvi vedere come interfacciare VBA tramite delle Userform con i dati presenti nel foglio di lavoro, anche le userform saranno un po' spartane senza tanta grafica, il solo scopo è quello di vedere come strutturare il foglio di lavoro e come mettere il codice per elaborare i vari dati.

Iniziamo dal pulsante 'Cliente', ovvio che per emettere un documento qualsiasi dobbiamo avere un destinatario, può essere un cliente o un fornitore, intanto vediamo come caricare un cliente da una Form e vediamo anche il foglio dove archivieremo i clienti.

Il foglio dove archivieremo i clienti l'ho strutturato in questo modo.



Nel foglio vedete che è presente il pulsante 'Modifica/Inserisci', a questo associamo in un modulo questo codice

Sub anagraf()
Range("A1").Select
ActiveSheet.ShowDataForm
End Sub


Col comando ActiveSheet.ShowDataForm facciamo comparire una Form come questa



Come vedete è possibile inserire un nuovo cliente, eliminarlo, editarlo etc., ora con il foglio così strutturato vediamo il codice del pulsante 'Cliente'

Private Sub cli_ente()
FormCli.Show
End Sub


Questa chiamata và messa in un modulo (che abbiamo già visto come crearlo) e cliccando sul tasto 'Cliente' altro non facciamo che portare a video la form chiamata FormCli. Vediamo ora Form e codice



Come vedete nella form è presente un controllo Combobox e 2 controlli CommandButtons, vediamo ora il codice.

Private Sub UserForm_Activate()
Dim i As Long
Select Case Sheets("Clienti").Cells(3, 2)
Case Empty
i = 2
If Not (Sheets("Clienti").Cells(2, 2) = Empty) Then
Do Until Sheets("Clienti").Cells(i, 2) = Empty
ComboBox1.AddItem (Sheets("Clienti").Cells(i, 2).Value)
i = i + 1
Loop
End If
Case Else
With Sheets("Clienti")
FormCli.ComboBox1.List = .Range(.Cells(2, 2), .Cells(2, 2).End(xlDown)).Value
End With
End Select
End Sub


Ho fatto un codice un po' lungo, perché volevo usare i vari comandi che abbiamo trattato finora, in realtà basta solo usare l'ultimo Case per ottenere il popolamento del ComboBox, commentiamo ora il codice e vediamo come agisce. Abbiamo iniziato con un Select Case, partiamo dal 1° blocco

Select Case Sheets("Clienti").Cells(3, 2)
Case Empty
i = 2


L'enunciato Select Case si usa sempre nella forma Select Case [espressione] la nostra espressione è Sheets("Clienti").Cells(3, 2, cioè espresione diventa [nel foglio 'Clienti' alla riga 3 colonna 2] la nostra espressione di controllo, nel proseguo del codice vediamo che usiamo subito un Case Empty, cioè se la riga 3 colonna 2 è vuota, dichiariamo una variabile (i) = 2 e poniamo una condizione

If Not (Sheets("Clienti").Cells(2, 2) = Empty) Then

In pratica : Se nel foglio 'Clienti' la riga 2 non è vuota, vengono eseguite le istruzioni del ciclo IF. Possiamo dire che questo codice ci gestisce eventuali errori, se la riga 2 è vuota, allora non viene popolato il combobox con queste istruzione Case.

Ritorniamo ora alla prima istruzione Case e vediamo le altre righe di codice

Do Until Sheets("Clienti").Cells(i, 2) = Empty
ComboBox1.AddItem (Sheets("Clienti").Cells(i, 2).Value)
i = i + 1
Loop


In pratica, se la condizione viene soddisfatta (cioè che la riga (i) e la colonna 2 non è vuota facciamo un ciclo Do Loop per riempire il ComBox tramite il comando ComboBox1.AddItem, e cicliamo nel foglio Clienti alle coordinate di riga [i] e colonna 2. La riga i vale 2 al primo Loop, ma quando incontriamo l'istruzione i = i + 1 incrementiamo di 1 la nostra variabile, pertanto i assume il valore di 3, in questa maniera riempiamo il combobox fino alla fine del ciclo, che termina quando incontra una cella vuota nella colonna 2.

L'ultimo blocco (Case Else) [in ogni altra condizione] con l'istruzione

FormCli.ComboBox1.List = .Range(.Cells(2, 2), .Cells(2, 2).End(xlDown)).Value

Riempiamo tutto il combo trovando l'ultima cella scritta della colonna, che ci appare così



Se selezioniamo un cliente dalla lista la tendina ci chiude col nome del cliente scelto



A questo punto basta cliccare sul pulsante 'Procedi' per scrivere nel foglio alle coordinate programmate i dati che ci interessano. Vediamo il foglio com'è diventato



Abbiamo riempito I campi che ci interessavano semplicemente selezionando un cliente e cliccando su un pulsante. Vediamo il codice che ci ha permesso di fare questo

Private Sub CommandButton1_Click()
j = 2 + ComboBox1.ListIndex
With Sheets("Preventivi")
.Range("m6") = Sheets("clienti").Cells(j, 2) 'Rag. Sociale
.Range("m7") = Sheets("clienti").Cells(j, 3) 'Indirizzo
.Range("m8") = Sheets("clienti").Cells(j, 4) & " - " & Sheets("clienti").Cells(j, 5) 'cap + città
.Range("b11") = Sheets("clienti").Cells(j, 8) 'pagamento
End With
FormCli.Hide
End Sub

Vediamo subito la 1° riga j = 2 + ComboBox1.ListIndex che significa? Facciamo presto a capire cosa riporta quel codice, trasformiamo la nostra macro in questa

Private Sub CommandButton1_Click()
j = 2 + ComboBox1.ListIndex
msgbox j
With Sheets("Preventivi")
'.Range("m6") = Sheets("clienti").Cells(j, 2)
'.Range("m7") = Sheets("clienti").Cells(j, 3)
'.Range("m8") = Sheets("clienti").Cells(j, 4) & " - " & Sheets("clienti").Cells(j, 5)
'.Range("b11") = Sheets("clienti").Cells(j, 8) 'pagamento
'End With
'FormCli.Hide
End Sub


Abbiamo 'remmato' [inserendo l'apostrofo davanti ad una istruzione questa non viene eseguita e nel vecchio Quick Basic si usava la dicitura REM] ed inserito l'istruzione MsgBox j, eseguendo la macro ci viene riportato a video questo messaggio



Che significa il valore 5? In sottofondo vedete che ho selezionato il cliente 4, ripetiamo l'operazione con questo codice

j = ComboBox1.ListIndex
msgbox j




In questo modo restituisce 3.

Viene restituito questo valore perché La proprietà ListIndex contiene un indice della riga selezionata in un elenco. I valori di ListIndex sono compresi tra 1 e un numero minore di un'unità rispetto al numero totale di righe di un elenco. Quando selezioniamo una riga in un controllo ListBox o ComboBox, viene impostato automaticamente il valore di ListIndex. Il valore di ListIndex della prima riga di un elenco è 0, il valore della seconda riga è 1 e così via.

In sostanza se guardiamo vediamo che il cliente 4 è il 4° valore della lista, ma se la numerazione parte da 0 (zero) è giusto che venga riportato il valore 3. Allora abbiamo capito che è un indice, e per noi molto importante, ritorniamo al codice precedente

j = 2 + ComboBox1.ListIndex
msgbox j


che ci ha riportato il valore 5, però se andiamo a vedere noteremo che il cliente 4 è alla riga 5. Possiamo allora dedurre che sfruttando la proprietà ListIndex e aggiungendo il valore giusto (dato dalle righe di intestazione del foglio Clienti) riusciamo ad identificare la collocazione del cliente stesso.
A questo punto diventa abbastanza semplice scrivere nel foglio con un ciclo With

With Sheets("Preventivi")
.Range("m6") = Sheets("clienti").Cells(j, 2) 'Rag. Sociale
.Range("m7") = Sheets("clienti").Cells(j, 3) 'Indirizzo
.Range("m8") = Sheets("clienti").Cells(j, 4) & " - " & Sheets("clienti").Cells(j, 5) 'cap + città
.Range("b11") = Sheets("clienti").Cells(j, 8) 'pagamento
End With


In pratica diciamo : Scrivi nel foglio preventivi nella cella M6 il valore o contenuto che trovi nel foglio Clienti alla cella j (che vale 5) colonna 2. Di seguito manteniamo il valore di j (che è la riga del cliente selezionato e ci spostiamo con la colonna per andare a prendere i dati che ci interessano.

Sempre nella form di inserimento del cliente abbiamo anche il pulsante 'Annulla', in pratica serve a non eseguire nessuna procedura e ritornare al foglio di lavoro nascondendo la Form.
Il codice è questo

Private Sub CommandButton2_Click()
FormCli.Hide
End Sub


Come vedete molto semplice, con questo comando nascondiamo la form stessa, è possibile aggiungere o sostituire con hide la notazione Unload Me

Per ora ci fermiamo qui, spero che sia stata esauriente la spiegazione, nella prossima lezione tratteremo il ListBox, è un argomento un po' lungo e farlo ora potrebbe creare confusione, quando lo tratteremo vediamo come creare un archivio, come cercare i dati, creare un listino e caricare i vari documenti memorizzati.


Condividi Articolo
AddThis:
URL:
BBcode:
HTML:
Facebook Like:


php fusion  copyright © 2002 - 2011 by Nick Jones   Released as free software without warranties under GNU Affero

Theme designed by Benjamin Eriksen | PhpFusionBox.com | Edited and rewritten by Alex