[easy_youtube_gallery id=uMK0prafzw0,8Uee_mcxvrw,HcXNPI-IPPM,JvMXVHVr72A,AIXUgtNC4Kc,K8nrF5aXPlQ,cegdR0GiJl4,L-wpS49KN00,KbW9JqM7vho ar=16_9 cols=3 thumbnail=hqdefault controls=0 playsinline=1 privacy=1 title=top wall=1 class=mySuperClass]
Först publicerad: 2009-06-05

VBA-kod som lösenordsskyddar blad

skydda-arbetsblad-atkomst
Utgångsläget för den Excelbok där vi tänkt lösenordsskydda åtkomst till det andra och det tredje bladet.

Med hjälp av lite enkel makrokod i VBA kan vi förhindra generell åtkomst till vissa blad i en arbetsbok i Excel.

För att komma åt dessa skyddade blad krävs att användaren skriver in ett lösenord.

Konstigt nog så har Microsoft aldrig byggt in denna funktionalitet i Excel, utan vi måste istället programmera funktionen själva.

Glöm inte att begrunda nedanstående resonemang om säkerhet, då hantering av känslig information är just ett känsligt tema som kräver eftertanke.

Vi använder oss av händelsen Workbook_SheetActivate

Workbook_SheetActivate är en händelse som triggas varje gång som ett arbetsblad aktiveras, dvs när användaren klickar på bladet. Om aktuellt blad ingår i listan över blad som vi vill lösenordsskydda så kommer Excel att be oss att ange ett lösen. Om fel lösenord anges så hoppar Excel tillbaka till det sist aktiva arbetsbladet.

Vissa säkerhetsaspekter på lösenordsskyddade kalkylblad

Det här makrot skall inte användas för att dölja känslig information då det finns en del knep för att kringgå skyddet. Kom ihåg att det bästa sättet att skydda information är att över huvud taget inte distribuera den.

För det första så kommer det lösenord som vi sätter att stå i klartext i VBA-koden. Detta kan vi emellertid åtgärda på ett hyfsat säkert sätt genom att lösenordsskydda VBA-koden (VBA-editorn – Högerklick på aktuell arbetsbok – VBAProject Properties/Egenskaper). Men man skall också vara medveten om att det finns program som knäcker VBAs kodmodul-skydd.

Fönstret i Excels VBA-editor där du lösenordsskyddar VBA-projektet.
Fönstret i Excels VBA-editor där du lösenordsskyddar VBA-projektet.

För det andra så kan det skyddade bladet synas under en mycket kort ögonblick som kanske en tiondels sekund innan inputboxen för lösenordet visas. Gäller främst långsammare datorer.

Ovanstående kombinerat med det faktum att det även finns andra sätt att kringå den här varianten av kalkylbladsskydd gör att man får tänka efter vilken typ av information som är lämplig att skydda på det här sättet.

VBA-rutin för att lösenordsskydda åtkomst till vissa kalkylblad

I vilket fall som helst så finns det en hel del fall där vi helt enkelt vill kunna stoppa  undan kalkylblad lite mer “permanent” än att bara gömma dem på sedvanligt sätt.

Följande kod skall läggas i ThisWorkbook-objektet i VBA-editorn.  I exemplet så utgår vi från att “Sheet2” och “Sheet3” skall skyddas med lösenords-strängen “gladalaxen”.

Dim strStartBlad As String
Dim strNastaBlad As String
 
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
 
Dim z As Integer
Dim i As Integer
Dim x As Boolean
Dim varArbetsBlad As Variant
Dim varLosenOrd As Variant
Dim varInput As Variant
 
'förbereda modellen
varArbetsBlad = Array("Sheet2", "Sheet3") 'de blad som vi vill skydda...
varLosenOrd = "gladalaxen" 'lösenord... [bokstäver/siffror]
 
'slå ifrån "Events"
Application.EnableEvents = False
 
'bladkontroll
strNastaBlad = Sh.Name
For i = LBound(varArbetsBlad) To UBound(varArbetsBlad)
If varArbetsBlad(i) = strNastaBlad Then x = True
Next i
If x = False Then GoTo 99
 
'döljer arbetsbladet temporärt
z = ActiveWindow.Index
Windows(z).Visible = False
 
'utvärderar lösenordet
varInput = InputBox("Lösen:")
If varInput <> varLosenOrd Then Sheets(strStartBlad).Select
 
'visa bladet
Windows(z).Visible = True
 
99:
 
'slå på "Events"
Application.EnableEvents = True
 
End Sub

För att koden skall hitta tillbaka till det oskyddade bladet ifall användaren skriver fel lösenord så lägger vi in namnet på det oskyddade bladet i en variabel så fort som detta blad av-aktiveras:

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
 
'minnas startbladet
strStartBlad = Sh.Name
 
End Sub