Risultati da 1 a 6 di 6

Discussione: ListBox: controllo univocita degli item inseriti



  1. #1
    L'avatar di AiaceT
    Clicca e Apri
    Data Registrazione
    Oct 2015
    Località
    Roma
    Età
    47
    Messaggi
    67
    Versione Office
    Excel 2003
    Likes ricevuti
    2
    Likes dati
    12

    Question ListBox: controllo univocita degli item inseriti

    Salve a tutti, sto lavorando ad un form contenente una textbox, tre cmdbutton e tre oprionButton.
    Nella txtbox viene inserito un codice poi trasferito in una specifica cella del foglio di lavoro in funzione dell'optionbutton selezionato tramite il click su un cmdbutton.
    A seguito del click su cmdbutton il valore della txtbox e quello acquisito dalla optionbutton vengono associati in una variabile str e inseriti come item nella listbox.
    Devo confrontarmi ora con la gestione di un errore:
    per come è attualmente strutturato il form può succedere infatti che un utente distratto possa incappare nell'inserimento di un codice nella stessa cella dove ha precedentemente immesso un altro codice.
    La listbox in questo caso mostra l'ultimo item inserito e sotto quello sovrascritto con lo stesso strNumRiga (ad es "sulla riga 1").
    Vorrei inserire quindi un controllo che alla selezione dello optButton relativo alla riga avvisi con una msgbox okCancel che nella listbox (e quindi sul foglio) la riga in questione è gia stata impegnata.
    All'utente spetterà il compito di decidere se sovrascrivere o meno.
    Come posso quindi formalizzare in codice la parte del controllo sulla non univocita di un item nella listbox ?
    Mille grazie per un suggerimento e spiegazione

    Ecco il progetto: http://dropcanvas.com/788x1
    Ultima modifica fatta da:AiaceT; 21/10/15 alle 00:17 Motivo: correzioni ortografiche

  2. #2
    L'avatar di Baloon_50
    Clicca e Apri
    Data Registrazione
    Aug 2015
    Località
    Milano - Italy
    Età
    67
    Messaggi
    3339
    Versione Office
    2013 PC
    Likes ricevuti
    483
    Likes dati
    49
    Citazione Originariamente Scritto da AiaceT Visualizza Messaggio
    Salve a tutti, sto lavorando ad un form contenente una textbox, tre cmdbutton e tre oprionButton.
    Nella txtbox viene inserito un codice poi trasferito in una specifica cella del foglio di lavoro in funzione dell'optionbutton selezionato tramite il click su un cmdbutton.
    A seguito del click su cmdbutton il valore della txtbox e quello acquisito dalla optionbutton vengono associati in una variabile str e inseriti come item nella listbox.
    Devo confrontarmi ora con la gestione di un errore:
    per come è attualmente strutturato il form può succedere infatti che un utente distratto possa incappare nell'inserimento di un codice nella stessa cella dove ha precedentemente immesso un altro codice.
    La listbox in questo caso mostra l'ultimo item inserito e sotto quello sovrascritto con lo stesso strNumRiga (ad es "sulla riga 1").
    Vorrei inserire quindi un controllo che alla selezione dello optButton relativo alla riga avvisi con una msgbox okCancel che nella listbox (e quindi sul foglio) la riga in questione è gia stata impegnata.
    All'utente spetterà il compito di decidere se sovrascrivere o meno.
    Come posso quindi formalizzare in codice la parte del controllo sulla non univocita di un item nella listbox ?
    Mille grazie per un suggerimento e spiegazione
    Se non ho frainteso credo che il tuo problema sia risolto :

    https://www.dropbox.com/s/ganbn464j5...copia.xls?dl=0

    A volte basta usare parole inutili come “grazie” e “per favore” per rendere la vita più bella.
    (ELKonigsburg)
    Dice il saggio : "se vuoi essere aiutato devi metter l'allegato"
    (Nick Carter - Ten)

  3. #3
    L'avatar di AiaceT
    Clicca e Apri
    Data Registrazione
    Oct 2015
    Località
    Roma
    Età
    47
    Messaggi
    67
    Versione Office
    Excel 2003
    Likes ricevuti
    2
    Likes dati
    12
    Citazione Originariamente Scritto da Baloon_50 Visualizza Messaggio
    Se non ho frainteso credo che il tuo problema sia risolto :

    https://www.dropbox.com/s/ganbn464j5...copia.xls?dl=0
    Grazie baloon_50 per l'intervento,
    purtroppo il problema è parzialmente risolto
    Per disattenzione ho fornito una versione del progetto in cui è disattivata nella select case la linea di codice
    Codice: 
    frmImpStmpPrezzi.ListBox1.AddItem txtSerie.Value & strRigaPrezzo
    Nonostante questo (quindi lasciando disattivata la riga) se la cella B2 è inizialmente vuota o viene svuotata a seguito di una eliminazione di una serie col cmdRimuoviSerie sebbene in txtbox si inserisca un codice e si selezioni l'optRiga1 il form si pulisce ma nessun codice viene inserito nella cella B2

    Caso esempio:

    CASO 1
    la cella b2 contiene codice 16889
    1) attivo il form
    2) inserisco serie 00090
    3) seleziono optbutton Riga1
    4) click su cmdInserisciRiga
    5) msgbox chiede consenso a sovrascrivere
    caso no= tutto ok, non inserisce nulla e textbox e optbutton vengono disattivati
    caso ok = sovrascrive e inserisce codice in B2
    6)txtbox si svuota e optButton Riga1 si deseleziona

    CASO 2
    la cella b2 non contiene nulla
    effettuo passaggi da 1 a 4 come sopra
    non viene inserito nessun codice in B2, txtbox si svuota e optButton Riga1 si deseleziona

    Ho risolto modificando il codice così

    Codice: 
        Case OptRiga1
            Call OptRiga1_Click
            If Range("B2").Value <> "" Then
            messaggio = MsgBox("sei sicuro di voler sovrascrivere il valore esistente?", vbYesNo)
                If messaggio = vbYes Then
                    ActiveCell.Value = txtSerie.Value
                    frmImpStmpPrezzi.ListBox1.AddItem txtSerie.Value & strRigaPrezzo
                    txtSerie.Value = "" 'pulisce la txtSerie
                    OptRiga1.Value = False 'rimuove preferenza da optRiga1
                Else
                    txtSerie.Value = "" 'pulisce la txtSerie
                    OptRiga1.Value = False 'rimuove preferenza da optRiga1
                End If
            Else
            ActiveCell.Value = txtSerie.Value
            frmImpStmpPrezzi.ListBox1.AddItem txtSerie.Value & strRigaPrezzo
            txtSerie.Value = "" 'pulisce la txtSerie
            OptRiga1.Value = False 'rimuove preferenza da optRiga1
            End If
    ma adesso si genera un altro problema da risolvere che vado a descrivere e legato appunto alla parziale non univocità degli item presenti nella listbox.

    Caso esempio
    si parte da
    CASO 1 di sopra (valore cella B2 <>"")
    soliti passaggi da 1 a 4
    acconsento alla sovrascrittura
    item trasferito alla listbox (txtbox.value & strNumRiga)

    l'utente (particolarmente sbadato) inserisce un nuovo codice in txtbox
    selezione OptRiga1
    acconsente alla sovrascrittura proposta dalla msgbox
    nuovo item trasferito in listbox con diverso txtbox.value ma identica strNumriga

    questo è ora l'errore da gestire e conto sulla tua esperienza per risolverlo

    Grazie per il momento per avermi aiutato a trovare una prima soluzione


    ALLEGO COPIA DEL PROGETTO CON LA MODIFICA: http://dropcanvas.com/eux9y
    Ultima modifica fatta da:AiaceT; 21/10/15 alle 16:30 Motivo: correzione contenuto

  4. #4
    L'avatar di Baloon_50
    Clicca e Apri
    Data Registrazione
    Aug 2015
    Località
    Milano - Italy
    Età
    67
    Messaggi
    3339
    Versione Office
    2013 PC
    Likes ricevuti
    483
    Likes dati
    49
    Citazione Originariamente Scritto da AiaceT Visualizza Messaggio
    ma adesso si genera un altro problema da risolvere che vado a descrivere e legato appunto alla parziale non univocità degli item presenti nella listbox.

    Caso esempio
    si parte da
    CASO 1 di sopra (valore cella B2 <>"")
    soliti passaggi da 1 a 4
    acconsento alla sovrascrittura
    item trasferito alla listbox (txtbox.value & strNumRiga)

    l'utente (particolarmente sbadato) inserisce un nuovo codice in txtbox
    selezione OptRiga1
    acconsente alla sovrascrittura proposta dalla msgbox
    nuovo item trasferito in listbox con diverso txtbox.value ma identica strNumriga

    questo è ora l'errore da gestire e conto sulla tua esperienza per risolverlo

    Grazie per il momento per avermi aiutato a trovare una prima soluzione


    ALLEGO COPIA DEL PROGETTO CON LA MODIFICA: http://dropcanvas.com/eux9y
    Bha se l'utente (particolarmente sbadato) ripete la procedura, questo problema non lo risolvi a meno di aggiungere un altro msgbox in cui si richiede (magari scritto in maiuscolo) se effettivamente vuole inserire il dato.

    :299:

    A volte basta usare parole inutili come “grazie” e “per favore” per rendere la vita più bella.
    (ELKonigsburg)
    Dice il saggio : "se vuoi essere aiutato devi metter l'allegato"
    (Nick Carter - Ten)

  5. #5
    L'avatar di AiaceT
    Clicca e Apri
    Data Registrazione
    Oct 2015
    Località
    Roma
    Età
    47
    Messaggi
    67
    Versione Office
    Excel 2003
    Likes ricevuti
    2
    Likes dati
    12
    Citazione Originariamente Scritto da Baloon_50 Visualizza Messaggio
    Bha se l'utente (particolarmente sbadato) ripete la procedura, questo problema non lo risolvi a meno di aggiungere un altro msgbox in cui si richiede (magari scritto in maiuscolo) se effettivamente vuole inserire il dato.
    Potrebbe essere una soluzione ma non risolverebbe. Sto dando un'occhiata e cercando di capire come funziona l'oggetto Collection e di come sfruttare il fatto che il suo indice se di tipo stringa generi un errore in caso di una doppia indicizzazione...ma per il momento sono in alto mare.

    Forse troverò qualche tutorial in inglese o qualcosa di più chiaro di quanto spiegato su MikeVBA

    Ovviamente conto sempre sull'intervento di altri partecipanti alla discussione

  6. #6
    L'avatar di AiaceT
    Clicca e Apri
    Data Registrazione
    Oct 2015
    Località
    Roma
    Età
    47
    Messaggi
    67
    Versione Office
    Excel 2003
    Likes ricevuti
    2
    Likes dati
    12

    Lightbulb Aggiornamento

    Riflettendoci molto sopra, mi son reso conto di volermi complicare non poco la vita. Certo se ci fosse la possibiità di imparare a usare Collection o Dictionary sarebbe un'acquisizione di competenze in più ma resta il fatto che dell'item in listbox andrebbe confrontata solo la parte finale, gli ultimi due valori della stringa strNumRiga.
    Leggendo su altri forum mi ha colpito la riposta di un utente esperto che confrontandosi con un suo pari lo invitava a cambiare approccio al problema.
    Proprio facendo così, un po' come suggeriva il professor Keating ai suoi allievi ne l'attimo fuggente, son salito sul banco e ho cercato di vedere la questione da un'altra prospettiva.

    Caso esempio:

    CASO 1
    la cella b2 contiene codice 16889 oppure è vuota
    1) attivo il form
    2) inserisco serie 00090 (o quella che voglio inserire)
    3) seleziono optbutton Riga1
    4) click su cmdInserisciRiga
    5) msgbox chiede consenso a sovrascrivere
    caso no= tutto ok, non inserisce nulla nella cella, il textbox viene svuotato, l'option button ritorna a essere pronto per la scelta dell'utente
    caso ok = sovrascrive e inserisce codice in B2
    6)txtbox si svuota e optButton Riga1 dopo essere ritornato pronto per la selezione SI DISATTIVA

    Ecco era semplice, bastava impedire all'utente di poter selezionare la cella che già contiene un codice!

    All'apertura del form, anche se c'è un valore nelle celle collegate alla scelta degli option button, questi ultimi saranno comunque attivi e selezionabili.
    Una volta che però si deciderà di sovrascrivere il valore presente nella cella con quello scritto nella txtbox, l'option button relativo a quella cella non sarà più selezionabile.

    Nel caso l'utente voglia nuovamente aver la possibilità di inserire un valore nella cella relativa all'option button disattivato dovrà rimuovere prima l'item corrispondente nella listbox

    il codice scritto nei precedenti post alla luce di questa scelta viene modificato come segue (modifica in grassetto):

    Codice: 
    Case OptRiga1
            Call OptRiga1_Click
            If Range("B2").Value <> "" Then
            messaggio = MsgBox("sei sicuro di voler sovrascrivere il valore esistente?", vbYesNo)
                If messaggio = vbYes Then
                    ActiveCell.Value = txtSerie.Value
                    frmImpStmpPrezzi.ListBox1.AddItem txtSerie.Value & strRigaPrezzo
                    txtSerie.Value = "" 'pulisce la txtSerie
                    OptRiga1.Value = False 'rimuove preferenza da optRiga1
                    OptRiga1.Enabled = False 'disattiva l'option button per evitare una sovrascrittura
                Else
                    txtSerie.Value = "" 'pulisce la txtSerie
                    OptRiga1.Value = False 'rimuove preferenza da optRiga1
                End If
            Else
            ActiveCell.Value = txtSerie.Value
            frmImpStmpPrezzi.ListBox1.AddItem txtSerie.Value & strRigaPrezzo
            txtSerie.Value = "" 'pulisce la txtSerie
            OptRiga1.Value = False 'rimuove preferenza da optRiga1
            OptRiga1.Enabled = False 'disattiva l'option button per evitare una sovrascrittura
            End If
    per riattivare l'optbutton in caso l'utente si accorga di aver sbagliato riga dove inserire il codice o di aver inserito il codice sbagliato nella riga giusta il codice del cmdButton Rimuovi Serie e Riga è stato così modificato (modifica in grassetto):

    Codice: 
    Private Sub cmdRimuovi_Click()
    
    If frmImpStmpPrezzi.ListBox1.ListIndex >= 0 Then
                
                         Select Case MsgBox("rimuovere serie " & Left(ListBox1.Value, 5)  & " dalla riga " & Right(ListBox1.Value, 2) & "?",  vbOKCancel + vbQuestion, "Conferma rimozione")
                            Case vbOK
                                Select Case True
                                Case Right(ListBox1.Value, 2) = "01"
                                    Range("B2") = ""
                                    OptRiga1.Enabled = True
                                Case Right(ListBox1.Value, 2) = "02"
                                    Range("B13") = ""
                                Case Right(ListBox1.Value, 2) = "03"
                                    Range("B23") = ""
                                Case Else
                                    Exit Sub
                            End Select
                                frmImpStmpPrezzi.ListBox1.RemoveItem ListBox1.ListIndex
                                frmImpStmpPrezzi.ListBox1.ListIndex = -1 'deseleziona gli elementi della listbox
                            
                            Case vbCancel
                                frmImpStmpPrezzi.ListBox1.ListIndex = -1 'deseleziona gli elementi della listbox
                                Exit Sub
                            End Select
            
        Else
            MsgBox ("selezionare prima la serie da rimuovere")
        End If
    End Sub
    Mi rendo conto che si tratta di una soluzione alternativa e che non risolve la richiesta di aiuto relativa all'oggetto di questa discussione (Univocità degli item presenti in una listbox) per cui non chiedo all'amministratore di mettere il solved al thread.

    Chissà che qualche guru non si diletti a spiegarmi come risolvere la questione usando collection o dictionary

    Per il momento grazie a tutti!

    Ci si rilegge al prossimo problema da risolvere sempre sullo stesso progetto

Discussioni Simili

  1. [Risolto] Confrontare il PICCOLO tra diversi prezzi ripetuti (e quindi serve univocità)
    Di Aleandro85 nel forum Domande su Excel in generale
    Risposte: 4
    Ultimo Messaggio: 08/02/17, 15:19
  2. [Risolto] Scartare valori già inseriti in altre celle
    Di misterlunick nel forum Domande su Excel in generale
    Risposte: 8
    Ultimo Messaggio: 04/01/17, 19:22
  3. Controllo moduli - casella di controllo
    Di CRISTIAN nel forum Domande su Excel in generale
    Risposte: 8
    Ultimo Messaggio: 03/05/16, 22:55
  4. Valore Combobox uguale all'item selezionato
    Di cromagno nel forum Domande su Excel VBA e MACRO
    Risposte: 24
    Ultimo Messaggio: 19/12/15, 11:40
  5. Come sommare valori inseriti in celle diverse.
    Di vitangelo nel forum Domande su Excel in generale
    Risposte: 7
    Ultimo Messaggio: 06/12/15, 19:28

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •