Avatar billede Jann6628 Mester
20. maj 2020 - 11:46 Der er 30 kommentarer

VBA til at låse eller åbne en celle

Hej eksperter.

Jeg arbejder på en VBA kode, som kan låse eller åbne for en celle udfra en anden celles værdi.
EKS:
hvis A18 = "A - Depot ,arkiv  og kopirum ,specialrum m.v.", så skal celle G18 være låst.
Hvis A18 = "H - Ikke Prissatte lokaler", så skal celle G18 være åben.

Indtil videre har jeg dette. Den skriver ikke fejl, men den virker bare ikke:

Sub ModifyProtectedSheet1()
    ActiveSheet.Unprotect Password:="123"
Private Sub Worksheet_Change1(ByVal Target As Range)
    If Range("$A$18:$A$25") = "H - Ikke Prissatte lokaler" Then
        Range("$G$18:$G$25").Locked = False
    ElseIf Range("$A$18:$A$25") = "A - Depot ,arkiv  og kopirum ,specialrum m.v." Then
        Range("$G$18:$G$25").Locked = True
    End If
    ActiveSheet.Protect Password:="123", _
    DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub
Avatar billede thomas_bk Ekspert
20. maj 2020 - 12:22 #1
Du bruger en Range("$A$18:$A$25") = "H - Ikke Prissatte lokaler"
Skal det evt ikke blot være én celle som du evaluere på!
Avatar billede Jann6628 Mester
20. maj 2020 - 12:37 #2
Jo, men reglen skal gælder for alle celler, fra A18 til A25.
Avatar billede thomas_bk Ekspert
20. maj 2020 - 12:44 #3
If Range("$A$18:$A$25") = "H - Ikke Prissatte lokaler" Then

Udfordringen er at i din test der forespørger du på om værdien af hele rangen.
Jeg vil mene du skal prøve at rette dette til, således det kun er A18 der medgår her.

Det samme i din else if
Avatar billede thomas_bk Ekspert
20. maj 2020 - 12:50 #4
Jeg bemærker også lige at du bruger $ i dine ranges. det giver ikke så meget mening i VBA.
Evt. start med at fjerne disse og genteste din kode.
Avatar billede Jann6628 Mester
20. maj 2020 - 12:58 #5
Så du tænker sådan her:

Sub ModifyProtectedSheet1()
    ActiveSheet.Unprotect Password:="123"
Private Sub Worksheet_Change1(ByVal Target As Range)
    If Range("A18") = "H - Ikke Prissatte lokaler" Then
        Range("G18").Locked = False
    ElseIf Range("A18") = "A - Depot ,arkiv  og kopirum ,specialrum m.v." Then
        Range("G18").Locked = True
    End If
    ActiveSheet.Protect Password:="123", _
    DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub

Det virker desværre heller ikke.
Avatar billede thomas_bk Ekspert
20. maj 2020 - 13:08 #6
Jeg er lidt i tvivl om hvad du egentligt er ude efter :-)

Skal du blot teste A18 og så gøre noget med G18:G25
Eller skal du teste hele A18:A25 individuelt og så påvirke tilsvarende i G

I det sidste scenario mener jeg at du skal bruge en for-each løkke per celle du vil evaluere.
Avatar billede Jann6628 Mester
20. maj 2020 - 13:15 #7
Det er sidste løsning hvor A18:A25 individuelt påvirker de tilsvarende i G.
Avatar billede thomas_bk Ekspert
20. maj 2020 - 13:28 #8
Så vil jeg mene at du skal igang med en for-each opbygning.

Lidt inspiration her:
https://www.automateexcel.com/vba/loop-through-range/
Avatar billede Jan K Ekspert
20. maj 2020 - 13:39 #9
Er det, du søger en løsning, hvor der sker noget, hver gang du ændrer en celle i dit område, siden du bruger Worksheet_Change? For så skal du jo kun se på den celle, du faktisk ændrer i, og så den celle, der konkret skal låses.
Avatar billede Jan K Ekspert
20. maj 2020 - 13:51 #10
Jeg ville nok gøre det noget i denne stil

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    ActiveSheet.Unprotect Password:="123"

    If Not Intersect(Target, Range("A1:A5")) Is Nothing Then
        If Target.Value = "a" Then
            Target.Offset(0, 6).Locked = True
        ElseIf Target.Value = "b" Then
            Target.Offset(0, 6).Locked = False
        End If
    End If

