Skydda alla kalkylblad med ett klick

Så skyddar du alla kalkylblad med lösenord

I dagens VBA-tips – signerat Dag Kihlman – skall vi se på hur vi kan skapa en kod för att skydda alla blad i arbetsboken på samma gång. Koden i filen är omfattande och förklaringen skulle lång och ta tid att förklara i sin helhet. Koden är istället kommenterad. I tipset nedan kommenterar och förklarar vi de viktigare delarna som kräver ytterligare förklaring.

För att hänga med i förklaringen kan du hämta hem denna fil:

Ladda ner exempelfilen här

Vi rekommenderar dessa Excelkurser:
www.infocell.se – lärarledda kvalitetskurser i Excel
www.officekurs.se – oslagbar e-Learning i Excel & Office-paketet

Fullständiga koden är:

Public Sub ProtectAllSheets()
    Dim sPassWord As String
    Dim sh As Worksheet
    
    ' Vi hämtar in lösenordet med hjälp av en InputBox.
    sPassWord = InputBox("Ange lösenord för att låsa arken", "Ange lösenord")
    
    
    ' Om lösenord angivits är det skilt från "", dvs det är inte tomt.
    ' Bara om lösenord angivits skall vi gå vidare
    If sPassWord <> "" Then
    
        ' Vi loopar igenom alla ark i arbetsboken med en for each loop.
        ' variabeln sh pekar på ett ark i taget
        For Each sh In ThisWorkbook.Sheets
            
            ' Vi granskar att arket inte redan är låst
            If Not sh.ProtectContents = True Then
                Call sh.Protect(sPassWord)
            End If
        Next
    End If

    ' Vi avslutar med att ställa oss på första arket
    Blad1.Select
End Sub
Public Sub UnProtectAllSheets()
    Dim sPassWord As String
    Dim sh As Worksheet
    Dim bWrongPassword As Boolean
    
    ' Vi hämtar in lösenordet med hjälp av en InputBox.
    sPassWord = InputBox("Ange lösenord för att låsa upp arken", "Ange lösenord")
    
    ' Om lösenord angivits är det skilt från "", dvs det är inte tomt.
    ' Bara om lösenord angivits skall vi gå vidare
    If sPassWord <> "" Then
        ' Vi antar att lösenordet är korrekt, men uppstår fel pga fel lösen så noteras detta
        bWrongPassword = False
    
        ' Vi loopar igenom alla ark i arbetsboken med en for each loop.
        ' variabeln sh pekar på ett ark i taget
        For Each sh In ThisWorkbook.Sheets
            
            If sh.ProtectContents = True Then
                Err.Clear ' Radera minnet av eventuellt tidigare fel
                
                ' Om lösenordet inte passar så uppstår ett fel, som skulle få koden
                ' att krasha, men on error resume gör att koden istället fortsätter på nästa rad
                On Error Resume Next
                Call sh.Unprotect(sPassWord)
                On Error GoTo 0 ' Vi stänger av On Error Resume Next
                
                ' Om arket fortfarande är låst så var lösenordet felaktigt
                If sh.ProtectContents = True Then
                    bWrongPassword = True
                End If
            End If
        Next
        
        ' Vi har nu gått igenom alla arken och meddelar resultat
        If bWrongPassword = False Then
            Call MsgBox("Samtliga l?sta ark har låsts upp", vbInformation, "Klar")
        Else
            Call MsgBox("Lösenordet var fel för minst ett ark, kanske för alla!", vbCritical, "Klar")
        End If
    End If
    
    ' Vi avslutar med att ställa oss på första arket
    Blad1.Select
End Sub

 

Metoden för att låsa upp arken och låsa arken börjar båda på samma sätt. Det gäller att ta in ett lösenord och se att angivet lösenord inte är tomt, som det till exempel blir om användaren avbryter försöket att ange lösen. Det är endast om lösenord angivits som vi skall låsa eller låsa upp arken.

Kod för att skydda alla bladflikar

Koden för att låsa upp arken är ganska enkel. En ”for each-loop” går igenom listan med samtliga ark. Variabeln sh kommer att peka på ett ark i taget. Vi kan dock inte låsa ett ark som redan är låst. Därför granskar vi i en if-sats att arket inte är låst. Om det inte är låst så låser vi det med lösenordet.

For Each sh In ThisWorkbook.Sheets
If Not sh.ProtectContents = True Then
Call sh.Protect(sPassWord)
End If
Next

Koden för att låsa upp arken är rätt så lik fram till for each-loopen. Men när vi försöker låsa upp arken finns en risk att något av arken är låst med annat lösenord eller att lösenordet är felaktigt för alla ark. Vi skulle kunna ge ett felmeddelande för varje ark, men det blir tjatigt om lösenordet är helt fel. Av det skälet lägger vi istället in en variabel, bWrongPassWord, som vi sätter till Falskt till att börja med. Vi antar helt enkelt att det skall gå väl:

bWrongPassword = False

Om arket är låst försöker vi låsa upp det. Vi stänger av felbevakningen, så att inte koden kraschar vid fel lösenord:

On Error Resume Next
Call sh.Unprotect(sPassWord)
On Error GoTo 0 ’ Vi stänger av On Error Resume Next

Om lösenordet inte fungerade så är arket fortfarande låst. Det innebär att vi stött på minst en sida med ett annat lösenord.

If sh.ProtectContents = True Then
bWrongPassword = True
End If

Efter loopen meddelar vi med en MessageBox om allt gått väl eller om minst ett ark var låst med annat lösenord.

Använda filen för att låsa och låsa upp bladflikarna

I filen finns två knappar som är kopplade till vår VBA-kod. Klicka på knappen Lås för att låsa alla kalkylblad i arbetsboken. I dialogrutan som dyker upp väljer du önskat lösenord. Klicka sedan på Lås upp – och ange rätt lösenord – för att ta bort kalkylbladsskyddet för samtliga arbetsböcker.

Associerad kurs: Excel VBA och makron

Associerad e-kurs: VBA & makron

Du gillar kanske också...