Posizionemento Application.EnableEvents

Anonimo
2011-01-05T15:20:03+00:00

Buona sera. Ringrazio il Sig. Mauro Gamberini per le indicazioni fornite sul copia incolla del 17 dicembre 2010. Ora mi trovo di fronte ad un altro problma di VBA come da titolo. Per prima cosa Vi inserisco i codici finali della precedente discussione.

Sul Foglio:

Private Sub Worksheet_Calculate()

'Application.ScreenUpdating = False

'Application.EnableEvents = False

    If Range("AB49") = 1 Then

    Intermittenza

    ElseIf Range("AB49") = 2 Then

    Pausa

    End If

'Application.EnableEvents = True

'Application.ScreenUpdating = True

End Sub

Sul modulo

Public Sub Intermittenza()

Application.EnableEvents = False

On Error GoTo RigaErrore

    Dim wk1 As Workbook

    Dim sh1 As Worksheet

    With ThisWorkbook

        Set sh1 = .Worksheets("DDE")

    End With

    With sh1

        .Range("AC3:AL42").Value = _

            .Range("R3:AA42").Value

        .Range("AB47").FormulaR1C1 = "0"

End With

RigaChiusura:

    Set sh1 = Nothing

    Set wk1 = Nothing

    Exit Sub

RigaErrore:

    MsgBox Err.Number & vbNewLine & Err.Description

    Resume RigaChiusura

Application.EnableEvents = True

End Sub

Public Sub Pausa()

Application.EnableEvents = False

On Error GoTo RigaErrore

    Dim wk1 As Workbook

    Dim sh1 As Worksheet

    With ThisWorkbook

        Set sh1 = .Worksheets("DDE")

    End With

    With sh1

        .Range("AB47").FormulaR1C1 = "1"

    End With

RigaChiusura:

    Set sh1 = Nothing

    Set wk1 = Nothing

    Exit Sub

RigaErrore:

    MsgBox Err.Number & vbNewLine & Err.Description

    Resume RigaChiusura

Application.EnableEvents = True

End Sub

Il sistema funziona correttamente, l'evento Calculate viene ricavato da un collegamento con un altra cartella con l'orologio, come precedentemente discusso. Il punto è che se non proteggo il foglio tutto funziona correttamente mentre se proteggo il foglio e provo ad inserire Enable.Events nella routine principale non rimane protetto, mentre se lo imposto nelle routine collegate si blocca dopo aver eseguito la seconda.

Qualcuno ha un idea di come si possa proteggere tutto il foglio senza che si blocchi.

Grazie fi da adesso

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
Anonimo
2011-01-10T08:52:44+00:00

Grazie per le informazioni. Nel frattempo mi è venuta un idea che può servire anche ad altri utenti. In pratica ho messo nel Foglio1 il collegamento protetto ed i controlli non protetti mentre nel Foglio2 la routine sopra esposta, senza protezione. Infine ho aggiunto nel foglio1 un pulsante con la seguente routine:

Private Sub CommandButton3_Click() '

    If Range("AB1") = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Then

    Worksheets("DDECollegamento").Visible = False

    ElseIf Range("AB2") = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Then

    Worksheets("DDECollegamento").Visible = True

    End If

End Sub

Inserendo nella cella indicata il codice posso far vedere o nascondere il foglio2. Nascosto il foglio si cancella la password dalla cella indicata e questo impedisce di vedere e modificare il foglio2. La routine funziona correttamente e, mi sembra che, l'unico modo per conoscere il codice è crackare la pasword del progetto VBA.

Un accorgimento, ho inserito le lettere perchè se inserisco una serie di 0, zeri, VBA li riconosce come numero e ne accetta solamente uno. Come è possibile dire al programma che è una stringa testo?

Grazie per la risposta.

Capito poco e penso che sia inutile quello che proponi. Esiste la possibilità di utilizzare i nomi nascosti per la password, senza la necessità di utilizzare la cella di un foglio nascosto. Scusa, ma mi fanno sempre sorridere i tentativi di proteggere il file di Excel e le strade che seguite. Excel *non si difende* con quello che mette a disposizione. Anche la protezione del codice si toglie in 3 minuti, basta sapere cosa fare ed in rete si trova di tutto. Come ho detto più volte, una strada abbastanza sicura è quella di mettere la logica(il codice) in una ActiveX DLL. Questo non lo fai con Excel, ma ad esempio con Visual Studio 6.0 o Visual Basic 6.0. La ActiveX DLL è compilata, quindi più sicura(nulla è però impossibile). La DLL va poi registrata e referenziata sulle macchine che utilizzano il file.  

