macro su foglio protetto



  • macro su foglio protetto
    di iarots data: 07/08/2013 14:57:16

    Buongiorno, ho visto che ci sono già argomenti in proposito, ho provato a seguire le indicazioni di HarryBosch ma nonostante ciò non riesco a risolvere il mio problema. Vorrei far funzionare una macro su fogli protetti con password, premetto che senza la password la cosa funziona, quando immetto una parola chiave per proteggere il foglio la macro non funziona più.
     
    Sub NASCONDI()
    ActiveSheet.Unprotect Password = "luca1008"
    ic = 2
    ir = 3
    For x = 1 To 2000
        If Cells(ir, ic) = "VUOTO" Then
            Cells(ir, ic).EntireRow.Hidden = True
           
        End If
    ir = ir + 1
    x = x + 1
    Next
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
    End Sub
    Sub SCOPRI()
    ActiveSheet.Unprotect Password = "luca1008"
    ic = 2
    ir = 3
    For x = 1 To 2000
        If Cells(ir, ic) = "VUOTO" Then
            Cells(ir, ic).EntireRow.Hidden = False
           
        End If
    ir = ir + 1
    x = x + 1
    Next
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
    
    End Sub
    



  • di Grograman (utente non iscritto) data: 07/08/2013 16:17:32

    Tralasciando la mancata dichiarazione delle variabili, se avessi usato l'opzione "Option explicit" che ti obbliga a farlo probvabilmente avresti notato l'errore ;)

    P.s. eliminato due variabili inutili.
     
    Option Explicit
    
    Sub NASCONDI()
    ActiveSheet.Unprotect Password:="luca1008"
    Dim x As Long
    For x = 1 To 2000
        If Cells(x + 2, 2) = "VUOTO" Then
            Cells(x + 2, 2).EntireRow.Hidden = True
        End If
    Next
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:="luca1008"
    End Sub
    Sub SCOPRI()
    ActiveSheet.Unprotect Password:="luca1008"
    Dim x As Long
    For x = 1 To 2000
        If Cells(x + 2, 2) = "VUOTO" Then
            Cells(x + 2, 2).EntireRow.Hidden = False
        End If
    Next
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:="luca1008"
    End Sub



  • di HarryBosch data: 07/08/2013 23:01:36

    Ciao Ragazzi
    direi che Grograman ti ha già risposto molto bene e dato un ottimo suggerimento che sul Forum non smetteremo mai di ripetere: inserite Option Explicit in testa ai moduli.

    Siccome mi hai "chiamato in causa" ^_^ volevo soltanto accentuare che l'errore che ricevevi era dato dall'errata sintassi dell'istruzione:
    Password:="luca1008"
    dove ti mancavano i puntini; quando riproteggi il codice, Grograman ti ha già fatto notare che dovresti reinserire la password, altrimenti ti trovi il foglio sprotetto.

    Visto che hai molte righe da nascondere (e potrebbero essere anche più), puoi velocizzare decisamente il codice con l'utilizzo di questa istruzione:
    Application.ScreenUpdating = False
    in apertura di codice, riportandola a True in chiusura. Visto che ci sono molte formule, anche la disattivazione temporanea del calcolo automatico aumenterà le prestazioni della routine.

    Per quanto riguarda il ripristino delle righe nascoste, se in realtà devi scoprirle tutte quante (e non solo quelle il cui valore in colonna B sia "VUOTO") puoi evitare il ciclo con un'unica istruzione.

    Riposto gli esempi di Grograman sulla base di quanto detto.


     
    Sub NASCONDI()
        Dim x As Long
        ActiveSheet.Unprotect "luca1008"
        Application.ScreenUpdating = False
        Application.Calculation = xlCalculationManual
        
        For x = 1 To 2000
            If Cells(x + 2, 2) = "VUOTO" Then
                Cells(x + 2, 2).EntireRow.Hidden = True
            End If
        Next
        
        Application.Calculation = xlCalculationAutomatic
        Application.ScreenUpdating = True
        ActiveSheet.Protect "luca1008"
    End Sub
    
    Sub SCOPRI()
        ActiveSheet.Unprotect Password:="luca1008"
        Application.ScreenUpdating = False
        
        Rows("1:10000").EntireRow.Hidden = False
        
        Application.ScreenUpdating = True
        ActiveSheet.Protect Password:="luca1008"
    End Sub
    


  • GRAZIE!!!
    di iarots (utente non iscritto) data: 08/08/2013 08:59:08

    Grazie davvero! Siete impagabili, funziona tutto alla perfezione. Nel pomeriggio farò una donazione!


  • Grazie
    di iarots data: 08/08/2013 09:10:28

    Grazie, sono iscritto ed ho fatto la donazione.



  • di Grograman data: 08/08/2013 09:38:48

    A sto punto, mettiamoci anche che lascia la modalità di calcolo già impostata dall'utente ;)


     
    Option Explicit
    
    Sub NASCONDI()
        Dim x As Long
        Dim xlnCalc As XlCalculation
        With Application
            xlnCalc = .Calculation
            .ActiveSheet.Unprotect "luca1008"
            .ScreenUpdating = False
            .Calculation = xlCalculationManual
        End With
        
        For x = 1 To 2000
            If Cells(x + 2, 2) = "VUOTO" Then
                Cells(x + 2, 2).EntireRow.Hidden = True
            End If
        Next
            
        With Application
            .Calculation = xlnCalc
            .ScreenUpdating = True
            .ActiveSheet.Protect "luca1008"
        End With
    End Sub


  • non funziona lo scopri
    di iarots data: 08/08/2013 10:00:40

    Con l'ultimo codice suggeritomi non funziona lo SCOPRI, e di fatto, da puro ignorante, non ne capisco la differenza con il precedente che, tra l'altro, funziona benissimo.
    Grazie comunque.