Cicli su "Controlli". (ovvero sugli "Oggetti" posti su Userform)

Quando lavoriamo sulle UserForm, possiamo inserirvi degli "Oggetti" presi dalla finestrina degli strumenti che appare quando, nell'editor di visual basic, inseriamo o selezioniamo una UserForm. Questi oggetti: una TextBox, un CommandButton, una ComboBox, ecc. ecc., non sono altro che "Controlli" ActiveX.

Ogni Controllo viene identificato dal vba in funzione della Classe di appartenenza. Più Oggetti appartenenti alla stessa Classe vengono visti come "insiemi" omogenei, per esempio le TextBox ; tantè che se inseriamo più TextBox sulla nostra UserForm, per identificare l'oggetto, il vba provvede ad assegnare un numero progressivo ad ogni oggetto della stessa Classe inserito (avremo quindi: TextBox1, TextBox2, ecc.ecc.).

La numerazione progressiva dovrebbe semplificare la programmazione quando si debbano trattare più oggetti omogenei, per esempio con cicli For Each...Next oppure For I = 1 To X ..Next, in riferimento a ciò che vorremmo fosse compiuto su ogni oggetto dell'insieme.

A differenza di quanto avviene in Visual Basic, dove è possibile costruire una "Matrice di Controlli", che ci consentirebbe di assegnare un indice progressivo ad uno stesso "controllo" ripetuto (Text1(0), Text1(1), Text1(2), ecc.), favorendo quindi il riconoscimento di quale indice è interessato progressivamente dal ciclo For ...Next, in vba è necessario ricorrere all'insieme CONTROLS  (Controlli) tramite un indice, un numero o un nome.

Visto che tutte le TextBox hanno in comune almeno la parola Text, è possibile impostare una routine per intervenire sulle loro proprietà, per esempio per renderle visibili o invisibili:

For Each cnt In Controls

If Left(cnt.Name, 4) = "Text" Then

cnt.Visible = False '(oppure True)

End If

Next

Cioè : per ogni controllo (cnt) in Controlli (cioè gli "oggetti" presenti sull'UserForm), se le prime 4 lettere del nome del controllo sono uguali a Text, allora rendiamo invisibile il controllo.

Vediamo ora un esempio su come riempire, sfruttando l'insieme Controls, una serie di TextBox con i valori prelevati da celle del foglio di lavoro. Supponiamo di avere dieci TextBox, nelle quali vogliamo che vengano riportati i dati presenti in altrettante dieci celle, sulla stessa riga, e di cui sia resa attiva la prima cella a sinistra, dovremmo scrivere le istruzioni, una per ogni textbox, in questa maniera:

TextBox1 = ActiveCell.Offset(0, 1).Value
TextBox2 = ActiveCell.Offset(0, 2).Value
TextBox3 = ActiveCell.Offset(0, 3).Value
TextBox4 = ActiveCell.Offset(0, 4).Value
TextBox5 = ActiveCell.Offset(0, 5).Value

ecc.ecc. fino alla 10.

Sfruttando invece i Controls dell'oggetto UserForm, è possibile ridurre le istruzioni a poche righe, con un ciclo For ..Next, vediamo come:

For n = 1 To 10   '(n sarà incrementato di 1 da 1 a 10 ad ogni ciclo (10 sono sia le textbox, sia le celle))
UserForm1.Controls("TextBox" & n).Text = ActiveCell.Offset(0, n).Value
Next

ed avremo ottenuto il nostro risultato con solo tre righe di istruzioni. La variabile n cambia ad ogni ciclo, sia per indicare in progressione il nome del controllo TextBox, sia per identificare la colonna della cella.


Buon lavoro.


prelevato sul sito http://ennius.interfree.it