Condividi tramite

Codice in modalità interruzione

Anonimo
2015-12-13T19:56:49+00:00

Ciao a tutti,

vi illustro questa situazione: quando sono in modalità sviluppo e sto lavorando su una UserForm, la lancio per testare se funziona correttamente. Quando la chiudo, mi appare per un attimo l'oggetto form in ambiente VBA e poi sparisce, vedendo solo il codice sorgente. Se cerco di aprire la finestra con "Visualizza oggetto", continua a fare la stessa cosa... la vedo per una frazione di secondo e poi ritorna la visualizzazione del codice. Per poterla visionare, devo agire sul pulsante "Interrompi(CTRL+INTERR)", mi appare una finestra (che se ci riesco vi allego) che mi da il seguente messaggio: "Impossibile eseguire il codice in modalità interruzione", clicco su OK... sul tasto "Ripristina", e finalmente mi riappare la Form su cui posso quindi lavorare.

Credo che ciò sia dovuto al codice che ho inserito in un modulo per il funzionamento dell'orologio. Ma come faccio per interrompere l'esecuzione di questo nella chiusura della form?

VI aggiungo sotto il codice che mi aziona l'orologio, che lancio nell'evento...

Sub Recalc()
UserForm1.Label_data.Caption = Format(Now, "dddd dd mmmm yyyy" & " : ")
UserForm1.Label_ora.Caption = Format(Time, "hh:mm:ss")
Call SetTime
End Sub
Sub SetTime()
Dim SchedRecalc As Date
SchedRecalc = Now + TimeValue("00:00:01")
Application.OnTime SchedRecalc, "Recalc"
End Sub
Sub Disable()
Dim SchedRecalc
On Error Resume Next
Application.OnTime EarliestTime:=SchedRecalc, Procedure:="Recalc", Schedule:=False
End Sub

Grazie a tutti per l'atenzione.

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-12-14T13:46:07+00:00

Grazie Norman, come sempre molto preciso e dettagliato nel dare i tuoi suggerimenti.

Ho provato a implementare i tuoi suggerimenti, ma nulla é cambiato.

Ho comunque preso spunto da un'altro codice trovato in rete che rende più semplice la compilazione delle istruzioni dell'orologio, e non mi da più i problemi descritti in questa discussione.

Queste le nuove istruzioni che ho trovato:

Nel modulo:

Sub Clock()

If Sheets("Foglio3").[IV1] = "X" Then Exit Sub

UserForm1.TextBoxora.Value = Format(Now, "hh:mm:ss")

Application.OnTime Now + TimeSerial(0, 0, 1), "Clock"

Sheets("Foglio1").Select

End Sub

Nella Form:

Private Sub UserForm_Initialize()

Sheets("Foglio3").[IV1] = "" ' ---->> Aggiunta

Sheets("Foglio1").Select

Clock

End Sub

Private Sub UserForm_Activate()

Clock

End Sub

Private Sub UserForm_Terminate()

Sheets("Foglio3").[IV1] = "X" ' ---->> Aggiunta altrimenti non termina l'esecuzione della macro

Clock ' ---->> Aggiunta altrimenti non termina l'esecuzione della macro

Sheets("Foglio1").Select

Unload Me

Application.ScreenUpdating = False

Application.ScreenUpdating = True

End Sub

La risposta è stata utile?

0 commenti Nessun commento

9 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2015-12-14T14:01:44+00:00

    A volte ci sono thread incomprensibili.... starò diventando vecchio... ;-)

    Chiudo il post.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2015-12-14T13:29:29+00:00

    Ciao Giuseppe,

    Nel tuo modulo di codice Modulo1,  prova a sostituire

    Sub Recalc()
    UserForm1.Label_data.Caption = Format(Now, "dddd dd mmmm yyyy" & " : ")
    UserForm1.Label_ora.Caption = Format(Time, "hh:mm:ss")
    Call SetTime
    End Sub
    Sub SetTime()
    Dim SchedRecalc As Date
    SchedRecalc = Now + TimeValue("00:00:01")
    Application.OnTime SchedRecalc, "Recalc"
    End Sub
    Sub Disable()
    Dim SchedRecalc
    On Error Resume Next
    Application.OnTime EarliestTime:=SchedRecalc, Procedure:="Recalc", Schedule:=False
    End Sub
    

    con:

    '--------->>

    Public Sub Recalc()

        UserForm1.Label_data.Caption = Format(Now, "dddd dd mmmm yyyy")

        UserForm1.Label_ora.Caption = Format(Time, "hh:mm:ss")

        Call SetTime

    End Sub

    '--------->>

    Public Sub SetTime()

        SchedRecalc = Now + TimeValue("00:00:01")

        Application.OnTime SchedRecalc, cRunWhat

    End Sub

    '--------->>

    Public Sub Disable()

        On Error Resume Next

        Application.OnTime EarliestTime:=SchedRecalc, _

                           Procedure:=cRunWhat, _

                           Schedule:=False

    End Sub

    '<<=========

    Al capo del modulo sostituisci:

    Option Explicit

    Option Compare Text

    Public rig As Long

    con:

    '=========>>

    Option Explicit

    Option Compare Text

    Public rig As Long

    Public SchedRecalc As Double

    Public Const cRunWhat = "Recalc"

    '--------->>

    Nota, tra l'altro, che nel tuo codice esistente, la procedura Disable

    non ha alcuna conoscenza del valore della variabile SchedRecalc e questa variabile quindi, questa vatibile restituirà sempre un valore vuota. Di conseguenza, l'operazione di terminazione richiesta non può essere effettuata.

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2015-12-14T10:37:34+00:00

    Ciao Mauro, grazie per la tua risposta.

    Ho utilizzato i codici nei moduli pubblici in quanto in questo modo posso richiamare le istruzioni dell'orologio anche nelle altre UserForm del progetto senza doverli integrare sempre in tutte le UserForm.

    Comunque da me il problema rimane, e lo riscontri in modalità progettazione. Quando chiudo la UserForm, e vado in modalità progettazione, la UserForm non rimane visibile, se voglio visualizzare l'oggetto, mi appare per un secondo, poi si chiude. Per poterla avere attiva e poterci lavorere per aggiornare qualche cosa, devo fare click sul tasto "Interrompi" (Ctrl+PAUSE), in questo modo la UserForm rimane attiva e vi ci posso lavorare.

    Ti allego un file d'esempio così da poterlo testare sul tuo PC.

    Esempio

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2015-12-14T09:18:31+00:00

    Non ho capito perché non metti il codice *dell'orologio* tutto nella UserForm.

    Ad ogni modo, prova:

    Sub Recalc()

    UserForm1.Label_data.Caption = Format(Now, "dddd dd mmmm yyyy" & " : ")

    UserForm1.Label_ora.Caption = Format(Time, "hh:mm:ss")

    Call SetTime

    End Sub

    Sub SetTime()

    Dim SchedRecalc As Date

    SchedRecalc = Now + TimeValue("00:00:01")

    Application.OnTime SchedRecalc, "Recalc"

    End Sub

    Sub Disable()

    On Error Resume Next

    Application.OnTime EarliestTime:=SchedRecalc, Procedure:="Recalc", Schedule:=False

    End Sub

    Public Sub m()

        UserForm1.Show

        Call Recalc

    End Sub

    Se chiudo la UserForm non riscontro nessun problema.

    La risposta è stata utile?

    0 commenti Nessun commento