Inserimento di dati in un elenco direttamente dalla ComboBox che riporta l'elenco. - dal 04/09/04 pagina vista: volte

Un interessante esercizio per sfruttare la stessa ComboBox come inserimento di dati mancanti nell'elenco dei dati, riportato nella ComboBox. Una idea non mia, ma opportunamente adattata e modificata. Normalmente usiamo ComboBox su Userform, per reperire attraverso la proprietà RowSource della Combo, un elenco di dati (nomi, testo, numeri, ecc.) che possiamo selezionare per rendere il valore selezionato in qualche passaggio dei nostri lavori, per esempio rendere una TextBox uguale ad un nominativo scelto nella lista della combobox, oppure reperire valori da assegnare come variabili ad istruzioni vba, o altro ancora. Ma cosa succede se, nell'elenco della combo, non è presente un valore che ci servirebbe in quel momento? Dovremmo spostarci sul foglio con l'elenco, inserire il dato in una cella vuota del nostro elenco, assicurarci che la cella rientri nel range previsto nel RowSource, altrimenti modificarlo, ritornare sulla Form e nella ComboBox troveremo ora il dato aggiunto. Con le spiegazioni che seguono potremo farlo direttamente dalla Combobox, vediamo i passaggi:

  • identificazione dell'area che contiene o conterrà il nostro elenco ed assegnazione di un nome all'area (dal menù Inserisci/Nome/Definisci). Sarà importante considerare un'area (colonna) che contenga un certo numero di celle vuote, questo per consentire l'inserimento di nuovi valori. In assoluto è possibile definire un'area di celle completamente vuote. Sotto l'immagine della zona dell'esempio a cui è stato assegnato, con molta fantasia, il nome "nomi": da A1 a A20 sul Foglio2 :

  • assegnazione alla proprietà RowSource della ComboBox dell'area "nomi", sfruttando l'evento Activate della UserForm:

  • Private Sub UserForm_Activate()
    ComboBox1.RowSource = "nomi"
    End Sub

e questo sarà l'effetto che vedremo aprendo il menù a discesa della ComboBox: i nomi già presenti più un certo numero di righe vuote:

E questa la routine con relative spiegazioni, che inseriremo nell'evento Click della Combobox. Il concetto è semplice: sfrutteremo la proprietà ListIndex della combo che identifica il numero di Indice riga dei valori presenti (compreso le celle vuote) nella combo, per identificare il numero di riga corrispondente nell'area "nomi". Poichè in genere un Indice in vb parte dallo zero, ggiungeremo 1 per far corrispondere l'indice del valore selezionato al numero riga dell'area "nomi"

Private Sub ComboBox1_Click()
'con la variabile "riga" prendiamo il numero indice nella combobox
riga = ComboBox1.ListIndex + 1
'con la variabile "testo" prendiamo il valore selezionato nella combobox
testo = ComboBox1
'se "testo" sarà uguale a vuoto, allora
If testo = "" Then
10:

'si lancia una inputbox che ci chederà di inserire un valore da aggiungere, e con la 'variabile "dimmi" prendiamo il nuovo valore
dimmi = InputBox("INSERISCI IL NOME")
If dimmi = "" Then 
'se "dimmi" sarà vuoto, si lancia l'avviso e con GoTo 10
MsgBox ("ATTENZIONE INSERIRE IL NOME")
GoTo 10
'si rilancia la imputbox fino a che non si sia inserito un valore
End If
'altrimenti si passa subito il gruppo alla zona "nomi" dove si renderà la cella della colonna 'A, riga corrispondente alla variabile "riga", uguale a "dimmi"
dimmi = UCase(dimmi)
'questa riga solo se vorremo il testo tutto maiuscolo
Worksheets("Foglio2").Range("A" & riga) = dimmi

'poi si azzera (si rende vuoto) il Rowsource della combo altrimenti non si riesce a 'modificarne il valore
ComboBox1.RowSource = ""

'quindi si assegna il valore immesso con "dimmi" alla combo
ComboBox1 = dimmi
'e si ricarica il RowSource e si esce
ComboBox1.RowSource = "nomi"
End If

End Sub

Sotto, in sequenza: si seleziona, ad esempio, la seconda riga vuota sotto  l'ultimo nome, ed appare la inputbox nella quale introduciamo un nome:

questo sarà ciò che vedremo nella combobox, dopo premuto Ok:

e questo in nostro elenco "nomi" con il nuovo valore inserito nella riga corrispondente a quella selezionata nella combobox (e in maiuscolo):

Ciò che avremmo fatto con il valore selezionato nella combo non riguarda questo esercizio, ma se avessimo voluto rendere il valore selezionato in una textbox, sarebbe stato sufficiente inserire alla fine della routine vista sopra, dopo End If questa semplice istruzione:

  • End If
    TextBox1 = ComboBox1.Text
    End Sub

Buon lavoro.

prelevato sul sito www.ennius.altervista.org