Una famiglia di software per fogli di calcolo Microsoft con strumenti per l'analisi, la creazione di grafici e la comunicazione dei dati.
Ciao Giuseppe,
eccomi qui con un problema sicuramente stupido ma che non cappisco proprio dove possa essere l'errore che genera quanto segue:
Ho su una userform :
1 listbox
1 combobox
2 textbox
1 commandbutton
la listbox viene popolata da dati su tre colonne con questo codice
Private Sub UserForm_Initialize()
Me.LB_Crew.RowSource = "A2" & ":" & "C" & Range("A2").End(xlDown).Row
End Sub
all'evento click della listbox ho inserito questo codice:
Private Sub LB_Crew_Click()
Cells(LB_Crew.ListIndex + 2, 1).Select
CB_Rank.Text = LB_Crew.List(LB_Crew.ListIndex, 0)
TB_Surname.Text = LB_Crew.List(LB_Crew.ListIndex, 1)
TB_Nationality.Text = LB_Crew.List(LB_Crew.ListIndex, 2)
End Sub
sotto al commandbutton ho inserito questo codice che mi aggiorna i dati sul foglio di lavoro se modifico la combobox oppure le due textbox ove sono stati caricati i dati della listbox all'evento click della stesa.
Private Sub Update_Click()
ActiveCell = Me.CB_Rank.Text
ActiveCell.Offset(0, 1) = Me.TB_Surname.Text
ActiveCell.Offset(0, 2) = Me.TB_Nationality.Text
End Sub
Adesso il problema è:
perche quando clicco sul commandbutton mi cambia solo la prima riga di comando?
Ho eseguito l'istruzione in modalità debug ed ho notato che al momento che clicco sul command button la routine esegue la prima riga di comando e poi salta all'evento click della listbox per poi tornare alla seconda riga di comando del commandbutton.
Facendo così mi ricarica nelle textbox i dati originali della lista e non mi esegue mai l'aggiornamento.
Ho già fatto tantissime volte questo tipo di operazione ed è per questo che non riesco a capire dove sbaglio.
Sembra una cosa così banale ma purtroppo ho bisogno del vostro aiuto.
Quando si fa clic su il controllo CommandButton, la prima istruzione modifica il valore di una cella nella prima colonna dell'intervallo che carica il controllo ListBox (tramite la sua proprietà RowSource). Questo scatena l'evento click della ListBox. In realtà l'evento click del controllo ListBox viene chiamato in modo ricorsivo più volte fino a quando VBA termina la procedura.
In Excel, si eviterebbe tale comportamento non voluto con lo sfruttamento della proprietà Application.EnableEvents ma, purtroppo, non esiste una proprietà analoga per la class Userform. Tuttavia, si può superare questo inconveniente con l'uso di una variabile, dichiarato al livello del modulo della Userform, per imitare il comportamento della proprietà EnableEvents in Excel.
Nel seguente codice, utilizzo la variabile bDisable, che dichiaro alla testa del modulo, prima di qualsiasi procedura. Nella routine Click del controllo CommandButton, io imposto, come prima istruzione, il valore True alla variabile bDisable e, come ultima istruzione, restituisco il suo valore a False. Nella routine Click della ListBox, come prima istruzione, controllo lo stato della varibile bDisable: nel caso che il suo valore sia True, le seguente istruzioni non vengono eseguite e il controllo del codice torna alla prossima istruzione della procedura chiamante ossia la routine Click del CommandButton. In questo modo ognuna delle istruzioni della routine Click del CommandButton verranno esguite.
Se la routine Click del controllo ListBox venga scatenata in qualunque modo altro che una chiamata dal CommandButton, il valore della varibile bDisable sarebbe False e, quindi, le sue istruzioni verrebbero eseguite senza alcun impedimento.
Pertanto, prova qualcosa del genere:
'=========>>
Option Explicit
Public bDisable As Boolean
'--------->>
Private Sub UserForm_Initialize()
Me.LB_Crew.RowSource = _
"A2" & ":" & "C" & Range("A2").End(xlDown).Row
End Sub
'--------->>
Private Sub Update_Click()
On Error GoTo XIT
bDisable = True
With Me
ActiveCell.Resize(1, 3).Value = _
VBA.Array(.CB_Rank.Text, .TB_Surname.Text, _
.TB_Nationality.Text)
End With
XIT:
bDisable = False
End Sub
'--------->>
Private Sub LB_Crew_Click()
If bDisable Then Exit Sub
Cells(LB_Crew.ListIndex + 2, 1).Select
With Me.LB_Crew
Me.Update.Caption = .List(.ListIndex, 0)
Me.TB_Surname.Text = .List(.ListIndex, 1)
Me.TB_Nationality.Text = .List(.ListIndex, 2)
End With
End Sub
'<<=========
===
Regards,
Norman