problemi con un command button

Anonimo
2016-10-13T00:40:39+00:00

Buongiorno,

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.

Anticipatamente ringrazio

Saluti

Giuseppe

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2016-10-13T04:14:17+00:00

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

La risposta è stata utile?

0 commenti Nessun commento

8 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2016-10-13T07:52:55+00:00

    Ciao Norman,

    ti allego il mio file che è in fase di evoluzione.

    Per poter far apparire la userform incriminata vai su EDIT/Modify Maritime Crew e comparirà la userform.

    A questo punto cliccando su qualsiasi crew member e premendo il command button UPDATE, la selezione della listbox sale di 4/5 posti o alla prima riga. Si vede dal foglio excel sotto che in effetti la cella attiva resta sempre allo stesso posto ma sulla listbox no. Inoltre alla fine della istruzione sotto al command button ho inserito listbox setfocus in modo da ritornare alla listbox una volta aggiornati i dati. Pertanto avendo questo problemadevo usare il mouse per andare alla riga successiva senza poter usare le frecce di direzione dalla tastiera.

    Spero di essermi spiegato bene e comunque potrai vedere il file da qui:

    File di prova

    Grazie e buona giornata

    Giuseppe

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2016-10-13T07:16:45+00:00

    Ciao Giuseppe,

    eccomi ancora con un altro problema per lo stesso oggetto.

    Adesso, dopo aver modificato come da te indicato, va tutto bene ma ho notato che dopo aver aggiornato i dati la selezione della listbox automaticamente salta alla prima riga ed a volte 4/5 righe più su della riga selezionata.

    Si potrebbe ovviare anche a questo problema? Perchè se avessi dei dati da ordinare in sequenza è un po ' scocciante dover sempre cliccare alla riga seguente a quella appena aggiornata e non usare le frecce della tastiera.

    Per provare il codice che ho suggerito, avevo creato un file con una Userform, basando il file su quello che avevi spiegato e il codice che avevi postato. Nel mio file non riscontro questo comportamento:

    Pertanto, credo che ci debba essere qualcos'altro nel tuo codice e, per resolvere il problema, ti chiedere gentilmente di caricare un esempio problematico.

    Nel frattempo, potresti scaricare il mio file di prova Giuseppe20161013.xlsm a:

    https://www.dropbox.com/s/guckqqpcsj60g3y/Giuseppe20161013.xlsm?dl=0

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2016-10-13T06:13:28+00:00

    Ciao Norman,

    eccomi ancora con un altro problema per lo stesso oggetto.

    Adesso, dopo aver modificato come da te indicato, va tutto bene ma ho notato che dopo aver aggiornato i dati la selezione della listbox automaticamente salta alla prima riga ed a volte 4/5 righe più su della riga selezionata.

    Si potrebbe ovviare anche a questo problema? Perchè se avessi dei dati da ordinare in sequenza è un po ' scocciante dover sempre cliccare alla riga seguente a quella appena aggiornata e non usare le frecce della tastiera.

    Grazie

    Giuseppe

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2016-10-13T05:37:27+00:00

    Ciao Norman,

    che dire :) oltre a ringraziarti perchè mi hai anche aggiustato il codice da me scritto alla meglio maniera, ti ringrazio soprattutto per la spiegazione data che è la più importante per cercare di capire come gestire la userform.

    La cosa stranissima è che su altre applicazioni ha sempre funzionato quindi non riuscivo a capacitarmi dell'errore.

    Però dopo aver letto la spiegazione sono andato a controllare ove funzionava e mi sono reso conto che se anche il procedimento era lo stesso il command button interessato era una un'altra userform e non su quella dove veniva caricata la listbox mediante il rowsource.

    Penso sia questo il motivo per il quale la funzionava e qui no.

    Grazie come al solito e ci sentiamo al mio prossimo inceppo.

    Saluti a tutti ed anche a Mauro Gamberini che non sento da un po'.

    Ciao

    Giuseppe

    La risposta è stata utile?

    0 commenti Nessun commento