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:
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 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))
|