Sviluppare funzionalita su Microsoft Office con VBA Problema VBA e Macro: Riapertura in Loop del file a chiusura anticipata

Login Registrati
Stai vedendo 8 articoli - dal 1 a 8 (di 8 totali)
  • Autore
    Articoli
  • #7170 Risposta

    roberto2664
    Partecipante

      Buongiorno
      scrivo a voi per avere supporto su un rompicapo che non riesco a risolvere.
      Avevo la necessità di creare un file utilizzato da più utenti in condivisione su Dropbox.
      Il mio scopo era di creare un controllo che permettesse all'apertura di sapere se il file era o meno utilizzato in maniera da evitare le fastidiose "copie di conflitto" che giustamente dropbox crea se più utenti utilizzano il file in contemporanea.
      Per questo ho utilizzato due macro: una per autosave e una per autoclose trascorso un certo periodo di tempo dall'apertura.
      Le macro e il file funzionano.
      Ho soltanto un problema: se il file viene chiuso in maniera prematura dall'utente prima che le macro terminino l'esecuzione il file si riapre in continuazione.
      Ho provato a cercare sul web una soluzione a tutto ciò ma ciò che ho trovato non mi ha aiutato.
      Questo benedetto file si riapre sempre.
      Qui di seguito inoltro il codice da me utilizzato:

      Codice in "ThisWorkbook"

      
      Private Sub Workbook_Open()
      
      If Sheets("Record").Range("K2") <> "" Then
      
      MsgBox "Il file è già utilizzato da " & UserName & ". Ritorna più tardi"
      
      ThisWorkbook.Close SaveChanges:=False
      
      End If
      
      Userform1.Show
      
      DTime = Time
      
      Application.OnTime DTime + TimeValue("00:00:05"), "SaveMe_MistakesandAll"
      
      Application.OnTime DTime + TimeValue("00:20:00"), "CloseMe_MistakesandAll"
      
      End Sub
      
      
      
      Private Sub Workbook_BeforeClose(Cancel As Boolean)
      
      Run "Limpa"
      
      Dim Current As Range
      
      Set Current = Sheets("Record").Range("K2")
      
      result = 0
      
      Current.Value = UserName
      
      result = 1
      
      ThisWorkbook.Save
      
      End Sub
      
      

      Codice "Macro"

      
      Sub Limpa()
      
          On Error Resume Next
      
          Application.OnTime DTime + TimeValue("00:02:30"), "SaveMe_MistakesandAll", , False
      
          Application.OnTime DTime + TimeValue("00:20:00"), "CloseMe_MistakesandAll", , False
      
          On Error GoTo 0
      
      End Sub
      
      
      Public DTime As Date
      
      
      Sub SaveMe_MistakesandAll()
      
      DTime = Time
      
      Application.OnTime DTime + TimeValue("00:02:30"), "SaveMe_MistakesandAll"
      
      ThisWorkbook.Save
      
      End Sub
      
      
      Sub CloseMe_MistakesandAll()
      
      DTime = Time
      
      Application.OnTime DTime + TimeValue("00:20:00"), "CloseMe_MistakesandAll"
      
      Dim Current As Range
      
      Set Current = Sheets("Record").Range("K2")
      
      result = 0
      
      Current.Value = UserName
      
      result = 1
      
      ThisWorkbook.Close SaveChanges:=True
      
      End Sub
      
      

      Il mio problema: interrompere l'esecuzione delle macro a chiusura anticipata. Potete aiutarmi?

      Grazie mille

      Saluti Roberto

      #7171 Risposta

      vecchio frac
      Moderatore
        23 pts

        roberto2664 wrote:il file si riapre in continuazione.

        Da solo?

        Comunque non ho adesso il tempo di approfondire quello che sembra un quesito interessante, nè di fare dei test seri. Osservo solo che ti stai appoggiando a OnTime e non son sicuro che sia la scelta migliore (per un utilizzo così critico io penserei ad affidarmi alle API SetTimer e KillTimer che risultano indipendenti da Excel).

        #7172 Risposta

        roberto2664
        Partecipante

          Si. Si riapre da solo.

          Come si usano API SetTimer o KillTimer? Purtroppo non le conosco.

           

          Grazie

           

          Ciao

           

           

           

           

           

          #7173 Risposta
          Luca73
          Luca73
          Partecipante
            4 pts

            Ciao

            non sono esperto di uso di On time.

            Presuppongo che essendo legato ad application e non a workbook, rimane attivo anche a chiusura del workbook.

            Io proverei nella procedure di "workbook_BeforeClose" a disabilitare tutti gli on time attivati. 

            Leggendo l'help dovrebbe essere un qualcolsa del genere (copiato dall'help on line)

            This example runs my_Procedure at 5 P.M.

            Application.OnTime TimeValue("17:00:00"), "my_Procedure"

            This example cancels the OnTime setting from the previous example.

            Application.OnTime EarliestTime:=TimeValue("17:00:00"), _
            Procedure:="my_Procedure", Schedule:=False

            #7174 Risposta
            Luca73
            Luca73
            Partecipante
              4 pts
              #7175 Risposta

              roberto2664
              Partecipante

                Ciao Luca73

                grazie per la risposta. Ho già provato a fare ciò ma in "ThisWorkbook" mi da sempre un errore di runtime.

                Ho quindi cercato di evitare il problema utilizzando in beforeclose la macro Limpa nella quale eseguo questo codice ma non funziona ugualmente.

                #7176 Risposta
                Luca73
                Luca73
                Partecipante
                  4 pts

                  Penso di aver capito il problema

                  leggendo 

                  http://www.snb-vba.eu/VBA_Application.OnTime_en.html

                  dice che:

                  per fermare 

                  Sub M_snb_ontime_start()
                  MsgBox "illustration"
                  Application.OnTime TimeSerial(12, 45, 0), "M_snb_ontime_start"
                  End Sub

                  If this macro has been executed it will execute itself over and over again as long as the application - Excel - hasn't been quit.
                  If you don't want that you will have to start a macro that will cancel the ontime method.
                  The only way to do so is to cancel the ontime method using the exact same macro name and time and setting the argument 'Schedule' to FALSE.
                  Stop the planned action before it's 12.45 o'clock
                  Sub M_snb_ontime_cancel()
                  Application.OnTime TimeSerial(12, 45, 0), "M_snb_ontime_start", , False
                  End Sub
                  In this case it's simple because it's a fixed time value.

                  It's less simple in the case of a variable time value, e.g. dateadd("s",10,time).
                  In such a case you will have to register the time value to be able to execute the 'cancel' macro.

                  You can register the time value in 2 ways:
                  - use a variable to store the time value
                  that variable has to be available/accessible in both macros (the start macro and the cancel macro) 
                  - use a property of the application (Excel), of a workbook or a worksheet or one of the objects in the application, a workbook or a worksheet

                  #7178 Risposta

                  vecchio frac
                  Moderatore
                    23 pts
                    'rendi disponibile la funzione
                    Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
                    
                    'uccidi il timer
                    Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
                    
                    'inserisci qui il codice da eseguire
                    Public Sub TimerRoutine(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal SysTime As Long)
                    .
                    .
                    .
                    End sub
                    
                    'per attivare il timer ogni 500 millisecondi
                    timerID = SetTimer(0, 0, 500, AddressOf Timer_Routine)
                    
                    'per disattivare il timer
                    KillTimer 0, timerID

                    Questo per completare l'info. Poi magari vediamo come funziona 🙂

                  Login Registrati
                  Stai vedendo 8 articoli - dal 1 a 8 (di 8 totali)
                  Rispondi a: Problema VBA e Macro: Riapertura in Loop del file a chiusura anticipata
                  Gli allegati sono permessi solo ad utenti REGISTRATI
                  Le tue informazioni:



                  vecchio frac - 830 risposte

                  albatros54
                  albatros54 - 516 risposte

                  Marius44
                  Marius44 - 282 risposte

                  patel
                  patel - 264 risposte

                  Luca73
                  Luca73 - 235 risposte