Just nu i M3-nätverket
Jump to content

Förhindra utskrift av arbetsboken


xplejjn

Recommended Posts

Hej på er,

 

Jag undrar om det på något sätt går att skydda så att man inte kan skriva ut hela arbetsboken i excel. Jag har nämligen ett dokument med flera sheets och dessa är lösenordsskyddade. Jag vill alltså att man ska kunna skriva ut det blad man har tillgång till via lösenord, men inte komma runt detta genom att använda sig av "Skriv ut hela arbetsboken" via menyn.

 

Några förslag? :)

 

Link to comment
Share on other sites

Behöver användaren se de skyddade bladen? Om du gömmer dem så att de ej går att ta fram är problemet hur världen.

 

Detta gör du i VBA-editor, egenskaper för blad.

 

Det är nog det absolut enklaste.

 

Annars finns proceduren

Private Sub Workbook_BeforePrint(Cancel As Boolean)

i ThisWorkBook

Där vet jag dock inte hur man ska kunna fånga alla utskrifter av ett blad.

 

Ett till alternativ är att i proceduren ovan kontrollera genom en variabel om utskrift är tillåten och denna variabel sätts enbart om utskriften sker genom viss knapp.

 

Eller ett till är att inaktivera utskriftalternativet i Excels menyer:

With Application.CommandBars("File")
   .Controls(14).Enabled = False 'Förhandsgranska
   .Controls(15).Enabled = False 'Skriv ut
End With

 

men då fungerar fortfarande snabb-knappen CTRL+P exempelvis.

 

Enkelt och helt säkert är enbart det första förslaget...

 

Finns säkert något mer bra sätt att attackera det på dock.

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Link to comment
Share on other sites

Tack för svaret!

 

Lite info om vad det var jag ville uppnå; En arbetsbok innehåller ett antal olika blad. Varje blad skall endast kommas åt av en användare samt en administratör. Jag har mao lösenordsskyddat varje blad med varsitt unikt lösenord. Användaren ska bara kunna se sitt eget blad.

 

Problemet blev ju sedan att man kunde skriva ut hela arbetsboken. För att lösa detta gjorde jag till slut så här:

 

När man öppnar arbetsboken döljsalla menyer och CTRL+P görs oanvändbar:

 

Private Sub Workbook_Open()
   'Dölj samtliga menyer
   'Gå alltid till blad 1 vid start
   Blad1.Select
   Application.CommandBars("Worksheet Menu Bar").Enabled = False
   Application.CommandBars("Worksheet Menu Bar").Enabled = False
   Application.CommandBars("Standard").Enabled = False
   Application.CommandBars("Formatting").Enabled = False
   Application.CommandBars("Drawing").Enabled = False
   Application.OnKey "^p", ""
End Sub

 

På varje enskilt blad finns det en knapp man kan använda för utskrift:

Private Sub CommandButton1_Click()
Application.Dialogs(xlDialogPrinterSetup).Show
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
End Sub

 

Och till sist finns en knapp för "administratörer" som behöver komma åt alla menyer och liknande - man trycker på knappen, skriver in lösenordet och sen får man fram det man vill ha.

 

Detta kunde säkert ha gjorts på ett mycket enklare sätt, men eftersom det här är mitt första försök på VB i Excel och jag till stor del pusslat ihop det här från olika exempel på nätet så är jag nöjd.

 

:)

 

Link to comment
Share on other sites

Om nu varje användare har ett unikt blad kanske en form av inloggning i arbetsboken kan vara av intresse.

 

Dvs alla blad utom ett är dolt vid starten av boken. För att få se sitt blad klickar då användaren på en knapp varvid en ruta om ber om lösenord poppar upp. Om korrekt lösenord matas in tas önskad sida fram övriga förblir dolda.

 

Inget behov då av att styra Excel utskriftsfunktioner, enbart synliga blad kan skrivas ut.

 

för övrigt kan jag fortfarande skriva ut din arbetsbok genom att trycka CTRL+SHIFT+F12...

 

Annars kanske det går att fånga och göra något vettigt av BeforePrint.

Exempelvis något i stil med:

Dim doPrint As Boolean

Private Sub Workbook_BeforePrint(Cancel As Boolean)
If doPrint Then
   doPrint = False
   Application.Dialogs(xlDialogPrinterSetup).Show
   ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True

   Cancel = True
Else
   doPrint = True
   End If

End Sub

Private Sub Workbook_Open()
   doPrint = True
End Sub

 

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Link to comment
Share on other sites

Att dölja alla blad från start låter helt klart som en bra idé. Dock känner jag att jag inte besitter den kunskapen för att kunna genomföra det.

 

Har du något bra förslag på hur en sån kod kan se ut?

 

För övrigt borde det väl gå att förhindra CTRL-SHIFT-X kommandon också?

 

Tack för svar!

 

Link to comment
Share on other sites

Att dölja alla blad från start låter helt klart som en bra idé. Dock känner jag att jag inte besitter den kunskapen för att kunna genomföra det.

Bästa är då givetvis att gömma alla blad när arbetsboken stängs så att om boken öppnas utan makron aktiverade så kan man inte se bladen eller skriva ut dem. Att gömma/ta fram blad är enkelt:

Sheets("Blad1").Visible = False/True

med False kan användaren dock ta fram arbetsboken i Excel utan att gå till VBA-editorn (om inte arbetsboken är skyddad) så i kod är det bra att istället skriva xlVeryHidden

 

Gömma alla blad utom blad Intro:

    Dim ws As Worksheet
   For Each ws In ThisWorkbook.Sheets
       If ws.Name <> "Intro" Then
           ws.Visible = xlVeryHidden
       End If
   Next ws

 

När sedan ett blad ska öppnas finns tre sätt att ta in lösenordet:

• Om ej hemligt, dvs i klartext - en vanlig InputBox:

Private Sub CommandButton1_Click()
   Dim pWord As String
   pWord = "test"
   msg = InputBox(prompt:="Ge lösen", Title:="Lösen")
   If StrComp(msg, pWord, vbBinaryCompare) = 0 Then
       Sheets("Blad2").Visible = True
       Sheets("Blad2").Select
   End If
End Sub

 

• Om hemligt:

a) en vanlig textbox på sidan, sätt PasswordChar egenskapen till godtyckligt tecken.

B) skapa en egen inputbox-liknande dialog med en textbox enligt punkt a på. Inte så svårt.

 

Om a) - se till att tömma textboxarna!

 

Lösenorden är lite kluriga att spara. Bästa vore givetvis om man kunde spara dem på blad som man gömmer men helt gömda är inte uppgifterna. De går alltid att nå genom en direktreferens om man vet bladets namn oavsett hur bra det har gömts. Det går givetvis även att lagra lösenorden i koden, i variabler. Det senare är användbart om det inte finns behov av att användaren ska kunna ändra lösenordet.

 

Aj, det är mycket att tänka på för att få en bok helt säker att dela mellan olika användare.

Undvika att användaren vet bladnamnet, göm blandfliken:

DisplayWorkbookTabs = True

Fast sedan måste du även hindra att användaren slår på denna igen samt se till att de fortfarande kan navigera mellan bladen...

 

Hindra att användaren tar fram gömda blad, då måste du låsa arbetsboken:

ThisWorkbook.Protect "dummy", True

samt även låsa upp den när du med VBA vill ändra på strukturen:

ThisWorkbook.Unprotect "dummy"

 

Och till sist måste även VBA-projektet skyddas så att de inte kan gå in där och se lösenorden för de olika bladen.

 

Kanske jag missat något? hur mycket arbete du måste lägga ned beror helt på hur pass skyddat datat måste vara.

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...