ActiveSheet.Protect Password:="123", _
    DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub

Ret selv range til det rigtige i A-kolonnen.
Avatar billede Jan K Ekspert
20. maj 2020 - 13:52 #11
Og selvfølgelig ikke Worksheet_SelectionChange men Worksheet_Change
Avatar billede Jann6628 Mester
20. maj 2020 - 14:18 #12
Jeg har prøvet rette den lidt til, men stadig uden held. Hvad er det du definere i "Target.Offset(0, 6).Locked = False"?

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    ActiveSheet.Unprotect Password:="123"

    If Not Intersect(Target, Range("A18:A25")) Is Nothing Then
        If Target.Value = "H - Ikke Prissatte lokaler" Then
            Target.Offset(0, 6).Locked = False
        ElseIf Target.Value = "" Then
            Target.Offset(0, 6).Locked = True
        End If
    End If

ActiveSheet.Protect Password:="123", _
    DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub
Avatar billede thomas_bk Ekspert
20. maj 2020 - 14:32 #13
#12 husk info i #11
Avatar billede Jann6628 Mester
20. maj 2020 - 14:52 #14
Så skriver den fejl:  "Ambiguous name detected: Worksheet_Change"?
Avatar billede Jan K Ekspert
20. maj 2020 - 19:05 #15
Du oan kun have em Worksheet_Change. Derfor fejlen, I Offset(0, 6) vælger jeg hvilken celle, der skal låses/låses op.
Avatar billede store-morten Ekspert
20. maj 2020 - 20:01 #16
Prøv denne, med forklarende bokse, der skal slettes efter test:
Private Sub Worksheet_Change(ByVal Target As Range)
    ActiveSheet.Unprotect Password:="123"

    If Not Intersect(Target, Range("A18:A25")) Is Nothing Then
   
        If Target.Value = "H - Ikke Prissatte lokaler" Then
       
    'De 4 Msgbox linjer slettes efter test
    MsgBox Target.Address & " er blevet ændret til: " & Target.Value
            Range("G" & Target.Row).Locked = False
    MsgBox Range("G" & Target.Row).Address & " låses op."
   
        ElseIf Target.Value = "A - Depot ,arkiv  og kopirum ,specialrum m.v." Then
       
    MsgBox Target.Address & " er blevet ændret til: " & Target.Value
            Range("G" & Target.Row).Locked = True
    MsgBox Range("G" & Target.Row).Address & " låses."
   
        End If
        End If

ActiveSheet.Protect Password:="123", _
    DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub
Avatar billede Jann6628 Mester
22. maj 2020 - 08:51 #17
Den virkede!

Nu skal jeg så havde en til at indsætte en formel hvis "A...." er valgt?

Har dette men den indsætter ikke en formel:

Private Sub Worksheet_Change(ByVal Target As Range)
    ActiveSheet.Unprotect Password:="123"

    If Not Intersect(Target, Range("A18:A25")) Is Nothing Then
 
        If Target.Value = "H - Ikke Prissatte lokaler" Then
     
    'De 4 Msgbox linjer slettes efter test
    MsgBox "Enhedspris er nu låst op!"
            Range("G" & Target.Row).Locked = False

        ElseIf Target.Value = "A - Depot ,arkiv  og kopirum ,specialrum m.v." Then
     
    MsgBox " Enhedspris er nu låst! "
            Range("G" & Target.Row).Formula = "=@IF((A18="""");"""";(IFS($C$15=Data!$D$3;VLOOKUP(A18;Prislist;4;FALSE);$C$15=Data!$E$3;VLOOKUP(A18;Prislist;5;FALSE);$C$15=Data!$F$3;VLOOKUP(A18;Prislist;6;FALSE))))"
            Range("G" & Target.Row).Locked = True
 
        End If
        End If

ActiveSheet.Protect Password:="123", _
    DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub
Avatar billede Jann6628 Mester
22. maj 2020 - 09:36 #18
JAN:

Hvis jeg kun kan have en Worksheet_Change, Hvor gør jeg så nå jeg har brug for flere?

Kan jeg skrive Worksheet_Change1?
Avatar billede Jan K Ekspert
22. maj 2020 - 10:30 #19
#18 -Der kan kun være en, og bruger du andre navne, vil,det ikke virke. Skal den samme Worksheet_Change gøre flere ting, må du simpelthen kode den, så den løser alle opgaverne.
Avatar billede store-morten Ekspert
22. maj 2020 - 12:00 #20
Prøv:
"=IF(A18="""","""",IFS($C$15=Data!$D$3,VLOOKUP(A18,Prislist,4,FALSE),$C$15=Data!$E$3,VLOOKUP(A18,Prislist,5,FALSE),$C$15=Data!$F$3,VLOOKUP(A18,Prislist,6,FALSE)))"
Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, Range("A1")) Is Nothing Then
        MsgBox "A1 er ændret!"
        'gør noget
    End If
   
    If Not Intersect(Target, Range("A2")) Is Nothing Then
        MsgBox "A2 er ændret!"
        'gør noget andet
    End If

End Sub
Avatar billede Jann6628 Mester
22. maj 2020 - 12:22 #21
Fedt! Det virkede.
En sidste ting er at jeg skal have skiftet "A18" ud med Target.Range?
så den ikke altid henter det som står i A18 hvis jeg skriver i f.eks. A20
Avatar billede Jann6628 Mester
22. maj 2020 - 12:42 #22
Mit gæt er:

Range("G" & Target.Row).Formula = "=IF((A &(ActiveCell.Row))="""","""",IFS($C$15=Data!$D$3,VLOOKUP((A &(ActiveCell.Row)) ,Prislist,4,FALSE),$C$15=Data!$E$3,VLOOKUP((A & (ActiveCell.Row)) ,Prislist,5,FALSE),$C$15=Data!$F$3,VLOOKUP((A & (ActiveCell.Row)) ,Prislist,6,FALSE)))"
Avatar billede store-morten Ekspert
22. maj 2020 - 13:23 #23
Prøv denne, hvor jeg har ændret til R1C1:
Private Sub Worksheet_Change(ByVal Target As Range)
    ActiveSheet.Unprotect Password:="123"

    If Not Intersect(Target, Range("A18:A25")) Is Nothing Then

        If Target.Value = "H - Ikke Prissatte lokaler" Then
   
    'De 4 Msgbox linjer slettes efter test
    MsgBox "Enhedspris er nu låst op!"
            Range("G" & Target.Row).Locked = False

        ElseIf Target.Value = "A - Depot ,arkiv  og kopirum ,specialrum m.v." Then
   
    MsgBox " Enhedspris er nu låst! "
   
            Range("G" & Target.Row).FormulaR1C1 = "=IF(RC[-6]="""","""",IFS(R15C3=Data!R3C4,VLOOKUP(RC[-6],Prislist,4,FALSE),R15C3=Data!R3C5,VLOOKUP(RC[-6],Prislist,5,FALSE),R15C3=Data!R3C6,VLOOKUP(RC[-6],Prislist,6,FALSE)))"
            Range("G" & Target.Row).Locked = True

        End If
        End If

ActiveSheet.Protect Password:="123", _
    DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub
Avatar billede Jann6628 Mester
22. maj 2020 - 13:33 #24
Perfekt!!!

Nu er mit eneste problem at når jeg sletter indhold i kolonne A så laver den fejl
Avatar billede Jann6628 Mester
22. maj 2020 - 13:36 #25
Hele min kode ser således ud nu:

Er jeg ude i at lave en : (If Target.Value = "" Then) for at få den til at tage denne mulighed med også


Private Sub Worksheet_Change(ByVal Target As Range)
    ActiveSheet.Unprotect Password:="123"

    If Not Intersect(Target, Range("A18:A25")) Is Nothing Then
 
        If Target.Value = "H - Ikke Prissatte lokaler" Then
     
    MsgBox " Enhedspris er låst op! "
            Range("G" & Target.Row).Locked = False
                       
        Else
            Range("G" & Target.Row).Locked = True
            Range("G" & Target.Row).FormulaR1C1 = "=IF(RC[-6]="""","""",IFS(R15C3=Data!R3C4,VLOOKUP(RC[-6],Prislist,4,FALSE),R15C3=Data!R3C5,VLOOKUP(RC[-6],Prislist,5,FALSE),R15C3=Data!R3C6,VLOOKUP(RC[-6],Prislist,6,FALSE)))"
 
        End If
        End If

ActiveSheet.Protect Password:="123", _
    DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub
Avatar billede store-morten Ekspert
22. maj 2020 - 13:44 #26
En lille tilføjelse:
Private Sub Worksheet_Change(ByVal Target As Range)
    ActiveSheet.Unprotect Password:="123"

    If Not Intersect(Target, Range("A18:A25")) Is Nothing Then
   
    Application.EnableEvents = False

        If Target.Value = "H - Ikke Prissatte lokaler" Then
   
    'De 4 Msgbox linjer slettes efter test
    MsgBox "Enhedspris er nu låst op!"
            Range("G" & Target.Row).Locked = False

        ElseIf Target.Value = "A - Depot ,arkiv  og kopirum ,specialrum m.v." Then
   
    MsgBox " Enhedspris er nu låst! "
   
            Range("G" & Target.Row).FormulaR1C1 = "=IF(RC[-6]="""","""",IFS(R15C3=Data!R3C4,VLOOKUP(RC[-6],Prislist,4,FALSE),R15C3=Data!R3C5,VLOOKUP(RC[-6],Prislist,5,FALSE),R15C3=Data!R3C6,VLOOKUP(RC[-6],Prislist,6,FALSE)))"
   
    Application.EnableEvents = True
   
            Range("G" & Target.Row).Locked = True

        End If
        End If

ActiveSheet.Protect Password:="123", _
    DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub
Avatar billede store-morten Ekspert
22. maj 2020 - 13:46 #27
Du må kun slette i en celle af gangen.

Når du sletter, skal formlen blive eller slettes?
Avatar billede store-morten Ekspert
22. maj 2020 - 14:10 #28
Private Sub Worksheet_Change(ByVal Target As Range)
    ActiveSheet.Unprotect Password:="123"

    If Not Intersect(Target, Range("A18:A25")) Is Nothing Then
   
    Application.EnableEvents = False

        If Target.Value = "H - Ikke Prissatte lokaler" Then
   
    MsgBox "Enhedspris er nu låst op!"
            Range("G" & Target.Row).Locked = False

        ElseIf Target.Value = "A - Depot ,arkiv  og kopirum ,specialrum m.v." Then
   
    MsgBox " Enhedspris er nu låst! "
   
            Range("G" & Target.Row).FormulaR1C1 = "=IF(RC[-6]="""","""",IFS(R15C3=Data!R3C4,VLOOKUP(RC[-6],Prislist,4,FALSE),R15C3=Data!R3C5,VLOOKUP(RC[-6],Prislist,5,FALSE),R15C3=Data!R3C6,VLOOKUP(RC[-6],Prislist,6,FALSE)))"
            Range("G" & Target.Row).Locked = True
           
        ElseIf Target.Value = "" Then
            Target.Offset(0, 6).ClearContents
        End If
        End If
       
    Application.EnableEvents = True
ActiveSheet.Protect Password:="123", _
    DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub
Avatar billede Jann6628 Mester
22. maj 2020 - 14:14 #29
Det har ikke den stor betydning umiddelbart.
Avatar billede Jann6628 Mester
25. maj 2020 - 10:38 #30
Den virker desværre ikke.

Der er umiddelbart 2 muligheder:

1. enten skal jeg have en celle til at være unlocked, men hvor man ikke har mulighed for at trykke delete.

2. eller også skal jeg have en celle som er locked, men hvor man stadig kan vælge fra en dropdown liste.

Jeg tænker umilledbart at nr. 2 er en løsning, jeg ved bare ikke hvordan jeg får excel til at gøre det.
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

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