Una famiglia di software per fogli di calcolo Microsoft con strumenti per l'analisi, la creazione di grafici e la comunicazione dei dati.
Ciao Danilo,
Grazie per aver risposto, cortesemente potresti chiarirmi perchè in questo modo funziona?
Consideriamo il funzionamento effettivo del tuo codice in risposta alla modifica dei dati di un particolare record, ad esempio il record n. 10 nei tuoi dati. Selezionando e modificando i dati Userform per questo record, vedremo qualcosa del genere:
[, si verifica la seguente sequenza di eventi:
Viene avviata la procedura CommandButton8_Click
[ = CDate(Me.TextBox1.Value)**
Questa istruzione scrive la data inserita in TextBox1 nella colonna A del record di interesse in Foglio1.
Poiché il controllo ListBox1 è direttamente collegato al foglio di lavoro, tramite l'utilizzo della proprietà RowSource (vedi la procedura mCaricaListBox1), questa azione di scrittura dei dati nel foglio di lavoro avvia la procedura ListBox1_Click. A sua volta, l'evento ListBox_Click sovrascrive i dati della Userform con i dati correnti del foglio di lavoro. Di conseguenza, tutte le modifiche proposte dall'utente andranno perse, con la sola eccezione del primo dato riportato sul foglio, ovvero la data inserita nella Colonna A. 😒😒
Purtroppo, con l'esecuzione della procedura ListBox1_Click, viene eseguito l'evento Click di ciascuno dei controlli dati sulla Userform a cui è associata una procedura di evento Click. A loro volta, questi eventi Click possono chiamare gli eventi Click o Change di altri controlli.
.Quando tutti questi rami non intenzionali e i loro rami secondari del codice sono stati completati, il codice ritorna alla procedura di chiamata originale, Command_Button8_Click, pronto ad esegire **** la sua seconda istruzione, ovvero:
**.Range("B" & Me.ListBox1.ListIndex + 2) = Me.ComboBox1.Text**
Tuttavia, va notato che, a questo punto, la selezione della riga originale nel ListBox è stata cancellata e, di conseguenza, il valore ListIndex originale, ossia 10, è stato sostituito con -1.
Peggio ancora, con l'esecuzione della procedura ListBox1_Click, viene eseguito l'evento Click di alcuni controlli dati sulla Userform. Quando tutti questi rami non intenzionali e i relativi rami secondari del codice sono stati completati, il codice torna alla procedura di chiamata originale, Command_Button8_Click e si prepara a eseguire la sua seconda istruzione. Tuttavia, va notato che, a questo punto, la selezione della riga originale nel ListBox è stata cancellata e, di conseguenza, il valore ListIndex originale, ossia 10, è stato sostituito con -1.
Di conseguenza, con l'esecuzione di ogni successiva istruzione della procedura Command_Button8_Click, i dati della Userform (che non sono quelli voluti dall'utente) vengono scritti non nella riga di interesse ma nelle celle B:U della riga di intestazione in Foglio1.
[
- La nuova prima istruzione imposta il valore della variabile booleana su TRUE
- La seconda istruzione di questa procedura viene eseguita e scrive la data dalla prima ComboBox nella colonna A della riga di interesse in Foglio1 (come prima)
- Questa operazione di scrittura richiama la procedura ListBox1_Click (come prima)
- Quando viene avviata la procedura ListBox1_Click, la nuova prima istruzione verifica il valore della variabile booleana e, poiché il suo valore è TRUE, termina immediatamente quella procedura e restituisce il codice all'istruzione successiva della procedura CommandButton8_Click, in questo modo vengono evitati i problemi precedenti e il valore della proprietà ListIndex del controllo ListBox rimane invariata e in conformità con il record di dati selezionato dall'utente.
Per confermare questa spiegazione, e osservare i problemi in azione:
- Crea un punto di interruzione all'inizio di ogni procedura nel modulo del codice Userform
- Avvia la Userform con l'istruzione:
**Userform1.Show vbModeless** - Segui l'elaborazione del codice, passo dopo passo, premendo il tasto F8 nella finestra dell'editor di codice.
===
Regards,
Norman