Selezione riga da Listbox1 ed inserimento con Tasto CommandButton

Anonimo
2022-07-14T17:55:21+00:00

Buonasera a tutti,

ho un problema con del codice presente nella Userform1 precisamente nel tasto modifica/CommandButton8_Click, qundo clicco il predetto pulsante non inserisce TUTTI i dati nella riga selezionata dalla ListBox1, mi inserisce solo un dato e non tutti. Potete cortesemente dirmi perchè? Vi ringrazio per il cortese aiuto.

questo è il collegamento al file Nuovo Foglio di lavoro di Microsoft Excel REGISTRO.

https://1drv.ms/x/s!Arlj8dLhPwAFu3S589vT87B-LrTK?e=TbxPIG

Grazie per l'interessamento.

Private Sub CommandButton8_Click()
Dim iUr As Integer
' iUr = Me.ListBox1.ListIndex + 2
With Foglio1
' .Range("A" & Me.ListBox1.ListIndex + 2) = CDate(Me.TextBox1.Value)
''' .Range("B" & Me.ListBox1.ListIndex + 2) = Me.ComboBox1.Text
''' .Range("C" & Me.ListBox1.ListIndex + 2) = Me.ComboBox2.Text
' .Range("D" & Me.ListBox1.ListIndex + 2) = Me.TextBox2.Text
' .Range("E" & Me.ListBox1.ListIndex + 2) = Me.TextBox3.Text
' .Range("F" & Me.ListBox1.ListIndex + 2) = Me.TextBox4.Text
.Range("G" & Me.ListBox1.ListIndex + 2) = Me.TextBox5.Text
' .Range("H" & Me.ListBox1.ListIndex + 2) = Me.ComboBox3.Text
' .Range("I" & Me.ListBox1.ListIndex + 2) = Me.TextBox6.Text
' .Range("J" & Me.ListBox1.ListIndex + 2) = Me.TextBox7.Text
' .Range("K" & Me.ListBox1.ListIndex + 2) = CDate(Me.TextBox8.Value)
' .Range("L" & Me.ListBox1.ListIndex + 2) = Me.ComboBox4.Text
' .Range("M" & Me.ListBox1.ListIndex + 2) = Me.TextBox9.Text
' .Range("N" & Me.ListBox1.ListIndex + 2) = CDate(Me.TextBox10.Value)
' .Range("O" & Me.ListBox1.ListIndex + 2) = Me.ComboBox5.Text
' .Range("P" & Me.ListBox1.ListIndex + 2) = Me.ComboBox6.Text
' .Range("Q" & Me.ListBox1.ListIndex + 2) = Me.TextBox11.Text
' .Range("R" & Me.ListBox1.ListIndex + 2) = Me.TextBox12.Text
' .Range("S" & Me.ListBox1.ListIndex + 2) = Me.TextBox13.Text
' .Range("T" & Me.ListBox1.ListIndex + 2) = Me.TextBox14.Text
' .Range("U" & Me.ListBox1.ListIndex + 2) = CDate(Me.TextBox15.Value)
End With

' Me.ListBox1.Selected(Me.ListBox1.ListIndex + 2) = True
' Me.ListBox1.ListIndex = Me.ListBox1.ListIndex + 2
' Call mCaricaListBox1

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

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
2022-07-15T14:16:13+00:00

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:

[![Immagine](https://learn-attachment.microsoft.com/api/attachments/cb949a47-fc02-431e-b33d-b1dd6549799d?platform=QnA

A questo punto, premendo il pulsante Modifica (ossia CommandButton8), si verifica la seguente sequenza di eventi:

Viene avviata la procedura CommandButton8_Click

 [![Immagine](https://learn-attachment.microsoft.com/api/attachments/1602b07e-b7f9-4fcc-a556-5fa911a76672?platform=QnA

Quandi viene eseguita la prima istruzione di questa procedura, cioè

    **.Range("A" & Me.ListBox1.ListIndex + 2) = 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.

    [![Immagine](https://learn-attachment.microsoft.com/api/attachments/548a31da-93fd-4bdc-aa14-e9ce0e30e130?platform=QnA

Per ovviare a questi problemi, la mia revisione del codice introduce una variabile booleana, bDisableEvents As Boolean, il cui ambito è l'intero modulo di codice:

  [![Immagine](https://learn-attachment.microsoft.com/api/attachments/111f93b8-798e-4bcb-8876-6f7846816ee0?platform=QnA

Quindi, modifico il codice CommandButton8_Click per impostare questa variabile booleana su TRUE all'inizio della procedura e ripristinarne il valore su FALSE alla fine della procedura,

Nel caso della procedura problematica ListBox1_Click, la modifico così:

[![Immagine](https://learn-attachment.microsoft.com/api/attachments/4d8461b5-9a9b-4a4b-9949-27af02090da4?platform=QnA

Con queste revisioni al codice, quando l'utente preme il pulsante Modifica:

  • La procedura CommandButton8_Click viene lanciata (come prima)
  • 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

Immagine

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2022-07-14T20:04:37+00:00

Ciao Danilo,

ho un problema con del codice presente nella Userform1 precisamente nel tasto modifica/CommandButton8_Click, qundo clicco il predetto pulsante non inserisce TUTTI i dati nella riga selezionata dalla ListBox1, mi inserisce solo un dato e non tutti. Potete cortesemente dirmi perchè? Vi ringrazio per il cortese aiuto.

questo è il collegamento al file Nuovo Foglio di lavoro di Microsoft Excel REGISTRO.

https://1drv.ms/x/s!Arlj8dLhPwAFu3S589vT87B-LrTK?e=TbxPIG

Grazie per l'interessamento.

Private Sub CommandButton8_Click()
Dim iUr As Integer
' iUr = Me.ListBox1.ListIndex + 2
With Foglio1
' .Range("A" & Me.ListBox1.ListIndex + 2) = CDate(Me.TextBox1.Value)
''' .Range("B" & Me.ListBox1.ListIndex + 2) = Me.ComboBox1.Text
''' .Range("C" & Me.ListBox1.ListIndex + 2) = Me.ComboBox2.Text
' .Range("D" & Me.ListBox1.ListIndex + 2) = Me.TextBox2.Text
' .Range("E" & Me.ListBox1.ListIndex + 2) = Me.TextBox3.Text
' .Range("F" & Me.ListBox1.ListIndex + 2) = Me.TextBox4.Text
.Range("G" & Me.ListBox1.ListIndex + 2) = Me.TextBox5.Text
' .Range("H" & Me.ListBox1.ListIndex + 2) = Me.ComboBox3.Text
' .Range("I" & Me.ListBox1.ListIndex + 2) = Me.TextBox6.Text
' .Range("J" & Me.ListBox1.ListIndex + 2) = Me.TextBox7.Text
' .Range("K" & Me.ListBox1.ListIndex + 2) = CDate(Me.TextBox8.Value)
' .Range("L" & Me.ListBox1.ListIndex + 2) = Me.ComboBox4.Text
' .Range("M" & Me.ListBox1.ListIndex + 2) = Me.TextBox9.Text
' .Range("N" & Me.ListBox1.ListIndex + 2) = CDate(Me.TextBox10.Value)
' .Range("O" & Me.ListBox1.ListIndex + 2) = Me.ComboBox5.Text
' .Range("P" & Me.ListBox1.ListIndex + 2) = Me.ComboBox6.Text
' .Range("Q" & Me.ListBox1.ListIndex + 2) = Me.TextBox11.Text
' .Range("R" & Me.ListBox1.ListIndex + 2) = Me.TextBox12.Text
' .Range("S" & Me.ListBox1.ListIndex + 2) = Me.TextBox13.Text
' .Range("T" & Me.ListBox1.ListIndex + 2) = Me.TextBox14.Text
' .Range("U" & Me.ListBox1.ListIndex + 2) = CDate(Me.TextBox15.Value)
End With

' Me.ListBox1.Selected(Me.ListBox1.ListIndex + 2) = True
' Me.ListBox1.ListIndex = Me.ListBox1.ListIndex + 2
' Call mCaricaListBox1

Al cima del modulo di codice della Userform1, incolla:

'========>>

Option Explicit

Dim bDisableEvents As Boolean

Sostituisci le due procedure CommandButton8_Click e ListBox1_Click con la seguente modifica:

'-------->>

Private Sub CommandButton8_Click()

Dim iUr As Long 

Dim iIndex As Long 

bDisableEvents = True 

iIndex = Me.ListBox1.ListIndex + 2 

With Foglio1 

    .Range("A" & iIndex) = CDate(Me.TextBox1.Value) 

    .Range("B" & iIndex) = Me.ComboBox1.Text 

    .Range("C" & iIndex) = Me.ComboBox2.Text 

    .Range("D" & iIndex) = Me.TextBox2.Text 

    .Range("E" & iIndex) = Me.TextBox3.Text 

    .Range("F" & iIndex) = Me.TextBox4.Text 

    .Range("G" & iIndex) = Me.TextBox5.Text 

    .Range("H" & iIndex) = Me.ComboBox3.Text 

    .Range("I" & iIndex) = Me.TextBox6.Text 

    .Range("J" & iIndex) = Me.TextBox7.Text 

    .Range("K" & iIndex) = CDate(Me.TextBox8.Value) 

    .Range("L" & iIndex) = Me.ComboBox4.Text 

    .Range("M" & iIndex) = Me.TextBox9.Text 

    .Range("N" & iIndex) = CDate(Me.TextBox10.Value) 

    .Range("O" & iIndex) = Me.ComboBox5.Text 

    .Range("P" & iIndex) = Me.ComboBox6.Text 

    .Range("Q" & iIndex) = Me.TextBox11.Text 

    .Range("R" & iIndex) = Me.TextBox12.Text 

    .Range("S" & iIndex) = Me.TextBox13.Text 

    .Range("T" & iIndex) = Me.TextBox14.Text 

    .Range("U" & iIndex) = CDate(Me.TextBox15.Value) 

End With 

bDisableEvents = False 

End Sub

'-------->>

Private Sub ListBox1_Click()

Dim iUr As Long 

If bDisableEvents = True Then GoTo XIT 

iUr = Me.ListBox1.ListIndex + 2 

With Foglio1 

    Me.TextBox1.Value = .Range("A" & iUr) 

    Me.ComboBox1.Text = .Range("B" & iUr) 

    Me.ComboBox2.Text = .Range("C" & iUr) 

    Me.TextBox2.Text = Format(.Range("D" & iUr), "hh:mm")

    Me.TextBox3.Text = Format(.Range("E" & iUr),  "hh:mm")

    Me.TextBox4.Text = .Range("F" & iUr) 

    Me.TextBox5.Text = .Range("G" & iUr) 

    Me.ComboBox3.Text = .Range("H" & iUr) 

    Me.TextBox6.Text = .Range("I" & iUr) 

    Me.TextBox7.Text = .Range("J" & iUr) 

    Me.TextBox8.Value = CDate(.Range("K" & iUr)) 

    Me.ComboBox4.Text = .Range("L" & iUr) 

    Me.TextBox9.Text = .Range("M" & iUr) 

    Me.TextBox10.Value = CDate(.Range("N" & iUr)) 

    Me.ComboBox5.Text = .Range("O" & iUr) 

    Me.ComboBox6.Text = .Range("P" & iUr) 

    Me.TextBox11.Text = .Range("Q" & iUr) 

    Me.TextBox12.Text = .Range("R" & iUr) 

    Me.TextBox13.Text = .Range("S" & iUr) 

    Me.TextBox14.Text = .Range("T" & iUr) 

    Me.TextBox15.Value = CDate(.Range("U" & iUr)) 

End With 

XIT:

bDisableEvents = False 

End Sub

'<<--------

Nota che ho limitato la mia considerazione quasi esclusivamente all'interazione di queste due procedure e non ho tentato di esaminare il codice per altri controlli CommandButton.

===

Regards,

Norman

Immagine

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

3 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2022-07-15T15:39:33+00:00

    Ciao Danilo,

    Grazie Norman :-)

    per la delucidazione di merito.

    Prego! È sempre un piacere.

    Alla prossima.

    ===

    Regards,

    Norman

    Immagine

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2022-07-15T15:28:31+00:00

    Grazie Norman :-)

    per la delucidazione di merito.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2022-07-15T08:24:44+00:00

    Buongiorno Norman,

    Grazie per aver risposto, cortesemente potresti chiarirmi perchè in questo modo funziona?

    Gentilissimo come sempre.

    La risposta è stata utile?

    0 commenti Nessun commento