

Gerarchia Articoli




mar 24 2008
Corso VBA #10 : Userform e codice per Combobox
Pubblicato da :Alex | 6354 letture |
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.
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: |
|







Home
Articoli
Downloads
Informazioni
Utility