Ti posto il codice per il Name nascosto, se vuoi sapere di più sulle ActiveX DLL, per favore apri un nuovo post, grazie:

Public Sub m()

    ActiveWorkbook.Names.Add Name:="myName", _

        RefersTo:="tuaPassword", Visible:=False

End Sub

Questa routine va poi eliminata. Ed ecco comerecuperare il contenuto del contenuto di myName:

Private Sub m_1()

    MsgBox [myName]

End Sub

Quindi, facile adesso fare una UserForm di immissione password che confronti quanto inserito ad esempio in una TextBox con myName.


--

La soluzione, il codice ed i files sono forniti *così come sono* e l’autore declina ogni responsabilità per eventuali problemi causati dalla soluzione proposta se usata impropriamente. Create e utilizzate una copia del file per le vostre prove, *prima* di utilizzare la soluzione in files importanti.

--

Mauro Gamberini - Microsoft© MVP(Excel)

http://www.maurogsc.eu/

La risposta è stata utile?

0 commenti Nessun commento

3 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2011-01-09T09:34:14+00:00

    Grazie per le informazioni. Nel frattempo mi è venuta un idea che può servire anche ad altri utenti. In pratica ho messo nel Foglio1 il collegamento protetto ed i controlli non protetti mentre nel Foglio2 la routine sopra esposta, senza protezione. Infine ho aggiunto nel foglio1 un pulsante con la seguente routine:

    Private Sub CommandButton3_Click() '

        If Range("AB1") = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Then

        Worksheets("DDECollegamento").Visible = False

        ElseIf Range("AB2") = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Then

        Worksheets("DDECollegamento").Visible = True

        End If

    End Sub

    Inserendo nella cella indicata il codice posso far vedere o nascondere il foglio2. Nascosto il foglio si cancella la password dalla cella indicata e questo impedisce di vedere e modificare il foglio2. La routine funziona correttamente e, mi sembra che, l'unico modo per conoscere il codice è crackare la pasword del progetto VBA.

    Un accorgimento, ho inserito le lettere perchè se inserisco una serie di 0, zeri, VBA li riconosce come numero e ne accetta solamente uno. Come è possibile dire al programma che è una stringa testo?

    Grazie per la risposta.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2011-01-07T08:27:33+00:00

    Scusate Ho confuso Application.EnableEvents con ActiveSheet.Unprotect e ActiveSheet.Protect ma con il risultato che si blocca, continuerò con altre prove che eventualmente metterò nel posto. Nel frattempo se qualche persona può darmi delle dritte sono ben accette.

    Di nuovo grazie.

    Anzichè proteggere e togliere la protezione ad ogni utilizzo della routine che scrive nela cella, puoi settare a True la proprietà UserInterfaceOnly la prima volta che proteggi il foglio. Esempio:

    Public Sub m()

        Dim sh As Worksheet

        Set sh = ThisWorkbook.Worksheets("Foglio1")

        sh.Protect Password:="tuaPassword", _

            UserInterfaceOnly:=True

        Set sh = Nothing

    End Sub

    Public Sub m_1()

        Dim sh As Worksheet

        Set sh = ThisWorkbook.Worksheets("Foglio1")

        sh.Range("A1").Value = "Pippo"

        Set sh = Nothing

    End Sub

    Se fai girare la macro m(), metti la protezione al foglio e quindi non puoi più scrivere direttamente nelle celle, ma avendo settato a True la proprietà UserInterfaceOnly, la macro m_1() può scrivere nelle celle del foglio. Dai un'occhiatina al metodo WorkSheet.Protect e alle sue proprietànella guida del vb di Excel.

    Nota. UserInterfaceOnly:=True va usato solo in casi particolari e sapendo bene cosa stiamo impostando. Restano validi Protect/Unprotect in tutti gli altri casi.


    --

    La soluzione, il codice ed i files sono forniti *così come sono* e l’autore declina ogni responsabilità per eventuali problemi causati dalla soluzione proposta se usata impropriamente. Create e utilizzate una copia del file per le vostre prove, *prima* di utilizzare la soluzione in files importanti.

    --

    Mauro Gamberini - Microsoft© MVP(Excel)

    http://www.maurogsc.eu/

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2011-01-05T15:48:55+00:00

    Scusate Ho confuso Application.EnableEvents con ActiveSheet.Unprotect e ActiveSheet.Protect ma con il risultato che si blocca, continuerò con altre prove che eventualmente metterò nel posto. Nel frattempo se qualche persona può darmi delle dritte sono ben accette.

    Di nuovo grazie.

    La risposta è stata utile?

    0 commenti Nessun commento