Avatar billede Lars Lindy Novice
28. maj 2019 - 11:49 Der er 21 kommentarer

Beskyt ark med VBA

Hej

Jeg har lavet et ark, en form for prisberegner som ved hjælp af VBA koder skjuler visse linjer efter brugerens indtastninger.

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("F5")) Is Nothing Then
        Rows("12:1000").EntireRow.Hidden = True 'skjuler rækker

Men jeg har nu brug for at beskytte arket så der kun kan indtastes i de felter jeg ønsker muligt.
Men benytter jeg den almindelige "Beskyt ark" vil min VBA kode til at vise/skjule ikke fungere

What to do ?
Avatar billede Jan K Ekspert
28. maj 2019 - 13:03 #1
Du er nødt til at lade VBA "afbeskytte arket, derefter køre din kode og så beskytte arket igen,

Brug fx
ActiveSheet.Unprotect i begyndelsen af makroen og så

ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True

eller hvad du nu vil beskytte (evt. med kodeord) i slutningen.
Avatar billede Lars Lindy Novice
28. maj 2019 - 14:03 #2
Tak Jan, dejligt at du er her 👍

Men det lykkes ikke helt for mig, for hvis jeg gør som du foreslår så kommer der en boks op og beder om kode når man forsøger at køre makro...
(Det er jo en du tidligere har hjulpet mig med)
Jeg ville jo gerne bare at man kunne have sikret arket, men samtidig kunne køre makro.
Avatar billede Jan K Ekspert
28. maj 2019 - 14:17 #3
Ja, det ville være dejligt, men du kan ikke køre en makro, der ændrer i et ark, som er beskyttet, uden at fjerne beskyttelsen først. Har du sikret beskyttelsen med kode, kan du lade makroen åbne med kode og beskytte med kode igen, men så er koden desværre ret nem at finde - og så kunne du lige så godt undvære den.
Avatar billede Jan K Ekspert
28. maj 2019 - 14:23 #4
Hvis du har pasword på din beskyttelse kan du gøre således

ActiveSheet.Unprotect "kodeordher"
..din kode
ActiveSheet.Protect "kodeordher"

men som du kan se kommer koden til at stå i klar tekst i makroen.
Avatar billede Jan Hansen Ekspert
28. maj 2019 - 14:40 #5
Jan K er det ikke en ide at ligge kodeordet i en skjult celle og hente den derfra (det gør det da lidt sværere at finde kodeordet ;-) )
Avatar billede Lars Lindy Novice
28. maj 2019 - 14:45 #6
Kan man ikke bare ligge en kode på makroen så den også er beskyttet ?
Avatar billede Jan K Ekspert
28. maj 2019 - 15:03 #7
Måske  kan lægge koden i et ark, som man skjuler med xlveryhidden. Så er det i hvert sværere at komme til . Kan dog ikke teste lige nu.

Lars Lindy-> Det kan man, men koderne er under alle omstændigheder ret nemme at brydr.
Avatar billede Lars Lindy Novice
28. maj 2019 - 15:15 #8
Det virker fint med:
ActiveSheet.Unprotect "kodeordher"
..din kode
ActiveSheet.Protect "kodeordher"

Men jeg kan ikke helt finde ud af hvordan jeg får den til at hente et celle indhold ?
Avatar billede store-morten Ekspert
28. maj 2019 - 15:30 #9
ActiveSheet.Unprotect Worksheets("Ark1").Range("A1")
'..din kode
ActiveSheet.Protect Worksheets("Ark1").Range("A1")
Avatar billede store-morten Ekspert
28. maj 2019 - 15:34 #10
Men det er ret nemt at vise et skjult ark igen.
Avatar billede Jan K Ekspert
28. maj 2019 - 22:48 #11
store-morten-> Korrekt, men med xlveryhidden skal der jo i hvert fald bruges vba til at få det vist, og så skal man vide, at det er der.
Avatar billede Lars Lindy Novice
06. juni 2019 - 11:14 #12
Hej med jer

Tak for alle jeres input, jeg troede at jeg havde fået styr på sikkerheden, men har fundet ud af at den "låser" hele arket op når man taster noget ind i de felter som ikke er låst, er der nogen der kan give mig en forklaring på det ?
min makro ser således ud:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

