Gestione foglio da userform

Anonimo
2015-02-17T18:19:07+00:00

Ho trovato molto interessante il file di esempio   gestionefogliodauserform_2.xls

http://answers.microsoft.com/

Ho apportato alcune piccole modifiche e non riesco a capire i motivi del malfunzionamento

Avete la possibilità di aiutarmi??

1- Ho aggiunto FoglioARCHIVIO per poter nascondere sia Registro che Dati

2- Aggiunte colonne da E a L intestandole Col5 -> Col12  Per avere più dati su ogni RECORD 

           (Non posso più usare AddItem 0-9 per caricare la ListBox ma devo usare RowSource)

3- Nella ListBox si possono visualizzare fino a max 10 colonne  (Me ne bastano 4 o 5 per avere la possibilità di individuare il RECORD scelto)

4- Aggiunte TextBox5 e TextBox6  (Mi servono  12 TextBox per visualizzare tutti i Dati del RECORD ma nell'esempio visualizzo dati Col8 e Col12)

PROBLEMI RISCONTRATI

A- Usando RowSource per caricare i Dati, la Sub MODIFICA non gira correttamente in quanto nel momento in cui arriva all'istruzione    

 .Range("B" & lng).Value = dbl         salta a  Private Sub ListBox1_Click()  che va a ricaricare nelle TextBox i dati presenti in ListBox 

 andando a cancellare la "modifica" che si vuole apportare (per esempio caricare il Record di Gastone999 e cambiarlo in Gastone111...Non funziona)

Non riesco a capire perchè usando AddItem la sequenza dell'esecuzione delle istruzioni è corretta, mentre con RowSource salta a Private Sub ListBox1_Click()

'Sub che pulisce le TextBox

Private Sub mPulisciTextBox()

    With Me

        .TextBox1.Text = ""

        .TextBox2.Text = ""

        .TextBox3.Text = ""

        .TextBox4.Text = ""

        .TextBox5.Text = ""         '------Aggiunta

        .TextBox6.Text = ""         '------Aggiunta

    End With

End Sub

'Al click sulla ListBox1

Private Sub ListBox1_Click()

    'Richiamo la Sub che polola la ListBox

    Call mPopolaTextBox

End Sub

'Sub che popola le TextBox

Public Sub mPopolaTextBox()

    With Me

        .TextBox1.Text = .ListBox1.List(.ListBox1.ListIndex, 0)

        .TextBox2.Text = CDbl(.ListBox1.List(.ListBox1.ListIndex, 1))

        .TextBox3.Text = CDate(.ListBox1.List(.ListBox1.ListIndex, 2))

        .TextBox4.Text = .ListBox1.List(.ListBox1.ListIndex, 3)

        .TextBox5.Text = .ListBox1.List(.ListBox1.ListIndex, 7)         '------Aggiunta

        .TextBox6.Text = .ListBox1.List(.ListBox1.ListIndex, 11)        '------Aggiunta

    End With

End Sub

Private Sub mCaricaListBox()     '--------------------------------------------- MODIFICATA, usando  RowSource

    Dim rng As Range

    sh.Select

    lRiga = sh.Range("A" & sh.Rows.Count).End(xlUp).Row

    Set rng = sh.Range(Cells(2, 1), Cells(lRiga, 12))    'Definisco TUTTA l'area da utilizzare nella ListBox

    With Me.ListBox1

        '.ColumnCount = 5  'rng.Columns.Count

        .RowSource = sh.Name & "!" & rng.Address

        '.RowSource = "RECORD" 'Prova con Nome Area

    End With

End Sub

B- Cosa altrettanto strana è che la   Private Sub cmdInserisci_Click()    funziona correttamente (usando F8 ho verificato la corretta sequenza nell'esecuzione)

C- Con queste impostazioni e le Sub così definite, mi da errore se ho i Fogli Nascosti quando vado a definire il RANGE 

 (potrei mettere nel ciclo Scopri e Nascondi ogni volta)

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
2015-02-19T14:25:24+00:00

PROBLEMI RISCONTRATI

A)

Non riesco a capire perchè usando AddItem la sequenza dell'esecuzione delle istruzioni è corretta, mentre con RowSource salta a Private Sub ListBox1_Click()

A)

RowSource e AddItem non hanno lo stesso funzionamento.

L'esempio fa riferimento appunto ad AddItem.

Ad esempio, semplice sequenza di numeri da 1 a 3 in Foglio1 celle A1:A3.

UserForm con una Listbox ed un pulsante.

Codice della UserForm semplificato:

'Private Sub UserForm_Initialize()

'    ListBox1.RowSource = "Foglio1!A1:A3"

'End Sub

Private Sub UserForm_Initialize()

    Dim lng As Long

    For lng = 1 To 3

        ListBox1.AddItem (lng)

    Next

End Sub

