Trasferire dati di TextBox di UserForm a celle del foglio di lavoro

Ancora un esempio che mostra come trasferire dei dati introdotti in TextBox presenti su una UserForm, in modo da formare una tabella dati sul foglio di lavoro.

E' una condizione operativa che viene usata spesso nei nostri lavori e quindi vediamo come sia possibile usare delle istruzioni che si possono applicare, una volta per tutte,  in queste occasioni.

Le condizioni : da una UserForm che useremo come maschera di introduzione dati che inseriremo in apposite TextBox, dovremo trasferire questi dati sul foglio di lavoro, partendo da una determinata riga (che sceglieremo noi via codice), e scalando di una riga ad ogni introduzione. I dati saranno inseriti in altrettante celle, sulla stessa riga, per quanto saranno le TextBox. Non ci occuperemo del "Formato dati" nè del "Tipo di dati" che trasferiremo (peraltro già descritti su altri paragrafi di questa sezione), ma di reperire l'"indice riga" per identificare su quale riga copiare i dati, e come identificare le colonne. Questo esempio lo imposto su quattro TexBox, ma potrà essere usato su quante TextBox vorremo.

Ultima condizione: vogliamo creare un numero riga progressivo, che ci indichi il numero dei record (righe) presenti nella tabella

Private Sub CommandButton1_Click()
'queste istruzioni sotto cercano la prima riga in cui la prima cella (cioè la cella della 'colonna A sia vuota, a partire dalla riga 2 (iRow = 2). La colonna è identificata dal 'numero 1 nell'istruzione While Cells(iRow, 1). Se avessimo voluto creare la tabella a 'partire dalla colonna C, avremmo dovuto scrivere 3, cioè While Cells(iRow, 3)
Dim iRow As Integer
iRow = 2  
'si comincia dalla riga 2
While Cells(iRow, 1).Value <> ""
 'se la cella contiene dati, si passa alla successiva
iRow = iRow + 1
Wend
'trovata la riga con la cella vuota, inserisco i dati contenuti nelle textbox, trovando per
'ogni textbox la colonna (iRow
1,2,3,4,5). Poi per incrementare il numero progressivo, gli 'faccio leggere il numero presente nella riga sopra (con Offset), stessa colonna, ed 'aggiungo 1. In totale quindi useremo 5 celle sul foglio di lavoro, la prima ci servirà per il 'numeratore, e le altre quattro per ospitare i dati delle quattro TextBox.
Cells(iRow, 1) = Cells(iRow, 1).Offset(-1, 0) + 1
Cells(iRow, 2) = TextBox1
Cells(iRow, 3) = TextBox2
Cells(iRow, 4) = TextBox3
Cells(iRow, 5) = TextBox4
'poi dopo che ho copiato i dati sul foglio devo pulire le textbox per inserire nuovi dati
TextBox1 = ""
TextBox2 = ""
TextBox3 = ""
TextBox4 = ""

End Sub

Con questa routine credo di avere chiarito una procedura standard da seguire quando vorremo inserire dati da una maschera di introduzione dati a celle sul foglio di lavoro. E' possibile ovviamente, lavorando su un foglio, inserire dati su un altro foglio; sarà sufficiente indicare nelle istruzioni su quale foglio "scaricare" i dati, selezionando prima il foglio, e ritornando poi al foglio di partenza . Usando Application.ScreenUpdating=False, eviteremo i saltellamenti a video. Questa la modifica:

 

Private Sub CommandButton1_Click()
Application.ScreenUpdating = False
Sheets(2).Select
 'si seleziona un'altro foglio
Dim iRow As Integer
iRow = 2
While Cells(iRow, 1).Value <> ""
iRow = iRow + 1
Wend

Cells(iRow, 1) = Cells(iRow, 1).Offset(-1, 0) + 1
Cells(iRow, 2) = TextBox1
Cells(iRow, 3) = TextBox2
Cells(iRow, 4) = TextBox3
Cells(iRow, 5) = TextBox4

TextBox1 = ""
TextBox2 = ""
TextBox3 = ""
TextBox4 = ""
Sheets(1).Select 
 'si ritorna al foglio di partenza
End Sub

 

Se invece vogliamo vedere come compilare delle istruzioni che sfruttino un ciclo For...Next sugli insiemi, potremo sostituire le righe che identificano le TextBox e le Celle, in questa maniera (scrivo solo le istruzioni da modificare):

'...omissis

Wend 'da questa riga si sostituiscono le precedenti istruzioni con:

'la prima cella non la inseriamo nel ciclo perchè dispone un'istruzione singola, non comune 'alle altre celle (contatore)

Cells(iRow, 1) = Cells(iRow, 1).Offset(-1, 0) + 1

'iniziamo il ciclo dalla seconda cella ( n = 2 To..) a cui assegniamo però la Textbox1, quindi l'indice 'della textbox sarà uguale al valore di  n - 1 (n meno uno)
For n = 2 To 5
Cells(iRow, n) = UserForm1.Controls("TextBox" & n - 1).Text

'con lo stesso concetto dell'indice per le textbox, e di seguito nello stesso ciclo, facciamo 'pulire le textbox
UserForm1.Controls("TextBox" & n - 1) = ""
Next

 

Sheets(1).Select   'si ritorna al foglio di partenza

End Sub

Buon lavoro.

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