Cancellazione form da VBA ma la form risulta sempre aperta

di il
12 risposte

Cancellazione form da VBA ma la form risulta sempre aperta

Ciao a tutti.

Sto cercando di eliminare una form ma nonostante tutto continuo a ricevere come errore “non è possibile eliminare una maschera aperta”

Che non dovrebbe essere aperta

DoCmd.Close acForm, "frmTimer", acSaveNO

DoCmd.DeleteObject acForm, "frmTimer"

La maschera è nascosta, si “apre ” all'apertura del DB, dopo il tempo impostato manda un messaggio a video, dopodichè non serve più e la voglio eliminare dal DB.

Idee?

12 Risposte

  • Re: Cancellazione form da VBA ma la form risulta sempre aperta

    Cosa intendi per nascosta? E poi che intendi per eliminare la maschera dal DB?

  • Re: Cancellazione form da VBA ma la form risulta sempre aperta

    All'apertura del DB c'è una pseudo maschera di login (non c'è nessuna esigenza di sicurezza, è solo per registrare chi è entrato); una volta eseguito il login, viene aperta la maschera Timer in modalità nascosta:

    DoCmd.OpenForm "frmTimer", acNormal, , , , acHidden

    A volte voglio che se si logga un determinato utente dopo qualche tempo gli arrivi un messaggio; per questo aggiungo la form frmTimer nel DB cosicchè alla scadenza del timer impostato visualizza il messaggio.

    Dopodichè non mi serve più e la voglio eliminare fisicamente dal DB.

    Quindi la chiudo e richiamo una funzione che la elimina.

    Inizialmente il comando di chiusura era nella stessa form Timer, seguito dalla chiamata alla funzione.

    E mi dava errore di form ancora aperta

    Ho spostato il comando di chiusura nella funzione, ma mi da lo stesso errore

  • Re: Cancellazione form da VBA ma la form risulta sempre aperta

    Scusa ma poi se chiudi e lo riapri, una volta cancellata cosa fai la ricrei…?
    Serve solo ONESHOT alla prima apertura…?

    La Form(timer) ha un CANCEL su evento Unload, che rende la form non chiudibile…?

    Quello che vuoi fare è una cavolata, non si cancellano gli oggetti in quel modo… si gestiscono… supponi di distribuire un ACCDE… non vabene cosi.

  • Re: Cancellazione form da VBA ma la form risulta sempre aperta

    Quello che dici è giusto (ci mancherebbe pure).

    In teoria, una volta cancellata si, l'idea era quella, la ricreerei se mi dovesse servire di nuovo, ma accadrebbe (o almeno me lo auguro) una volta ogni morte di papa (ad esempio in circa 6 anni è la prima volta che è servita).

    Dopotutto quello che mi è servito (è la prima volta che usavo questa cosa) è stato far apparire una msgbox con un messaggio per l'interessato (al rientro da una sua assenza); dopodichè l'ho cancellata a mano.

    Distribuire ACCDE non rientra nelle mie idee, e non ci rientreerà (sono contrario), i DB che faccio sono ad uso esclusivo “locale” del mio ufficio, quindi li ho sempre sottomano io, e quando arriverà il felice momento (la pensione, sperando…) verranno via con me.

    Del resto, non mi costa niente lasciarla li dove sta dopo ha assolto il suo compito; potrei anche editarla impostando il timer per un tempo “infinito”.

    La cosa che mi lasciava perplesso era solo il fatto che nonostante il comando di chiusura, risultasse comunque ancora aperta impedendone la rimozione. E non c'è alcun evento programmato se non quella msgbox SuTimer

  • Re: Cancellazione form da VBA ma la form risulta sempre aperta

    Direi che si può lavorare meglio… ;-)

    Fai la modifica affinchè non sia da riprendere in mano… non che dopo 1 anno sia da rivedere, soprattutto per una cosa così banale.

    Ci sono molti metodi per fare queste cose, pensaci se vuoi ti posso dare qualche suggerimento, ma parti con una logica di “BUONA PROGRAMMAZIONE”.

    Detto questo, posta il codice della Form Timer per intero, ed il codice con cui la fai aprire.

  • Re: Cancellazione form da VBA ma la form risulta sempre aperta

    Su apertura del DB (nella maschera di login – che ribadisco è farlocca, non ha una vera utilità di sicurezza) verifico se l’ID dell’utente è uguale a quello che ho inserito in un campo di una tabella specifica (se non mi serve nessuno metto nel campo uno zero):

    If Forms!frmLogin!cbxUtente.Column(0) = DLookup("IDUtente", "tblSistema") Then DoCmd.OpenForm "frmTimer", acNormal, , , , acHidden

    Una volta caricata la form Timer, sull’evento SuTimer:

    if MsgBox (“TESTO DEL MESSAGGIO” & vbNewLine & "Posso eliminare il messaggio?", vbYesNo + vbInfo, ”Avviso”= vbNo Then Exit Sub
    Call EliminaTimer

    La funzione richiamata (sta in un modulo, non nella form frmTimer):

    DoCmd.Close, "frmTimer", acSaveYes                  ‘non si sa mai ci sia qualcosa da salvare
    DoCmd.DeleteObject acForm, "frmTimer"

    Non c’è tutta questa scienza informatica (che non ho).

    Prima che si dica “non basta mandare una MsgBox a video?”: si, solo che dovrei ogni volta andarmi ad aprire il codice, cercar il punto e inserire la msgbox.

    In questo modo ho su un DB a parte (insieme a vari “pezzi pronti" che uso spesso) la form timer, c'è un solo evento programmato su quella form quindi quando apro il codice sto già sul punto, cambio il testo del messaggio e copio la form intera nel DB.

    Come detto, posso lasciarla tranquillamente li, non è un problema. E' solo quella cosa che risulta aperta anche se chiusa.

    Perchè E' chiusa: ho fatto una prova mettendo un timer di 10 secondi e un messaggio. Se dopo un tot di volte premo un pulsante (su un'altra form) con il comando di chiusura della frmTimer, il messaggio non compare più (il che credo voglia dire che è chiusa….)

  • Re: Cancellazione form da VBA ma la form risulta sempre aperta

    29/03/2023 - Jocman ha scritto:


    Una volta caricata la form Timer, sull’evento SuTimer:

    if MsgBox (“TESTO DEL MESSAGGIO” & vbNewLine & "Posso eliminare il messaggio?", vbYesNo + vbInfo, ”Avviso”= vbNo Then Exit Sub
    Call EliminaTimer

    Invece di chiamare EliminaTimer :

    - metti a 0 la chiave nel DB (l’ID dell’utente è uguale a quello che ho inserito in un campo di una tabella specifica (se non mi serve nessuno metto nel campo uno zero))

    - docmd.close me.name acSaveNo (chiudi il form)

  • Re: Cancellazione form da VBA ma la form risulta sempre aperta

    Esatto chiudi la Form da dentro non da fuori, sicuramente come ti ha suggetito Max non resta aperta.

    Private Sub Form_Timer()
    	Me.TimerInterval=0
    	' Altre azioni eventuali...
    	docmd.close me.name acSaveNo
    End Sub
  • Re: Cancellazione form da VBA ma la form risulta sempre aperta

    Ho provato a fare come entrambe mi avete suggerito

    se inserisco all'nterno della form frmTimer

    DBEngine(0)(0).Execute ("UPDATE tblSistema SET IDUtente=0"), dbFailOnError
    Me.TimerInterval=0
    docmd.close me.name acSaveNo

    mi da errore “Tipo non corrispondente”

    Se lo sostituisco con

    DBEngine(0)(0).Execute ("UPDATE tblSistema SET IDUtente=0"), dbFailOnError
    Me.TimerInterval=0
    DoCmd.Close

    la form viene chiusa (e in genere le maschere le chiudo anche io così, dall'interno)

    Suppongo che il suggerimento di cambiare di nuovo la chiave a zero sia per evitare che la form venga riaperta al prossimo accesso.

    Va bene, non viene più aperta al prossimo accesso. La cosa mi può andar bene anche così. La soluzione del problema (se problema era) mi va bene, male che vada se dovesse servire me la ritrovo già là.

    Tuttavia (e solo per puro accanimento), ho provato a cancellarla di nuovo da codice, e nonostante io la veda chiudersi, mi da sempre il messaggio che non è possibile eliminarla perchè è aperta….. Boh, non so…..

    Mi fa strano anche che il comando di chiusura dato dall'esterno (in questo caso dal modulo)

    docmd.close, acform, “frmTimer”

    non sortisca alcun effetto (suppogo che formalmente sia corretto)

  • Re: Cancellazione form da VBA ma la form risulta sempre aperta

    29/03/2023 - Jocman ha scritto:


    Ho provato a fare come entrambe mi avete suggerito ….

    mi da errore “Tipo non corrispondente”

    Controlla la sintassi di docmd.close … magari è sbagliato l'ordine dei parametri o manca un parametro (il suggerimento l'ho scritto senza provalo in access, a volte il compilatore mentale fallisce).

  • Re: Cancellazione form da VBA ma la form risulta sempre aperta

    29/03/2023 - Jocman ha scritto:


    Suppongo che il suggerimento di cambiare di nuovo la chiave a zero sia per evitare che la form venga riaperta al prossimo accesso.

    Esatto ma anche per evitare di cancellare un oggetto che poi magari in futuro avresti dovuto ricreare (o copiare da un altro progetto).

  • Re: Cancellazione form da VBA ma la form risulta sempre aperta

    La sintassi era quella che usavi all'inizio:

    DoCmd.Close acForm, Me.Name

    Non serve mettere No al salva in quanto è il DefaultValue.

Devi accedere o registrarti per scrivere nel forum
12 risposte