Private Sub CommandButton1_Click()

    ListBox1.AddItem (4)

End Sub

Se fai click sul pulsante, ti permette di aggiungere un Item.

Se commenti l'evento Initialize e togli il commento all'altro evento Initialize, vedi come non ti è più permesso di modificare lo stato della Listbox. In pratica RowSource *lega* la ListBox alla sorgente che definisci e non è modificabile se non ridefinendo la sorgente.

La risposta è stata utile?

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2015-02-19T14:13:20+00:00

[...]

    NON ho capito come inserire le Sub di Controllo_Evento, ma mi hai dato l' INPUT giusto per trovare il workaround che mi serviva.

[...]

P.S.  Sarebbe comunque INTERESSANTE se qualcuno riuscisse a capire il VERO motivo di questo strano funzionamento ANOMALO se si usa RowSource

Ciao BarSte,

quel "Controllo_Evento" è un esempio per indicare una routine generica di un "Evento" di un generico "Controllo"; da sostituire col nome della routine che fa al caso tuo, tipo TextBox1_Change , dove TextBox1 è il nome del controllo e Change l'evento. Come appunto hai fatto.

Quanto all'evento Click generato dal nuovo valore assegnato a RowSource non c'è nulla di anomalo in quanto viene generato selezionando un valore per un controllo; e quando cambia RowSource cambia anche il valore del controllo, giusto?

La risposta è stata utile?

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2015-02-18T11:23:15+00:00

PROBLEMI RISCONTRATI

A- Usando RowSource per caricare i Dati, la Sub MODIFICA non gira correttamente in quanto nel momento in cui arriva all'istruzione    

 .Range("B" & lng).Value = dbl         salta a  Private Sub ListBox1_Click()  che va a ricaricare nelle TextBox i dati presenti in ListBox 

 andando a cancellare la "modifica" che si vuole apportare (per esempio caricare il Record di Gastone999 e cambiarlo in Gastone111...Non funziona)

Non riesco a capire perchè usando AddItem la sequenza dell'esecuzione delle istruzioni è corretta, mentre con RowSource salta a Private Sub ListBox1_Click()

Ciao BarSte,

riguardo quanto qui su quotato non entro nel merito specifico ma faccio un'osservazione generale.

Come sai, nel modello degli oggetti di Excel esiste la: 

Property EnableEvents As Boolean

Membro di Excel.Application

appunto per evitare che si scatenino eventi a catena non desiderati, mentre non esiste, che io sappia, analoga possibilità nel modello degli oggetti MSForms. Occorre quindi arrangiarsi come ai tempi degli antichi romani con una variabile, globale o a livello di modulo, che faccia da semaforo.

Circa così:

Option Explicit

Private mblnStop As Boolean

Private Sub NomeControllo_Evento1()

    mblnStop = True

    ' istruzione che scatena eventi

    mblnStop = False

End Sub

Private Sub NomeControllo_Evento2()

    If mblnStop Then Exit Sub

    ' Eccetera

End Sub

Da usare quando proprio non se ne può fare a meno, perché spesso, ma non sempre, eventi indesiderati si evitano studiano meglio il codice.

La risposta è stata utile?

0 commenti Nessun commento

4 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2015-02-19T11:47:31+00:00

    Grazie Maurizio,

        NON ho capito come inserire le Sub di Controllo_Evento, ma mi hai dato l' INPUT giusto per trovare il workaround che mi serviva.

    Ho usato come mi hai suggerito una variabile, globale o a livello di modulo

              Option Explicit

              Private mblnStop As Boolean

    in  Private Sub UserForm_Initialize()  la setto a False

    mblnStop = False

    mentre nella

    Private Sub cmdModifica_Click()    che mi dava i problemi la setto subito a True e la "resetto" a fine sub

    mblnStop = True

    Infine nella

    Private Sub ListBox1_Click()     ho messo il controllo 

    If mblnStop Then Exit Sub

    in modo tale che se si attiva in modo errato durante il ciclo della Sub  cmdModifica_Click()   --->   ESCE

    Non so se sia la cosa più corretta.... sembra però che funzioni....

    Intanto GRAZIE

    P.S.  Sarebbe comunque INTERESSANTE se qualcuno riuscisse a capire il VERO motivo di questo strano funzionamento ANOMALO se si usa RowSource

    Come spiegato nel POST iniziale basta prendere il File di esempio di Mauro e sostituire l'originale Private Sub mCaricaListBox  con quella che ha il RowSource

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2015-02-17T18:33:21+00:00

    Segnalo che perchè si verifichi l'anomalia alla Sub MODIFICA  non serve aggiungere TextBox nemmeno le colonne, è sufficiente Modificare la Sub mCaricaListBox()  usando RowSource al posto di AddItem..... l'inserimento di un nuovo Record però avviene correttamente

    La risposta è stata utile?

    0 commenti Nessun commento