Trasferire dati da Combobox a foglio

 

Può succedere che si abbia la necessità di trasferire il contenuto di una UserForm su o più di uno dei fogli.

Iniziamo allora col preparare il nostro lavoro.

La tabella da preparare, se già non ne abbiamo una:

  A B C D E F G
1 cod. art. descrizione unità mis Q.tà Prezzo IVA Tot
2 ca1 descrizionearticolo1 misura 1 1 100000 0,04 104000
3 ca2 descrizionearticolo2 misura 2 1 12000 0,1 13200
4 ca3 descrizionearticolo3 misura 3 1 14000 0,1 15400
5 ca4 descrizionearticolo4 misura 4 1 12000 0,2 14400
6 ca5 descrizionearticolo5 misura 5 1 100000 0,2 120000
7 ca6 descrizionearticolo6 misura 6 1 1000 0,04 1040
8 ca7 descrizionearticolo7 misura 7 1 13000 0,1 14300
9 ca8 descrizionearticolo8 misura 8 1 14000 0,1 15400
10 ca9 descrizionearticolo9 misura 9 1 12000 0,2 14400
11 ca10 descrizionearticolo10 misura 10 1 100000 0,2 120000
12 ca4 descrizionearticolo4 misura 4 1 12000 0,2 14400
13 ca3 descrizionearticolo3 misura 3 1 14000 0,1 15400

La zona o le zone dove trasferire i dati mostrati dalla Userform (io ne ho preparate 2:

Una nello stesso foglio ed una nel secondo foglio

trasferimento dati     trasferimenti dati

Come ultima operazione da fare nel foglio è disegnare un pulsante per chiamare la routine che mostrerà la Userform.

trasferimento dati

Finito di disegnare il pulsante apparirà una finestra come questa

trasferimento dati

Possiamo per il momento chiuderla senza fare alcuna scelta. All'assegnazione della macro potremmo tornarci dopo.

Il lavoro nel VBA

Ora possiamo passare in ambiente VBA per preparare il nostro codice:

Lavoreremo in due moduli come è mostrato in questa immagine:

trasferimento dati     trasferimento dati

 

Compiute queste operazioni nel modulo1 scriveremo queste istruzioni:

Sub Start()
UserForm1.Show
End Sub

Nel modulo Userform1 dobbiamo lavorare su diversi eventi

Private Sub UserForm_Activate()

Private Sub ComboBox1_Change()

Private Sub CommandButton2_Click() (OK)

Private Sub CommandButton1_Click() (CHIUDI)

UserForm_Activate

In questo evento della Userform Preleviamo i dati dal Foglio di lavoro relativi alla descrizione della seconda colonna.

Viene prima definito l'intervallo da cui possiamo prelevare i nostri dati

Quindi, facendo riferimento a questo intervallo copieremo tutta la seconda colonna nella Combobox: ComboBox1.AddItem (Intervallo(R, 2))

Private Sub UserForm_Activate()
Dim Intervallo As Range
Dim Righe, Colonne, R
Righe = Range("A1").CurrentRegion.Rows.Count
Colonne = Range("A1").CurrentRegion.Columns.Count
Set Intervallo = Range("A1").CurrentRegion.Offset(1, 0).Resize(Righe - 1, Colonne)
ComboBox1.Clear
For R = 1 To Intervallo.Rows.Count
ComboBox1.AddItem (Intervallo(R, 2))
Next
End Sub

ComboBox1_Change()

Ci spostiamo ora sulla Combobox.

Dopo aver cercato l'articolo scelto nella Combobox ci fermiamo sulla relativa riga e copiamo i giusti dati nelle giuste Textbox:

If Intervallo(R, 2) = Articolo Then ....

Private Sub ComboBox1_Change()
Dim Intervallo As Range
Dim Righe, Colonne, R
Dim Articolo
Righe = Range("A1").CurrentRegion.Rows.Count
Colonne = Range("A1").CurrentRegion.Columns.Count
Set Intervallo = Range("A1").CurrentRegion.Offset(1, 0).Resize(Righe - 1, Colonne)
Articolo = ComboBox1.Value
With Intervallo
For R = 1 To Intervallo.Rows.Count
If Intervallo(R, 2) = Articolo Then
TextBox1.Value = Intervallo(R, 5)
TextBox2.Value = Intervallo(R, 6)
TextBox3.Value = Intervallo(R, 1)
End If
Next
End With
End Sub

CommandButton2_Click() (OK)

Qui il codice è leggermente più lungo del necessario:

Nel primo passo eseguo l'operazione trasferendo i dati nel foglio attivo

Nel secondo passo eseguo un'azione a distanza trasferendo i dati in un foglio differente da quello attivo

Come si vede i passi seguiti nel codice cono simili

Ma prima di eseguire l'operazione facciamo un controllo sulla Combobox: se questa è vuota si esce dalla routine senza eseguire alcunchè (If ComboBox1.Value = "" Then)

Private Sub CommandButton2_Click()
' OK
Dim Intervallo_R As Range
Dim Intervallo_D As Range
Dim RigaStart, Riga, Righe, Colonne, Col
If ComboBox1.Value = "" Then
MsgBox "Occorre scegliere un articolo", vbCritical, "ATTENZIONE"
Exit Sub
End If
' prima soluzione: scrittura nel foglio attivo
RigaStart = 31
Righe = Cells(RigaStart, 1).CurrentRegion.Rows.Count
Colonne = Cells(RigaStart, 1).CurrentRegion.Columns.Count
Set Intervallo_R = Cells(RigaStart, 1).CurrentRegion.Offset(1, 0)
Riga = Intervallo_R.Rows.Count
Intervallo_R(Riga, 2) = ComboBox1.Value
Intervallo_R(Riga, 1) = TextBox3
Intervallo_R(Riga, 3) = TextBox1
Intervallo_R(Riga, 4) = TextBox2
' seconda soluzione: scrittura in un foglio diverso da quello attivo
Set Intervallo_D = Sheets("Foglio2").Range("A1").CurrentRegion.Offset(1, 0)
Righe = Intervallo_D.Rows.Count
Intervallo_D(Righe, 2) = ComboBox1.Value
Intervallo_D(Righe, 1) = TextBox3
Intervallo_D(Righe, 3) = TextBox1
Intervallo_D(Righe, 4) = TextBox2
End Sub

CommandButton1_Click() (CHIUDI)

Il pulsante per chiudere il form

Come si vede non c'è nulla di particolarmente complesso.

E' da notare solo la coppia di istruzioni che chiude la Userform e libera la memoria impegnata a gestirla.

Private Sub CommandButton1_Click()
'chiudi
Unload UserForm1
Set UserForm1 = Nothing
End Sub

Il lavoro finale

Ma non è finita qui.

Nel primo passo non abbiamo collegato il pulsante disegnato sul foglio a nessuna macro perchè ancora non era pronta.

Quindi ora possiamo tornare sul Foglio di lavoro di Excel per compiere questa ultima operazione:

Clik destro sul pulsante e dal menù contestuale visibile qui sotto scegliere la voce Assegna macro per far apparire la finestra vista all'inizio della pagina.

trasferimento dati

Ora è tutto. Buon lavoro.