Condividi tramite

Attivazione macro (Impostazioni macro sviluppatori) tramite VBA

Anonimo
2016-03-17T21:55:54+00:00

Salve,

avrei bisogno di sapere se è possibile attivare l'utlizzo delle macro da codice VBA al posto di attivarlo tramite centro di protezione.

Il mio problema è su Excel 2010, ho creato una Routine che all'apertura del file controlla i riferimenti del VBProcjet e se non attivi gli attiva. Sul mio pc le "Impostazioni macro sviluppatori" sono attive, ma chi usufruisce del mio Excel non sempre le ha attive, vorrei sapere se c'è la possibilità di attivarla tramite codice VBA.

Grazie

Saluti

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

  1. Anonimo
    2016-03-18T15:46:52+00:00

    Ciao Matteo,

    Meglio sarebbe di utilizzare una routine dedicata per controllare;/creare i nomi, Quindi, ignora le modifiche suggerite nella mia ultima risposta e lascia il codice della routine Workbook_Open intoccato. Invece, nel modulo standard, sostituisci

    '--------->>

    Public Sub UnHideSheets()

        Dim WB As Workbook

        Dim SH As Worksheet

        Dim splashSH As Worksheet

        Dim arrHidden As Variant, arrVeryHidden As Variant

        Dim Res As Variant, Res2 As Variant

        Set WB = ThisWorkbook

        With WB

            Set splashSH = .Worksheets(sSplash)

            arrHidden = Split(Evaluate(.Names(sHiddenSheets).RefersTo), ",")

            arrVeryHidden = Split(Evaluate(.Names(sVeryHiddenSheets).RefersTo), ",")

        End With

        Application.EnableEvents = True

        For Each SH In ThisWorkbook.Worksheets

            With SH

                If .Name <> sSplash Then

                    Res = Application.Match(.Name, arrHidden, 0)

                    Res2 = Application.Match(.Name, arrVeryHidden, 0)

                    If IsError(Res) And IsError(Res2) Then

                        .Visible = xlSheetVisible

                    End If

                End If

            End With

        Next SH

        splashSH.Visible = xlSheetVeryHidden

        WB.Saved = True

    End Sub

    '--------->>

    con:

    '--------->>

    Public Sub CreateNames()

        Dim aName As Name, bName As Name

        With ThisWorkbook

            On Error Resume Next

            Set aName = .Names(sHiddenSheets)

            Set bName = .Names(sVeryHiddenSheets)

            If aName Is Nothing Then

                Set aName = Names.Add(Name:=sHiddenSheets, _

                                      RefersTo:="/", _

                                      Visible:=False)

                Set bName = .Names.Add(Name:=sVeryHiddenSheets, _

                                       RefersTo:="/", _

                                       Visible:=False)

            End If

        End With

        On Error GoTo 0

    End Sub

    '--------->>

    Public Sub UnHideSheets()

        Dim WB As Workbook

        Dim SH As Worksheet

        Dim splashSH As Worksheet

        Dim arrHidden As Variant, arrVeryHidden As Variant

        Dim Res As Variant, Res2 As Variant

        Set WB = ThisWorkbook

        Call CreateNames

        With WB

            Set splashSH = .Worksheets(sSplash)

            arrHidden = Split(Evaluate(.Names(sHiddenSheets).RefersTo), ",")

            arrVeryHidden = Split(Evaluate(.Names(sVeryHiddenSheets).RefersTo), ",")

        End With

        Application.EnableEvents = True

        For Each SH In ThisWorkbook.Worksheets

            With SH

                If .Name <> sSplash Then

                    Res = Application.Match(.Name, arrHidden, 0)

                    Res2 = Application.Match(.Name, arrVeryHidden, 0)

                    If IsError(Res) And IsError(Res2) Then

                        .Visible = xlSheetVisible

                    End If

                End If

            End With

        Next SH

        splashSH.Visible = xlSheetVeryHidden

        WB.Saved = True

    End Sub

    '--------->>

    Ho aggiornato il mio file di esempio.

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento

