Attivare o disattivare macro
Hai un problema con Excel? 
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!!!!!!!!!!!!!
Vuoi Approfondire?