• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

Cellen blokkeren met voorwaarde

Status
Niet open voor verdere reacties.

wacco

Gebruiker
Lid geworden
9 mrt 2006
Berichten
229
Hallo,
In kolom A wordt gekeken of 2 cellen een waarde bevatten, en afhankelijk daarvan wordt er een 1 of een 0 geplaatst in kolom A
Ik zou graag, afhankelijk van de celwaarde 1 in kolom A, in dezefde rij een aantal cellen willen blokkeren.(G tm L)
Als de celwaarde 0 is, zouden deze zelfde cellen reeks (G t/m L) niet geblokkeerd moeten worden.

Dit alles zou moeten gebeuren bij het openen van het sheet.
Alle cellen in het sheet zijn beveilig.
Data in sheet is afhankelijk van een ander sheet

Voorbeeldje van enkel sheet bijgevoegd
 

Bijlagen

Laatst bewerkt:
Zie bijgaand voorbeeld.
De macro DeBlokkeer wordt automatisch uitgevoerd in het Worksheet_Activate() event van Blad1, dus als je na het openen van het document naar werkblad (sheet) Blad1 gaat.
Maar als je met Sheet eigenlijk Exceldocument bedoelt, dan zou je de macro DeBlokkeer moeten activeren in het Workbook_Open event.
 

Bijlagen

@Ahulpje,
Dankjewel voor de snelle reactie.
Omdat blad1 is beveiligd, heb ik
Code:
ActiveSheet.Unprotect
en als laatste regel
Code:
ActiveSheet.Protect
toegevoegd.
Het vreemde is echter dat alles werkt, behalve op de eerste rij (rij 5).
Daar staat in A5 een 1, maar de cellen G t/m L ziin niet geblokkeerd.
Alle andere cellen in kolom A waar een 1 staat, zijn keurig geblokkeerd en waar een 0 staat zijn de cellen G t/m L niet geblokkeerd.
Werk dus eigenlijk perfect, op die ene rij (rij 5) na.
Enig idee waarom ?
 
Bij het zetten van een filter beschouwt Excel de eerste rij met data als kopteksten. Dus ook al staat er een 1 in kolom A van de eerste datarij, dan nog wordt die niet uitgefilterd met
Code:
    Selection.AutoFilter Field:=1, Criteria1:="0"
en wordt dus meegenomen in

Code:
    Range("G" & eersteRij & ":L" & laatsteRij).Locked = False
Oplossing: voeg kopteksten toe, desnoods alleen in kolom A.
 
@AHulpje

Ik begrijp nu waarom.
Heb dit in het file waar ik het daadwerkelijk ga gebruiken, opgelost door dat bereik als laatste regel in de code te blokkeren.
Deze rij heeft (gelukkig) geen echt doel in dit file.
Code:
Range("E1:P1").Locked = True

Werkt nu helemaal zo als ik het bedoelde.
Hartelijk dank, zeker voor de snelle reactie(s) en de prima oplossing
 
@AHulpje,

Ondanks dat ik aangaf dat alles werkte zo als ik wil, heb ik alsnog een vraagje.
Als ik, nadat het file is geopend en het stukje VBA dat jij mij gaf zijn werk heeft gedaan, het eerdere voorbeeldde tekst verwijder op een rij uit kolom B.
Dan wordt wel in rij A de indicatie aangepast, maar ik kan nadat moment (natuurlijk) alles nog aanpassen in deze regel.
Heb geprobeert dit te ondervangen, door nogmaals jou stukje VBA te plaatsen bij Woksheet change.
Code:
Private Sub Worksheet_Change(ByVal Target As Range)

Dim KeyCells As Range
Set KeyCells = Range("M:M")
If Not Application.Intersect(KeyCells, Range(Target.Address)) _
           Is Nothing Then
Call Deblokkeer2
End If

End Sub

waarbij in deblokkeer2 onderstaand staat.
Code:
Sub Deblokkeer2()

Application.ScreenUpdating = False

ActiveSheet.Unprotect
ActiveSheet.Cells.Locked = True


    Dim eersteRij As Long
    Dim laatsteRij As Long
    Cells.Select
    Selection.AutoFilter Field:=1, Criteria1:="0"
    With ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible)
        eersteRij = .Areas(1).Rows(1).Row
        With .Areas(.Areas.Count)
            laatsteRij = .Rows(.Rows.Count).Row
        End With
    End With
    Range("N" & eersteRij & ":AB" & laatsteRij).Locked = False
    
    Selection.AutoFilter
    
    Range("N1:AB1").Locked = True
    Range("M:M").Locked = False
    
Application.ScreenUpdating = True

ActiveSheet.Protect

End Sub

Dit heeft tot gevolg dat inderdaad de regel wordt geupdate, maar niet alleen de regel maar het hele sheet.
Dit heeft tot gevolg dat er een behoorlijke flikkering plaats vindt, en ook wat vertraging, en dat de cursor niet meer op de cel staat waar de tekst is weg gehaald.

Is hier een beter oplossing voor te verzinnen

En misschien vraag ik nu te veel, maar is het mogelijk dat nadat de tekst uit een cel in kolom B wordt verwijderd ook de tekst in de cellen op dezelfde rij in de kolommen G t/m L worden verwijderd
en dat daarna de rij wordt geupdate zodat deze niet benaderd kan worden.
 
Hm, beetje verwarrend. Is het nou kolom B of kolom M? En met rij A bedoel je kolom A neem ik aan.
De initiële status (geblokkeerd of niet) van het werkblad is mij ook niet duidelijk.
Maar vooruit, onderstaande code zorgt ervoor dat bij het leegmaken van een cel in kolom B de range(G:L) van de betreffende rij wordt leeg gemaakt en dat die range gedeblokkeerd wordt.
Je moet zelf maar even de ranges aanpassen als die niet overeenkomen met de werkelijkheid.
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    Unprotect
    If Target.Column = 2 Then
        If Target.Offset(0, -1) = 0 Then
            With Range("G" & Target.Row & ":L" & Target.Row)
                .Locked = False
                .Clear
            End With
        End If
    End If
    Protect
End Sub
 
@Ahulpje

Weer hartelijk dank voor de snelle reactie.
En als ik het zo allemaal terug lees, is het inderdaad allemaal erg verwarrend.
Dus heb ik een voorbeeld gemaakt, dat een gedeelte bevat van het hele file, maar waar volgens mij veel duidelijker is wat eigenlijk de bedoeling is.
Ik hoop dat je daar nog eens naar wilt kijken, want ik heb het mijzelf maar vooral jou een stuk ingewikkelder gemaakt dan de bedoeling was.
Kort samengevat komt het hier op neer ( staat ook boven in het bijgevoegde voorbeeld)

In het blad zijn alle cellen geblokkeerd, behalve de cellen waar een x moet worden geplaatst (kolom L, alleen de invulcellen)
In kolom A, wordt een 1 geplaatst als in kolom L een x in de invulcel wordt geplaatst.
Behalve als er tevens AAA in kolom B staat of er staat niets dan wordt de waarde 0

Wat ik graag zou willen is :
Als er een x wordt ingevuld in kolom L, en in kolom A is de waarde 1, dan worden de cellen in de kolommen M t/m AA in dezelfde rij ge-deblokkeerd
Er kan nu data in deze velden worden ingevoerd
Als vervolgens de x wordt gewist (delete), dan moet ook de data in de cellen van kolom M t/m AA op dezelfde rij worden gewist, en weer worden geblokkeerd

Indien mogelijk, zou het ook wenselijk zijn als meerde cellen in de invul kolom L tegelijk worden geselecteerd en gewist worden
dat dan ook weer de aansluitende rijen M t/m AA worden gewist en geblokkeerd
 

Bijlagen

Dan zou dit hem moeten zijn:

Code:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 12 Then
        Dim rng As Range
        Unprotect
        For Each rng In Target
            If rng = "x" And rng.Offset(0, -11) = 1 Then
                With Range("M" & rng.Row & ":AA" & rng.Row)
                    .Locked = False
                End With
            ElseIf rng = "x" And rng.Offset(0, -11) = 0 Then
                'verder niets doen
            ElseIf rng = vbNullString Then
                With Range("M" & rng.Row & ":AA" & rng.Row)
                    .ClearContents
                    .Locked = True
                End With
            Else
                MsgBox "Alleen x toegestaan.", vbCritical, "Foutieve invoer"
                rng.Select
                rng.ClearContents
            End If
        Next
        Protect
    End If
End Sub
 
@AHulpje

Heb hem net snel ff uitgeprobeert in het test file
Werkt volgend mij helemaal perfect.
Harstikke bedankt, lijkt zo simpel...maar gaat ver boven mijn petje.
Nogmaals bedankt, test later uit op het volledige file maar volgens mij gaat dit geen problemen geven
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan