Abilita Macro da codice VBA

di il
5 risposte

Abilita Macro da codice VBA

In aggiunta al metodo dell'inserimento di una "Trusted Location" da codice, per poter eliminare il fastidioso messaggio "Avviso di protezione - Alcuni contenuti del database sono stati disattivati", io ho provato l'alternativa di abilitare tutte le macro da codice. Al primo avvio Access farà comparire l'avviso ma abilitando il contenuto viene eseguita la function che abilita le macro ed al successivo avvio l'avviso non comparirà più perchè tutte le macro saranno abilitate.

Questo avviene perchè la function modifica il valore di una chiave di registro, che si chiama "VBAWarnings", e se questa non esiste la crea e la impostata al valore corertto per abilitare tutte le macro.

Se può servire a qualcuno, posto il codice della mia function qui sotto:

'Aggiungere il riferimento alla libreria "Microsoft Script Host Object Model"
 
Public Function AbilitaMacro()
Dim Ws As WshShell
Dim KeyReg As String
Dim Vers As String

On Error GoTo AbilitaMacroErr

Vers = Access.Version
KeyReg = "HKEY_CURRENT_USER\Software\Microsoft\Office\" & Vers & "\Access\Security\" ' percorso della chiave di registro

Set Ws = New WshShell

If Ws.RegRead(KeyReg & "VBAWarnings") <> 1 Then
    Ws.RegWrite KeyReg & "VBAWarnings", 1, "REG_DWORD"
End If

AbilitaMacroErr:

If Err.Number = 0 Then
ElseIf Err.Number = -2147024894 Then ' gestione del caso in cui la chiave di registro non esista
    Resume Next
Else
    MsgBox "Errore n° " & Err.Number & vbCrLf & _
            Err.Description & vbCrLf & _
            "Problemi con l'abilitazione delle Macro.", vbExclamation, ""
    Exit Function
End If

End Function
Io l'ho provata su diversi computer che avevavo versioni di Access 2007 e 2010 e sembra funzionare bene.

5 Risposte

  • Re: Abilita Macro da codice VBA

    Scusami ma nei riferimenti non trovo la libreria: "Microsoft Script Host Object Model" da te indicata come posso fare??
    Grazie
  • Re: Abilita Macro da codice VBA

    alip1 ha scritto:


    Scusami ma nei riferimenti non trovo la libreria: "Microsoft Script Host Object Model" da te indicata come posso fare??
    Grazie
    In realtà NON SERVE..., il VBA supporta LateBinding... che è sempre buona tecnica usare, EarlyBinding si usa SOLO in fase di Sviluppo e se il Componente COM deve consentire la Gestione di Eventi, a quel punto è Necessario EarlyBinding con dichiarazione di WithEvents, ma diventa altrettanto indispensabile fare un Check della Versione del Riferimento di SVILUPPO rispetto a quello del PC su cui si installa il Client altrimenti non sono non va questa parte ma verrà compromesso il Client...!
    Quindi invece di usare questo:
    
    Dim Ws As WshShell
    ...
    Set Ws = New WshShell
    Si usa questo che non richiede alcun Riferimento:
    
    Dim Ws As Object
    Set Ws=CreateObject("WScript.Shell")
    Per il resto questa soluzione non la ritengo Valida in quanto spesso in Aziende strutturate le Policy inibiscono l'accesso al Registry se non ad un Utente abilitato... quindi servirebbe operare come altro USER...
    Quindi anche l'aggiunta a ThrustedLocation va fatta da User ADMIN, di conseguenza sono azioni da far eseguire all'INSTALLER che appunto verrà eseguito come ADMIN e non al VBA o al Client.
  • Re: Abilita Macro da codice VBA

    @Alex ha scritto:


    In realtà NON SERVE..., il VBA supporta LateBinding... che è sempre buona tecnica usare...
    Grazie per la precisazione Alex. In effetti, successivamente, anch'io ho sostituito EarlyBinding con il LateBinding.

    @Alex ha scritto:


    Per il resto questa soluzione non la ritengo Valida in quanto spesso in Aziende strutturate le Policy inibiscono l'accesso al Registry se non ad un Utente abilitato... quindi servirebbe operare come altro USER...
    Quindi anche l'aggiunta a ThrustedLocation va fatta da User ADMIN, di conseguenza sono azioni da far eseguire all'INSTALLER che appunto verrà eseguito come ADMIN e non al VBA o al Client.
    Anche se non molto valida, e magari poco consigliabile per questioni di sicurezza, è comunque un'alternativa alla ThrustedLocation che si può fare da semplice utente senza particolari diritti di amministrazione (almeno per quello che ho sperimentato io in un Azienda con Policy abbastanza restrittiva).
  • Re: Abilita Macro da codice VBA

    mikelemm ha scritto:


    ....
    Anche se non molto valida, e magari poco consigliabile per questioni di sicurezza, è comunque un'alternativa alla ThrustedLocation che si può fare da semplice utente senza particolari diritti di amministrazione (almeno per quello che ho sperimentato io in un Azienda con Policy abbastanza restrittiva).
    Nella mia azienda non si accede al Registry...
    Volevo tuttavia riflettessi sull'opportunità di inserire in un Client queste cose... questo era il concetto che avevo espresso...!
    Il Client non ha questo compito, cosa fai riesegui la scrittura del Registry ad ogni aperetura...?

    Siccome è propedeutico al Funzionamento del Client, si dovrebbe a mio avviso delegare questa cosa ad un qualche "aggeggio" ESTERNO, banalmente un file BATCH ad esempio o, se vuoi usare quel codice un VBS che si lancia ONESHOT.

    In realtà il modo giusto è usare un INSTALLER(InnoSetup ad esempio) che genera un EXE che in fase di Installazione(decidi tu se in Pre o Post) va a scrivere/modificare quella chiave...
  • Re: Abilita Macro da codice VBA

    Il Client effettua un controllo sulla voce di registro e nell'eventualità che non sia impostata sul valore voluto allora va a cambiare il valore.
    Questa era una soluzione che elaborai un po' di tempo fa sulla base delle mie poche conoscenze informatiche. Dato che sui computer della mia azienda non posso installare nulla senza diritti di amministrazione, mi arrangio un po' come posso per far funzionare le cose.
    A prescindere da tutto ciò, lè soluzioni da te proposte, Alex, sono sicuramente più corrette.
Devi accedere o registrarti per scrivere nel forum
5 risposte