macro a tempo



  • macro a tempo
    di michele 1985 (utente non iscritto) data: 06/03/2014 13:58:42

    salve a tutti, vorrei chiedervi, se possibile, un aiutino per un piccolo problema con una macro
    Vorrei fare in modo che venga eseguita ogni 10 secondi
    Vi spiego il perchè. Ho un file excel sul mio pc che scambia dati con un altro file su un server aziendale. La macro mi serve perchè i valori delle celle non vengono aggiornati se non aprendo e chiudendo il 2 files...molto noioso

    Grazie
    Michele



  • di Lucas87 data: 06/03/2014 14:24:00

    Ciao
    Metti questo in un nuovo modulo e aggiungi le operazioni che vuoi fare
    Poi puoi creare dei pulsanti del tipo "START" e "STOP" e collegarci le macro
     
    Public control As Boolean
    
    Public Sub tua_macro()
        If control = True Then
    '''*****qui quello che devi fare
        VIA
        End If
    End Sub
    
    Public Sub VIA()
        Application.OnTime Now + TimeValue("00:00:10"), "tua_macro"
        control = True
    End Sub
    
    Public Sub ferma()
        control = False
     End Sub
    



  • di michele 1985 (utente non iscritto) data: 06/03/2014 15:44:15

    ah ok, però la mia esigenza è più semplice.
    devo eseguire un "aggiorna valori" con il codice riportato sotto dall'apertura alla chiusura del file ogni 10 secondi.
    Tutto qua
     
    Sub aggiorna_dati()
    
    ' aggiorna_dati Macro
        ActiveWorkbook.UpdateLink Name:= _
            "\percorso_di_retegruppi.xlsx", Type:=xlExcelLinks
    End Sub
    



  • di Lucas87 data: 06/03/2014 15:57:32

    Ok.
    Il tuo ActiveWorkbook.UpdateLink.....lo metti dove io ho scritto '''*****qui quello che devi fare

    Poi in "ThisWorkbook" per l'evento Open scrivi

    via

    Ricapitolando:
    Quando si apre il file viene avviata la sub via che dopo 10 sec. fa l'aggiornamento e poi richiama ancora la sub via che dopo 10 sec......
    Alla fine non so se si possa semplicemente chiudere per fermare oppure (per correttezza) legare la sub ferma all'evento beforclose.



  • di michele 1985 (utente non iscritto) data: 06/03/2014 16:40:52

    perdonami ma non sono ferratissimo...
    potresti scrivermi il codice da mettere in ThisWorkbook e quello da mettere in un modulo?
    grazie



  • di Lucas87 data: 06/03/2014 16:53:49

    Ho allegato un file



  • di michele 1985 (utente non iscritto) data: 06/03/2014 17:37:18

    ottimo!
    ma ora c'è una difficoltà in più ovvero che il file è protetto e condiviso in rete...quindi non funziona



  • di Lucas87 data: 06/03/2014 18:29:48

    Hai due possibilità
    1- Più macchinosa. Prima dell'aggiornamento togli e dopo metti la protezione. Quindi
    worksheets("tuofoglio").unprotect
    ActiveWorkbook.UpdateLink.....
    worksheets("tuofoglio").protect
    2- Più raffinato. Sempre nell'evento open vai a scrivere
    worksheets("tuofoglio").protect, userinterfaceonly:=True
    In questo modo il foglio è protetto ma comunque riesci a fare delle modifiche tramite codice.



  • di michele 1985 (utente non iscritto) data: 07/03/2014 13:03:12

    ci siamo quasi...
    va bene per il foglio protetto ma non quando lo condivido ("proteggi e condividi cartella di lavoro")
    come posso modificarlo?
    ps. ho usato il metodo "raffinato"



  • di scossa data: 07/03/2014 13:20:00

    @ Lucas87 : attenzione, la logica del tuo codice (usare la variabile control) non va bene, quando si "innesca" un evento OnTime, prima di chiudere il file bisogna "disinnescarlo" tramite il parametro Schedule:=False.

    Ho già richiamato più volte l'attenzione su questa cosa, ma evidentemente ......

    cit scossa: "Quando si schedula una routine con il metodo OnTime si DEVE anche provvedere alla sua rimozione altrimenti (essendo un metodo a livello di applicazione) se chiudi il file che l'ha schedulata, ma continui a lavorare con Excel, lui cercherà di rieseguirla.

    Leggi l'help del il metodo Application.OnTime, (parametro Schedule:
    Schedule Facoltativo Variant Se ha valore True, verrà programmata una nuova routine OnTime. Se ha valore False, verrà annullata una routine impostata in precedenza. Il valore predefinito è True.)
    C'è anche un esempio di come usarlo. "





  • di michele 1985 (utente non iscritto) data: 07/03/2014 13:24:54

    onestamente non ci ho capito molto...

    come dovrebbe essere il mio codice a questo punto? non sono molto espetro di VBA



  • di Lucas87 data: 07/03/2014 18:15:33

    Grazie scossa.
    Avevo proprio quel dubbio.
    è per quello che ho scritto che sarebbe meglio attivare l'evento beforclose e mettere la variabile =false in modo da terminare la procedura.



  • di scossa data: 07/03/2014 19:04:02

    cit. lucas87: "è per quello che ho scritto che sarebbe meglio attivare l'evento beforclose e mettere la variabile =false in modo da terminare la procedura."

    No, no, non è la variabile da mettere a false ma il parametro Schedule nella chiamata dell'evento:
    Application.OnTime ..... Schedule:=false

    Leggi l'help, cercq qualche esempio e sono certo che riuscirai a proporre una soluzione corretta.



  • di michele 1985 (utente non iscritto) data: 11/03/2014 15:27:31

    grazie ragazzi!!!!!