ActiveSheet.Unprotect Worksheets("Data").Range("A1")


    If Not Intersect(Target, Range("F5")) Is Nothing Then
        Rows("12:1000").EntireRow.Hidden = True 'skjuler rækker

       
    Shapes.Range(Array("image4.jpg")).Visible = msoFalse
    Shapes.Range(Array("image6.jpg")).Visible = msoFalse
    Shapes.Range(Array("image1.jpg")).Visible = msoFalse
    Shapes.Range(Array("Check Box 41")).Visible = msoFalse
    Shapes.Range(Array("Check Box 40")).Visible = msoFalse
    Shapes.Range(Array("Check Box 36")).Visible = msoFalse
    Shapes.Range(Array("Check Box 32")).Visible = msoFalse
             
      Select Case Target.Value
           
            Case "Total" 'Valgt i F5
                Rows("12:1000").EntireRow.Hidden = False 'Viser rækker
                ActiveSheet.Protect Worksheets("Data").Range("A1")
                           
            Case "m² beregner" 'Valgt i F5
                Rows("22:102").EntireRow.Hidden = False 'Viser rækker
                ActiveSheet.Protect Worksheets("Data").Range("A1")
                           

            Case "Rubberframe banner" 'Valgt i F5
                Rows("111:129").EntireRow.Hidden = False 'viser rækker
                ActiveSheet.Protect Worksheets("Data").Range("A1")
                           
            Case "Roll up's" 'Valgt i F5
                Rows("149:160").EntireRow.Hidden = False 'viser rækker
                ActiveSheet.Protect Worksheets("Data").Range("A1")
                         
            Case "Outdoor" 'Valgt i F5
                Rows("130:146").EntireRow.Hidden = False 'viser rækker
                ActiveSheet.Protect Worksheets("Data").Range("A1")

            Case "Opløsningsberegner" 'Valgt i F5
                Rows("200:215").EntireRow.Hidden = False 'viser rækker
                ActiveSheet.Protect Worksheets("Data").Range("A1")
     
            Case "Beach flag" 'Valgt i F5
                Rows("163:182").EntireRow.Hidden = False 'viser rækker
                ActiveSheet.Protect Worksheets("Data").Range("A1")

                           
    Shapes.Range(Array("image4.jpg")).Visible = msoTrue
    Shapes.Range(Array("image6.jpg")).Visible = msoTrue
    Shapes.Range(Array("image1.jpg")).Visible = msoTrue
    Shapes.Range(Array("Check Box 41")).Visible = msoTrue
    Shapes.Range(Array("Check Box 40")).Visible = msoTrue
    Shapes.Range(Array("Check Box 36")).Visible = msoTrue
    Shapes.Range(Array("Check Box 32")).Visible = msoTrue
                   
                ActiveSheet.Protect Worksheets("Data").Range("A1")

        End Select
    End If
   
   
   
End Sub
Avatar billede Jan K Ekspert
06. juni 2019 - 14:05 #13
Arket er enten beskyttet eller ikke beskyttet. Du kan åbne celler og beskytte arket, men så kan du ikke køre makroer. Når makroen fjerner arkbeskyttelsen, er det ligegyldigt om cellerne er låst. Det er derfor vigtigt at makroen fjerner beskyttelsen, går det den skal og så beskytter igen inden kontrollen gives tilbage til brugeren.
Avatar billede Jan K Ekspert
06. juni 2019 - 14:08 #14
Da din kode kører på Worksheet Change fjernes beskyttelsen, hver gang, der tastes.
Avatar billede Lars Lindy Novice
06. juni 2019 - 14:40 #15
Øh ok 😲 Men jeg startede jo ud med "bare" at låse arket dog med nogle enkelte celler oplåste vha. "Formatér celler" men så vill Makroen ikke fungere, så fik jeg hjælp til at få makroen til at låse op - udføre makro - og låse igen.
Så troede jeg at den var sikret som hvis jeg blot sikrede arket ?
Er der så nogen måder jeg kan sikre mit ark - men stadig køre makro og have celler der er låst op ?
Avatar billede store-morten Ekspert
06. juni 2019 - 14:43 #16
Byt om på linje 1 og 2

Så den kun låser op når der ændres i F5
Avatar billede Lars Lindy Novice
06. juni 2019 - 15:05 #17
øh hvad mener du store Morten, jeg syntes ikke jeg kan få det til at virke ?
Avatar billede store-morten Ekspert
06. juni 2019 - 15:20 #18
If Not Intersect(Target, Range("F5")) Is Nothing Then

     ActiveSheet.Unprotect Worksheets("Data").Range("A1")

 Rows("12:1000").EntireRow.Hidden = True 'skjuler rækker
Avatar billede store-morten Ekspert
06. juni 2019 - 15:24 #19
Din kode siiger:
Er der ændret i arket så lås op
Er det F5 der er ændret, nej så stop.

Så ved at bytte om:
Er der ændret i arket, ja så lås op, kør kode, lås igen.
Avatar billede Lars Lindy Novice
06. juni 2019 - 15:24 #20
Tusind tak Morten det ser ud til at løse det hele 😀
Avatar billede store-morten Ekspert
06. juni 2019 - 17:43 #21
Velbekomme
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester