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:
Vi rekommenderar dessa Excelkurser:
www.infocell.se – lärarledda kvalitetskurser i Excel
www.officekurs.se – oslagbar e-kurser 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