Attivare o disattivare macro



  • Attivare o disattivare macro
    di Ermes.Maz (utente non iscritto) data: 07/01/2015 17:18:36

    Ciao, vi scrivo per chiedervi se esiste la possibilità di attivare o disattivare tutte le macro di un progetto a progetto avviato.
    All'avvio excel mi chede se voglio attivare o no le macro, io avrei la necessità di attivarle o disattivarle a piacimento durante la lavorazione.
    Sapete dirmi se è possibile e come fare?
    Il top sarebbe creare una macro che mi attivi tutte le altre macro e un'altra che le disattivi.
    Nel mio foglio sono presenti SUB e FUNCTION...
    Le SUB vanno nel momento che le lancio ma le FUNCTION sono sempre attive.
    Sapete aiutarmi?



  • di lepat (utente non iscritto) data: 07/01/2015 17:33:22

    prova col codice allegato, ma non funzionerà più nessuna formula
     
    Sub disabilita()
    ActiveSheet.EnableCalculation = False
    End Sub
    
    Sub abilita()
    ActiveSheet.EnableCalculation = True
    End Sub



  • di Vecchio Frac data: 07/01/2015 18:26:59

    cit. "se esiste la possibilità di attivare o disattivare tutte le macro di un progetto a progetto avviato."
    ---> Non credo. Ma con un piccolo trucco forse...

    cit. "Le SUB vanno nel momento che le lancio ma le FUNCTION sono sempre attive. "
    ---> Ma "attivare e disattivare le macro" è cosa diversa dal permettere o no il ricalcolo delle proprie funzioni.
    Comunque oltre a quello che ha detto lepat prova anche con "Application.Volatile False" prima delle tue Function. Così le tue udf non vengono ricalcolate a meno di non forzarle.

     
    'piccolo trick: per intercettare l'evento Change del foglio ed impedirlo, settare una variabile globale (come fosse in modo "debug") e controllarla per permettere o no l'esecuzione del codice
    
    Public AbortChangeEvent As Boolean
    
    Private Sub Worksheet_Change(ByVal Target As Range)
        If AbortChangeEvent = True Then Exit Sub
    
        '
        ' resto del codice
        '
    End Sub






  • di Ermes.Maz (utente non iscritto) data: 07/01/2015 20:15:51

    Grazie Lepat

    Il fatto che non funzioni più nulla mi puo star bene... Basta che vada quando le riattuvo.

    Attualmente per lavorate bene sul foglio devo avviare il file con macro disattivate poi una volta modificato salvo, chiudo e riavvio con macro attive...

    Un tasto che mi permetta di disattivare e attivare tutto all'occorrenza sarebbe il top

    Vecchio Frac... Le.macro mi creano fogli, girano i servizi ecc....
    Le function fanno i calcoli e le numerose celle che usano le function rallentano tutto.

    Disattivarle e attivarle all'occorrenza è ciò che mi interesserebbe fare



  • di lepat (utente non iscritto) data: 08/01/2015 08:10:58

    Le macro possono portare problemi di sicurezza, quindi l'attivazione/disattivazione è obbligatoriamente manuale.
    Anche se fosse possibile disattivarle da codice poi non sarebbe possibile ovviamente riattivarle da codice .



  • di Ermes.Maz (utente non iscritto) data: 08/01/2015 08:46:49

    Grazie Lepat della delucidazione...

    ora provo i codici proposti da te e Vecchio Frac



  • di Ermes.Maz (utente non iscritto) data: 08/01/2015 09:22:35

    Vecchio Frac... perdonami ma non son riuscito a far funzionare i codici da te proposti...

    Son riuscito invece ad inserire i codici proposti da Lepat e vanno ottimamente direi!!!

    Lepat... volevo chiederti... per far in modo che la disattivazione sia su tutti i fogli e non solo su quello attivo... devo modificare cosi?


     
    Sub disabilita()
    thisworkbook = False
    End Sub
    
    Sub abilita()
    thisworkbook = True
    End Sub



  • di Ermes.Maz (utente non iscritto) data: 08/01/2015 09:35:53

    Vecchio Frac... Giusto per capirci... Va modificata cosi la FUNCTION con il trick?
     
    Public AbortChangeEvent As Boolean
    
    Private Sub Worksheet_Change(ByVal Target As Range)
        If AbortChangeEvent = True Then Exit Sub
    
    Function RegExpReplace(selectString As String) As String
    Dim objRegExp As Object
        Set objRegExp = CreateObject("vbscript.regexp")
        
        With objRegExp
            .Global = True
            .IgnoreCase = True
            
                If Len(selectString) = 1 Then
                    .Pattern = ""
                Else
                    .Pattern = "(S|F)$"
                End If
        
        RegExpReplace = .Replace(selectString, "")
        
        End With
    
    End Function
    
    End Sub



  • di Vecchio Frac data: 08/01/2015 09:59:42

    No, la sintassi è sbagliata: non puoi in VBA innestare una Function *dentro* una Sub.
    La Function viene richiamata da una Sub ma è una porzione di codice a sè stante.
    Ora non ricordo bene come doveva applicarsi al caso concreto, ma è qualcosa del genere che allego.

    Per la tua seconda domanda: "per far in modo che la disattivazione sia su tutti i fogli e non solo su quello attivo... devo modificare cosi? " la risposta è parimenti no, la cosa che hai scritto è senza senso (come fai a pensare di mettere a Falso o Vero un oggetto WorkBook?).


    Sub disabilita()
    dim ws as worksheet
    for each ws in thisworkbook.sheets
    ws.enablecalculation = false
    next
    End Sub

    Sub abilita()
    dim ws as worksheet
    for each ws in thisworkbook.sheets
    ws.enablecalculation = true
    next
    End Sub

     
    Public AbortChangeEvent As Boolean
    
    Private Sub Worksheet_Change(ByVal Target As Range)
        If AbortChangeEvent = True Then Exit Sub
        
        Application.EnableEvents = False
        MsgBox RegExpReplace(Target.Value)
        Application.EnableEvents = True
    End SUb
    
    Private Function RegExpReplace(selectString As String) As String
    Dim objRegExp As Object
        Set objRegExp = CreateObject("vbscript.regexp")
        
        With objRegExp
            .Global = True
            .IgnoreCase = True
            
                If Len(selectString) = 1 Then
                    .Pattern = ""
                Else
                    .Pattern = "(S|F)$"
                End If
        
        End With
    
        RegExpReplace = .Replace(selectString, "")
    
    End Function






  • di scossa data: 08/01/2015 10:16:01

    cit. Vecchio Frac: "... prova anche con "Application.Volatile False" prima delle tue Function"

    N.B.: le user function sono di default non volatili quindi richiamare il metodo Application.Volatile con l'opzione False è del tutto inutile.


    Il sistema più pratico per disabilitare l'esecuzione delle proprie macro è:
    - creara una variabile boolean pubblica (Public bDisable as Boolean)
    - creare una Sub Disbilita che imposti a True bDisable
    - creare una Sub Abilita che imposti a False bDisable
    - modificare le altre sub mettendo in testa l'istruzione If bDisable Then Exit Sub





    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di scossa data: 08/01/2015 10:20:57


    N.B.: non avevo letto l'ultimo intervento di V.F., ma quanto sopra suggerito permette di modificare le celle senza vincoli.




    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)




  • di Ermes.Maz (utente non iscritto) data: 08/01/2015 22:30:57

    Scusate la mia IGNORANZA... ma sono veramente ad un livello basso di conoscenza...

    GRAZIE DI VERO CUORE PER L'AIUTO CHE SEMPRE E PRONTAMENTE OFFRITE A CHI COME ME E' IN DIFFICOLTA'...

    GRAZIE!!!!!!!!!!!!!