6 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2016-03-18T10:11:34+00:00

    Ciao,

    hai ragione io pensavo per fare le cose più veloci e comode, ma in effetti sarebbe molto dannoso.

    saluti

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2016-03-18T07:58:57+00:00

    Ciò che tu richiede rappresenta una impossibilità pratica! VBA può funzionare solo se sono state attivate le macro. Ne consegue che VBA non può attivare le macro se esse non siano già state attivate.

    Ciao Matteo.

    Oltre alla risposta di Fratello Norman che quoto qui sopra, *forzeresti* un settaggio che l'utente ha sul suo computer.

    Ne abbiamo discusso più o meno anche qui:

    Ancora una volta il vb di Excel serve per *automatizzare* i file e non per creare programmi e la sicurezza ed il vb percorrono strade differenti. Per quest'ultimo punto Microsoft lascia al singolo utente (o al gestore della rete) la possibilità di impedire che venga eseguito il codice.

    Se fosse possibile via vb modificare quell'impostazione, chi si *diverte* a creare problemi nei pc altrui  non avrebbe molto da faticare, no? ;-)

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2016-03-18T05:37:28+00:00

    Ciao Matteo,

    Al fine di dimostrare l'approccio suggerito, prova quanto segue:

    • Crea tuo file
    • Inserisci un foglio, senza dati, con un messagio di avviso per quanto riguarda l'attivazione delle macro
    • Nomina questo foglio AbilitaMacro
    • Salva il file con l'estensione xlsm
    • Nel modulo di codice dell'oggetto ThisWorkbook (Questa_cartella_di_lavoro), incolla il seguente codice

    '=========>>

    Option Explicit

    '--------->>

    Private Sub Workbook_Open()

        Application.ScreenUpdating = False

        Call UnHideSheets

        Application.ScreenUpdating = True

    End Sub

    '--------->>

    Private Sub Workbook_BeforeClose(Cancel As Boolean)

        Dim Res As VbMsgBoxResult

        Application.ScreenUpdating = False

        If ThisWorkbook.Saved = False Then  '\ Dirty file

            Res = MsgBox(Prompt:="Vuoi salvare questo file?", _

                         Buttons:=vbYesNoCancel, _

                         Title:="SALVA FILE?")

            If Res = vbYes Then

                Call HideSheets

                Call SaveWorkbook

            ElseIf Res = vbNo Then

                ThisWorkbook.Saved = True

            Else

                Cancel = True

            End If

        Else

            '\ Do nothing: Workbook Closes

        End If

        Application.ScreenUpdating = True

    End Sub

    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

        Dim currentSH As Worksheet

        Set currentSH = ActiveSheet

        Cancel = True

        Application.ScreenUpdating = False

        Call HideSheets

        Call SaveWorkbook

        Call UnHideSheets

        currentSH.Activate

        Application.ScreenUpdating = True

    End Sub

    '<<=========

    • In un modulo standard, incolla il seguente codice:

    '=========>>

    Option Explicit

    '--------->>

    Public Const sSplash As String = "AbilitaMacro"                             '<<=== Modifica

    Public Const sHiddenSheets As String = "HiddenSheets"

    Public Const sVeryHiddenSheets As String = "VeryHiddenSheets"

    '--------->>

    Public Sub HideSheets()

        Dim WB As Workbook

        Dim SH As Worksheet

        Dim splashSH As Worksheet

        Dim arrHidden() As Variant, arrVeryHidden() As Variant

        Dim sStr As String, sStr2 As String

        Dim i As Long, j As Long

        Set WB = ThisWorkbook

        Set splashSH = WB.Worksheets("AbilitaMacro")

        splashSH.Visible = xlSheetVisible

        For Each SH In WB.Worksheets

            With SH

                If .Name <> sSplash Then

                    If .Visible = xlSheetVeryHidden Then

                        i = i + 1

                        ReDim Preserve arrVeryHidden(1 To i)

                        arrVeryHidden(i) = .Name

                    ElseIf .Visible = xlSheetHidden Then

                        j = j + 1

                        ReDim Preserve arrHidden(1 To j)

                        arrHidden(j) = .Name

                    End If

                    If .Visible = xlSheetVisible Then

                        .Visible = xlSheetVeryHidden

                    End If

                End If

            End With

        Next SH

        If CBool(i) Then

            sStr = Join(arrVeryHidden, ",")

            WB.Names.Add Name:=sVeryHiddenSheets, RefersTo:=sStr

        End If

        If CBool(j) Then

            sStr2 = Join(arrHidden, ",")

            WB.Names.Add Name:=sHiddenSheets, RefersTo:=sStr2

        End If

    End Sub

    '--------->>

    Public Sub UnHideSheets()

        Dim WB As Workbook

        Dim SH As Worksheet

        Dim splashSH As Worksheet

        Dim arrHidden As Variant, arrVeryHidden As Variant

        Dim Res As Variant, Res2 As Variant

        Set WB = ThisWorkbook

        With WB

            Set splashSH = .Worksheets(sSplash)

            arrHidden = Split(Evaluate(.Names(sHiddenSheets).RefersTo), ",")

            arrVeryHidden = Split(Evaluate(.Names(sVeryHiddenSheets).RefersTo), ",")

        End With

        Application.EnableEvents = True

        For Each SH In ThisWorkbook.Worksheets

            With SH

                If .Name <> sSplash Then

                    Res = Application.Match(.Name, arrHidden, 0)

                    Res2 = Application.Match(.Name, arrVeryHidden, 0)

                    If IsError(Res) And IsError(Res2) Then

                        .Visible = xlSheetVisible

                    End If

                End If

            End With

        Next SH

        splashSH.Visible = xlSheetVeryHidden

        WB.Saved = True

    End Sub

    '--------->>

    Public Sub SaveWorkbook()

        Application.EnableEvents = False

        ThisWorkbook.Save

        Application.EnableEvents = True

    End Sub

    '<<=========

    Nota che che questo codice assicura che tutti i fogli precedentemente nascosti rimangano nascosti e che tutti i fogli eventualmente nascosti da parte dell'utente anche rimangono nascosti.

    Potresti scaricare il mio file di prova Matteo20160318.xlsm a:

    https://www.dropbox.com/s/eyti91bi32s78f8/Matteo20160318.xlsm?dl=0

    Ai fini della dimostrazione, questo file include un foglio nascosto dall'interfaccia utente (Foglio 4) e due fogli (molto) nascosti da VBA (Foglio5 e Foglio6).

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2016-03-17T22:39:12+00:00

    Ciao Matteo,

    avrei bisogno di sapere se è possibile attivare l'utlizzo delle macro da codice VBA al posto di attivarlo tramite centro di protezione.

    Il mio problema è su Excel 2010, ho creato una Routine che all'apertura del file controlla i riferimenti del VBProcjet e se non attivi gli attiva. Sul mio pc le "Impostazioni macro sviluppatori" sono attive, ma chi usufruisce del mio Excel non sempre le ha attive, vorrei sapere se c'è la possibilità di attivarla tramite codice VBA.

    Ciò che tu richiede rappresenta una impossibilità pratica! VBA può funzionare solo se sono state attivate le macro. Ne consegue che VBA non può attivare le macro se esse non siano già state attivate.

    Credo che l'approccio migliore sarebbe quello di nascondere tutto i fogli ad eccezione di un singolo foglio di saluto. Si potrebbe quindi utilizzare l'evento Workbook_Open per far riapparire i fogli richiesti e nascondere il foglio di saluto. Se l'utente non attiva le macro, solo il foglio di saluto sarà visibile e il file sarà inutilizzabile. Con questo approccio, il foglio di saluto normalmente comprenderebbe un messaggio che avvisa l'utente di attivare le macro. Inoltre, si utilizzerebbe l`evento Workbook_BeforeClose per nascondere i fogli utili e per far apparire il foglio di saluto.

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento