VBA e combobox



  • VBA e combobox
    di Michela (utente non iscritto) data: 15/09/2015 17:20:40

    Filosofeggiando sul tecnico: ho una combobox che al comando _change() trasferisce dei dati in una listbox. Quindi appena scelgo un elemento della combobox tutto funziona. La mia domanda è: Se dopo aver scelto un elemento della combobox, ci si accorge che è quello sbagliato, c'è un modo per far capire alla combobox che al secondo click deve annullare il primo, quindi cancellare i dati dalla listbox??
    Spero si capisca la questione....
    grazie!



  • di Marius44 data: 15/09/2015 17:42:52

    Ciao Michela
    Purtroppo la filosofia non c'entra nulla con l'informatica.
    Prova a leggere la Guida di VBA al paragrafo Application.Undo, metodo ed in particolare le Note

    Ciao,
    Mario



  • di alfrimpa data: 15/09/2015 18:31:25

    Ciao Mario

    Un chiarimento:

    Mi sembra che Application.Undo annulli l'ultima operazione.

    E se ci si accorge dopo aver fatto altre operazioni dell'errore si correrebbe il rischio di annullare un'operazione corretta?

    O mi perdo qualcosa?

    Alfredo





  • di Vecchio Frac data: 15/09/2015 19:30:33

    "Filosofeggiando sul tecnico"
    LOL Miky mi farai morire ^_^

    Comunque ti avevo promesso che guardavo meglio il problema dell'altro giorno e lo farò... magari ricordamelo se vedi che passa il tempo :)





  • di Marius44 data: 15/09/2015 21:01:33

    Ciao Michela
    Ti riporto le note di Application.Undo

    È possibile utilizzare questo metodo solo per annullare l'ultima operazione eseguita dall'utente prima di eseguire la macro. Il metodo deve essere utilizzato nella prima riga della macro e NON PUO' ESSERE UTILIZZATO PER ANNULLARE L'ESECUZIONE DI COMANDI VISUAL BASIC.

    La macro che lanci E' un comando VB! Pertanto ...

    Ciao,
    Mario



  • di Vecchio Frac data: 16/09/2015 09:36:50

    Undo non è pertinente in questo caso perchè si deve andare di codice, togliendo dalla listbox con remove quello che si è aggiunto in precedenza.

    cit. "c'è un modo per far capire alla combobox che al secondo click deve annullare il primo, quindi cancellare i dati dalla listbox?? "
    ---> Sì.

    cit. "Spero si capisca la questione.... "
    ---> No.

    Se non vai sul pratico, di teoria ti si può dire tutto e niente.





  • di Michela (utente non iscritto) data: 16/09/2015 14:14:13

    Ciao a tutti! Grazie delle vs risposte.
    @Marius44: filo-sofia="amore del sapere"...perché non filosofeggiare di informatica, matematica, ingegneria per il solo piacere di scambiarsi nozioni e cose nuove?!
    Per farmi capire, allego un file con una una combobox che riempie una listbox. Al primo click aggiunge un elemento alla listbox, al secondo click un secondo elemento, ecc...così la listbox aumenta +1 ogni click.
    Io, invece, chiedevo che: al primo click si aggiunge l'elemento alla listbox, al secondo si SOSTITUISCE al primo cosicché la listbox non incrementa, ma resta solo l'ultimo elemento scelto dalla combobox.
    So che si potrebbe inserire un tasto a parte, che cancella gli elementi della listbox....ma era solo per "filosofeggiare" su quanto posso fare con le combobox.
    grazieee!



  • di Vecchio Frac data: 16/09/2015 14:44:44

    Naturalmente si può fare (semplicemente prima dell'inserimento nella listbox la cancelli con .Clear e quindi ogni .Additem non fa altro che aggiungere l'elemento in posizione 0).
    Ma non ha alcun senso usare così un controllo ListBox.
    Se lo scopo è mostrare solo l'unica scelta dell'utente fatta da una combo, puoi usare una semplice TextBox (o una Label) che prende il valore della ComboBox.

    (ps il codice che propongo è davvero banale ma rende esattamente il concetto)
     
    Option Explicit
    
    Private Sub UserForm_Initialize()
        ComboBox1.AddItem "a"
        ComboBox1.AddItem "b"
        ComboBox1.AddItem "c"
        ComboBox1.AddItem "d"
        ComboBox1.AddItem "e"
    End Sub
    
    Private Sub ComboBox1_Change()
        ListBox1.Clear
        ListBox1.AddItem ComboBox1
    End Sub






  • di Michela (utente non iscritto) data: 16/09/2015 14:58:05

    Hai ragione @VF, ma metti che la listbox si carica con una serie di dati, a cui devi aggiungere quello della nostra combobox alla fine... così facendo cancelli tutta la listbox. invece io vorrei che se mi sbaglio a scegliere l'elemento al primo click, posso correggerlo al secondo... bello no??!! hihihi



  • di Vecchio Frac data: 16/09/2015 15:36:18

    Uhm, non sono sicuro che sia molto user friendly... cioè così sconcerti l'utente. Come fai a fargli aggiungere semplicemente elementi nella listbox e non a fargli sostituire semplicemente sempre l'ultimo inserito?
     
    Option Explicit
    
    Private Sub UserForm_Initialize()
        ComboBox1.AddItem "a"
        ComboBox1.AddItem "b"
        ComboBox1.AddItem "c"
        ComboBox1.AddItem "d"
        ComboBox1.AddItem "e"
        
        ListBox1.AddItem "a"
        ListBox1.AddItem "b"
        ListBox1.AddItem "c"
    End Sub
    
    Private Sub ComboBox1_Change()
        If ListBox1.ListCount > 0 Then ListBox1.RemoveItem (ListBox1.ListCount - 1)
        ListBox1.AddItem ComboBox1
    End Sub






  • di Michela (utente non iscritto) data: 16/09/2015 16:01:33

    Capisco... Forse ancor meglio un pulsante che cancella l'elemento scelto nella listbox, a discrezione dell'utente...
    Grazie ancora x l'aiuto @VF!!



  • di Marius44 data: 16/09/2015 16:04:28

    @Michela
    cit. « Chi pensa sia necessario filosofare deve filosofare e chi pensa non si debba filosofare deve filosofare per dimostrare che non si deve filosofare; dunque si deve filosofare in ogni caso o andarsene di qui, dando l'addio alla vita, poiché tutte le altre cose sembrano essere solo chiacchiere e vaniloqui. » di Aristotele

    Filosofia = amore del sapere
    Filologia = interesse per lo studio delle parole

    Mi riferivo al senso delle parole "Application.Undo" e, forse, la seconda mi sembra più azzeccata.

    Ciao,
    Mario



  • di Michela (utente non iscritto) data: 16/09/2015 16:19:28

    @Marius44 che perla! Bellissimo questo ricordo di Aristotele!



  • di Vecchio Frac data: 16/09/2015 18:45:20

    Io ho fatto il Classico, ma mica mi ricordavo questi riferimenti ^_^





  • di Michela (utente non iscritto) data: 17/09/2015 16:32:21

    Ciaoooo @VF!
    Pensavi di liberarti di me e delle mie domande, vero?! Hihi
    Non voglio davvero abusare della tua pazienza e bravura, ma avrei davvero piacere ad avere alcuni tuoi ultimi consigli prima di chiudere il lavoro che ormai conosci bene!
    1) che te ne pare? lo useresti per gestire un migliaio di prenotazioni nella tua scuola? O lo ritieni "inaffidabile" x qualche punto di vista?
    2) Form prenotazione - CommandButton1_Click: la funzione overlapps non mi coglie le ore centrali di un intervallo di tempo (es: il 28.11 dalle 10 alle 11 il maestro Zenga risulta libero, ma non lo è nel planning!)
    3) Form Collettivi - Giorno_AfterUpdate(): le listbox non si caricano in ordine di maestro (es: il 28.11 le liste si compilano diversamente che come mostrato nel planning).
    Ti ringrazio, ancora una volta, se avrai voglia di rispondermi!



  • di Vecchio Frac data: 18/09/2015 09:34:28

    Ciao Miky,
    io trovo che il progetto che hai messo in piedi con tanta pazienza sia venuto su bene, è complesso, fa molte cose non banali e se serve allo scopo è pure una soddisfazione :)
    Io mi sarei buttato a occhio chiuso su Access per questo tipo di lavori, ma credo che la scelta dello strumento sia personalissima. Certo Excel fa cose che Access fa con difficoltà (in realtà poche ^_^).
    Hai realizzato un buon gestionale che automatizza l'archiviazione... sulle interrogazioni e la reportistica avrai qualche difficoltà ma insomma ce la potrai fare. E niente ti impedirà un domani di passare ad Access conservando identica la base dati, se ti servirà maggiore flessibilità.
    Inaffidabile? perchè mai? gestisce inserimenti, modifiche, eliminazioni e ha funzionalità peculiari che servono allo scopo. Meglio di così ^_^

    Nel merito, devo rivedere la funzione Overlaps, sai che i bug vengono fuori sempre facendo prove :)
    Strano che le listbox non si caricano nell'ordine, magari hai scovato dei casi particolari.
    Appena riesco ci do un'occhiata.





  • di Michela (utente non iscritto) data: 24/09/2015 10:26:22

    Ciao @Vecchio Frac! mi fa molto piacere quanto dici! Ci credo molto in questo lavoro visto che se funziona ci semplificherà il lavoro nei prossimi mesi... Infatti, in questi giorni lo sto ottimizzando e completando nelle sue parti, per quanto sono in grado...
    Devo ringraziare personalmente questo forum e soprattutto TE, perché mi hai dato un sacco di dritte di VBA in questo percorso, che mi hanno insegnato davvero tanto e mi hanno incoraggiata a completare il codice, anziché abbandonarlo alle prime difficoltà.
    Mi restano da sistemare solo due problemini di cui ti dicevo (caricamento listbox e Overlaps), che anche provando a modificare o cercando su qualche guida non sono riuscita a migliorare, però sono essenziali per il funzionamento corretto del progetto.
    Per questo, spero di poter confidare, ancora una volta (l'ultima spero ), nel tuo prezioso aiuto, senza mancar di rispetto a tutti gli altri esperti, ovviamente!!
     
    Private Sub CommandButton1_Click()
    Dim lriga As Long, lCont As Long, lng As Long
    Dim occupato As Boolean
    Dim lngRed As Long, lngBlk As Long
    
        lCont = 0
        With Sheets("database")
            lriga = .Range("B" & .Rows.Count).End(xlUp).Row
            
            occupato = False
                    
            For lng = 4 To lriga
                'ricerca su MAESTRO
                If .Range("N" & lng) = Maestro.Text Then
                    'ricerca su GIORNO2
                    If Replace(.Range("O" & lng), ",", ".") = giorno2.Text Then
                        'ricerca orario DALLE - ALLE
                        If OVERLAPS(Dalle2.Text, Alle2.Text, .Range("P" & lng), .Range("Q" & lng)) Then
                            occupato = True
                            lngRed = RGB(255, 0, 0)
                            Dalle2.ForeColor = lngRed
                            Alle2.ForeColor = lngRed
                            Exit For
                        Else
                            lngBlk = RGB(0, 0, 0)
                            Dalle2.ForeColor = lngBlk
                            Alle2.ForeColor = lngBlk
                        End If
                    End If
                End If
            Next
        End With
        
        MsgBox "MAESTRO " & IIf(occupato, "OCCUPATO!", "LIBERO!")
    End Sub



  • di Vecchio Frac data: 24/09/2015 13:27:10

    Avevo promesso ma purtroppo non ho potuto mantenere.
    Spero in questi giorni di poterti dedicare il tempo che meriti.
    Grazie della stima.




  • VB 2010 ingressi / uscite
    di Aznep (utente non iscritto) data: 25/09/2015 09:39:39

    Salve, non so se questo è il posto giusto per il mio problema, cmq sia la questione è questa: in visual besic 2010 avrei bisogno di creare un programma che mi registri in un database l'ingresso è le uscite delle persone elencate in un altro dtatabase2... in pratica io utilizzo la funzione BindingSource associata a delle label per spostarmi sui record per esaminarli ma quando uso la stessa funzione associata alle label del secondo database per utilizzare BindingSource.addnew quest'ultimo non salva nel secondo data base.

    mi potete aiutare o suggerire un metodo più facile, perché non sono tanto bravo con i database, io utilizzo ancora le classiche array



  • di Mauro data: 25/09/2015 09:50:01

    @Aznep
    Per cortesia apri una nuova discussione



  • di Michela (utente non iscritto) data: 25/09/2015 17:15:31

    grazie a te @VF! Nessuna pretesa figurati....se e quando potrai aiutarmi te ne sarò cmq grata!
    Allego il file definitivo dove ho dovuto modificare il nome dei corsi (mentre ho lasciato intatti i nomi delle listbox, ecc).
    M.