Form multiuso (combobox+pulsante)

di il
4 risposte

Form multiuso (combobox+pulsante)

Ciao a tutti.

Visto che ho la necessità di selezionare alcuni dati prelevandoli da tabelle diverse (per poi utilizzarli per altre funzioni), mi sono creato una maschera con 3 controlli:

- combobox (che popolo dinamicamente)

- textbox (che mi serve per "opzione")

- pulsante di comando

a seconda di quello che mi serve, utilizzo questo snippet vba:

DoCmd.OpenForm "frmElenco01"
Forms!frmElenco01!lblEtichetta1.Caption = "TESTO"
Forms!frmElenco01!txtMaschera = "X"
Forms!frmElenco01!cbxElenco01.RowSource = QUERY DI SELEZIONE
Forms!frmElenco01!cbxElenco01.Requery

Do
    DoEvents
        If CurrentProject.AllForms("frmElenco01").IsLoaded = False Then
        Exit Do
    End If
Loop

apro la maschera, imposto i controlli e metto in pausa il codice principale fino a quando premo il pulsante di comando e con un select case basato sul valore numerico della textbox (la X) decido come usare la voce selezionata nell'elenco.

Fino ad ora ha funzionato, ma oggi ho creato un'altra opzione (al momento siamo a 3) ma la combobox non mi permette di selezionare alcuna voce: l'elenco si apre ma pur clikkando su una voce non viene selezionata (l'elenco mi resta aperto)

Se utilizzo la form per uno dei precedenti casi che avevo programmato, funziona (popolo la combo, seleziono il valore, lo uso), ma questa non ne vuole sapere di fuzionare (nel caso specifico, deve assegnare ad  una variabile globale il valore di column(0))

non ho idea del perchè....

Andrea

4 Risposte

  • Re: Form multiuso (combobox+pulsante)

    29/01/2026 - Jocman ha scritto:

    apro la maschera,

    Quale maschera?

    29/01/2026 - Jocman ha scritto:

    imposto i controlli

    Quali controlli?

    29/01/2026 - Jocman ha scritto:

    metto in pausa il codice principale fino a quando premo il pulsante di comando

    In che senso? Quale codice metti in pausa?

    Il pulsante ha la seconda parte del codice da eseguire?

    29/01/2026 - Jocman ha scritto:

    con un select case basato sul valore numerico della textbox (la X) decido come usare la voce selezionata nell'elenco.

    Sarebbe utile sapere cosa fa la select... 

    Se fai select Pippo from Pluto oppure select Pippo from topolina sei sicuro che il controllo accetta Pluto e topolinia indistintamente? Hanno la stessa natura?

    29/01/2026 - Jocman ha scritto:

    oggi ho creato un'altra opzione (al momento siamo a 3) ma la combobox non mi permette di selezionare alcuna voce: l'elenco si apre ma pur clikkando su una voce non viene selezionata (l'elenco mi resta aperto)

    Come la popoli? È abilitata?

    Che codice metti?

    Una combo che elenca i form che gestiscono le varie tabelle e un pulsante che apre quel form in modo da riportarti tutto al modlaresult della chiusura del form è più complicato?

    Mostra le.query e come popoli la combo.

  • Re: Form multiuso (combobox+pulsante)

    29/01/2026 - sihsandrea ha scritto:

    Quale maschera?

    quella che c'è nella prima riga dello snippet

    DoCmd.OpenForm "frmElenco01"

    29/01/2026 - sihsandrea ha scritto:

    Quali controlli?

    quelli che ci sono nelle successive 4 righe dello snippet

    Forms!frmElenco01!lblEtichetta1.Caption = "TESTO"
    Forms!frmElenco01!txtMaschera = "X"
    Forms!frmElenco01!cbxElenco01.RowSource = QUERY DI SELEZIONE
    Forms!frmElenco01!cbxElenco01.Requery

    29/01/2026 - sihsandrea ha scritto:

    In che senso? Quale codice metti in pausa?

    Il pulsante ha la seconda parte del codice da eseguire?

    qui effettivamente sono stato criptico.

    la form frmElenco01 ha 4 soli controlli: una combo (con relativa etichetta), una textbox, un pulsante OK e uno ESCI

    La query che indico non è nulla di particolare:

    "SELECT [IDFamiliare], [Nome] FROM tblDipendentiDett WHERE [IDDipendente]=" & IDDipendente & " AND [IDParentela]=8"

    la combo si popola correttamente. La textbox mi serve per un indice numerico (in questo caso 3) che poi userò nel select case.

    Il codice che metto in pausa è una funzione che dovrà fare una verifica su una tabella in base ad un ID che prenderà dalla combobox (in questo caso [IDFamiliare]) per poi restituire un valore booleano.

    come ci arrivo a questa "form multiuso": da una form principale apro una seconda form (frmRegistro) dove, oltre ad altri controlli, ho una combobox. In base al valore che scelgo in questa combo, il db può o prendere il dato così com'è, oppure, come in questo caso, effettuare una verifica. In questo caso si apre la mia "form multiuso" (frmElenco01) e viene popolata la combobox con la query sopra indicata. A questo punto la funzione si mette in pausa finchè non scelgo un valore dalla combo di frmElenco01 e do l'OK: il valore della colonna 0 della combo (cioè IDFamiliare) dovrebbe essere passato ad una variabile globale (usata nella funzione che nel frattempo è ancora in loop) e quando chiudo la frmElenco01 la funzione esce dal loop e va avanti con il controllo che deve fare restituendo il valore booleano.

    Il problema è che apro la combo in frmElenco01, vedo esattamente i valori che mi aspetto di trovare, ma non li posso selezionare. O meglio, io li posso selezionare, ma l'elenco a discesa rimane aperto, di fatto non permettendomi di selezionare la voce che voglio per poi confermarla con OK.

    Quando do l'OK, il select case di cui accennavo è strutturato in questo modo (evento SuClick de l pulsante OK):

    Select Case Me.txtMaschera
        Case 1      'Indirizzi 
            
            
        Case 2      'Creare un elenco
            
        
        Case 3
        
            IDFiglio = Me.cbxElenco01.Column(0)
            DoCmd.Close
            
    End Select

    ometto i codici dei casi 1 e 2 (come detto la form è multiuso, in altre parti del db mi serve visualizzare degli elenchi di valori nella combo e selezionarli, per poi farci qualcosa)

    Nel caso in questione, me.txtmaschera vale 3, quindi esegue il Case 3. Una volta passato il valore della combo alla variabile globale IDFiglio, la form multiuso si dovrebbe chiudere e la funzione uscire dal loop e continuare (al momento non fa nulla tranne restituirmi come verifica a debug il valore della variabile globale).

    Per puro caso, per sbaglio ho chiuso manualmente la form frmRegistro (da cui richiamo la form multiuso frmElenco01) lasciando quindi aperta la sola frmElenco01. Non ci ho fatto caso, ed ho selezionato una voce dalla combo di frmElenco01. In questo caso la voce è stata correttamente selezionata (il menu a tendina si è chiuso), il suo valore assegnato con OK alla variabile globale (Case 3) e una volta chiusa frmElenco01 la funzione è uscita dal loop continuando regolarmente.

    Quindi ne deduco che il problema non è nel codice o nella query o altro, ma solo nel fatto che ci sia la form frmRegistro aperta? ma se è così, perchè?

    O c'è qualcosa che non ve nel loop?

    Do
        DoEvents
            If CurrentProject.AllForms("frmElenco01").IsLoaded = False Then
            Exit Do
        End If
    Loop
  • Re: Form multiuso (combobox+pulsante)

    Quel metodo è poco funzionale, se apri la maschera come Modale [acDialog] non funzionerà mai...!

    Puoi costruirti un Array o una Collection o una Classe Public da popolare prima di aprire la maschera, e su Load della maschera vai a verificare se l'oggetto MultiValore usato esiste ed è Valorizzato ed in quel caso lo cicli e lo usi.

  • Re: Form multiuso (combobox+pulsante)

    In realtà è un pò (anche senza pò) complicato per la mia conoscenza.

    Ho trovato una soluzione (che per le mie esigenze pare funzionare, al momento), ho inserito un nuova combobox nella form frmRegistro: in pratica, invece di aprire la form frmElenco01 rendo visibile (o invisibile) la nuova combobox e la popolo con i dati che mi servono, per poi fare le verifiche di cui necessito.

    Al momento, nelle prove "farlocche" sembra funzionare, vedremo quando sarà il momento di usarlo sul serio.

Devi accedere o registrarti per scrivere nel forum
4 risposte