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-14T05:58:57+00:00

    Buongiorno Giuseppe,

    P.S. non ti preoccupare della declassazione, lo faccio spesso anche io per fare prove.

    L'importante è sempre a fine mese :)

    LOL!!

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2016-10-14T05:47:18+00:00

    Buongiorno Norman,

    ovviamente non sono stato ad aspettare una tua risposta anche perchè sarebbe troppo comodo il lavoro fatto e buono e quindi sto smanettando cercando di individuare il problema.

    venendo a noi:

    Stamane ho pensato che probabilmente il problema poteva essere assiociato al rowsource e quindi ho modificato il codice della popolazione della listbox con AddItem ed ora funziona perfettamente. Inoltre ho trovato una discussione di Mauro sul filtro univoco ed ho popolato la combobox direttamente dalla stessa lista del foglio evitanto di prendere i dati da una seconda lista filtrata su un altro foglio.

    Però devo dire che secondo me hai centrato in pieno il punto.

    Penso che tutti i problemi sia dipedenti proprio dal SendKey perchè ho notato che ogni volta che apro quella sorta di menù si disabilita il BlocNum sulla tastierino numerico e devo poi attivarlo io.

    Non Un comando in excel possa fare uan cosa del genere, cioè agire sulla tastiera, ma a me succede solo quando ho questo programma aperto.

    A questo punto mi sa che è meglio che tolga questa sorta di menù altrimenti rischio di far un guaio quando poi andrò ad aggiornare realmente i dati dell'equipaggio.

    Grazie come al solito dei tuoi aiuti

    Ciao

    Giuseppe

    P.S. non ti preoccupare della declassazione, lo faccio spesso anche io per fare prove.

    L'importante è sempre a fine mese :)

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2016-10-14T01:46:08+00:00

    Ciao Giuseppe,

    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.

    Ebbene, ho fatto numerosi prove e non posso riprodurre il comportamento recalcitrante riscontrato da te!

    I risultati dei miei test sono stati indipendenti dal numero di record aggiornati, o quanto spesso il file sia stato aggiornato, chiuso, riaperto e nuovamente modificato.  Ho anche provato a chiudere una o entrambi le Userform e ho provato a modificare i record in ordine casuale. ma non sono riuscito ad ottenere i tuoi risultati.

    Ho perfino modificato, in stretto ordine, ogni record nella ListBox senza problema:

    Chiedo scusa per la tua retrocessione! :-)

    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.

    Se, a te, si trattasse sempre della selezione della prima riga della ListBox, saprei cosa cercare nel codice ma visto  che sembri che la riga sia selezionata in modo casuale, o almeno non costante, diventa molto più difficile. 

    Una cosa che viene in mente è il tuo utilizzo del metodo SendKeys. A meno che non fosse impossibile trovare un approccio alternativo, non utilizzerei mai il metodo SendKeys nel mio codice. Questo perchè, come è ben noto,  non è affidabile e perché spesso si comporta in modo imprevedibile in ambienti diversi. Tuttavia, è troppo tardi oggi per perseguire questa direzione di indagine e, in ogni caso, se non posso riprodurre il comportamento, sarebbe come cercare  un ago in un pagliaio nel buio!

    Nel frattempo, ti chiederei di spiegare una precisa sequenza di azioni per riprodurre il  comportamento, fin dall'avvio di Excel!  In questo modo potrei almeno confermare la mia capacità, o la mia incapacità, di riprodurre il comportamento riscontrato da te!

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2016-10-13T08:18:48+00:00

    Ciao Giuseppe,

    Guarderò il tuo file questo pomeriggio in quanto debbo andare below decks (sottocoperta) per un po'!

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento