• 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.

Bij verandering van inhoud van een cel vervalt werkbladbeveiliging

Status
Niet open voor verdere reacties.

Velpon

Gebruiker
Lid geworden
20 aug 2020
Berichten
84
In mijn Excel gebruik ik een Keycell (A7) om een actie te verrichten.
Bij die actie wordt als eerste de werkbladbeveiliging uitgezet, en als laatste weer aangezet.

Wanneer ik de inhoud van één van de witte cellen verander vervalt plotseling de werkbladbeveiliging.
Kan iemand mij helpen dit te voorkomen?

wachtwoord = "x"

Private Sub Worksheet_Change(ByVal Target As Range)

On Error GoTo Einde
' Application.ScreenUpdating = False

'Werkblad beveiliging uitzetten
Dim BladBeveiligd As Boolean
BladBeveiligd = ActiveWorkbook.ActiveSheet.ProtectContents
If BladBeveiligd Then ThisWorkbook.Sheets("INVOER").Unprotect Password:=wachtwoord

' Verandering van Keycell start actie
Dim KeyCells As Range
Set KeyCells = Range("_ProductKeuze")
If Not Application.Intersect(KeyCells, Range(Target.Address)) _
Is Nothing Then

' Filteren
Dim xRg As Range
Application.ScreenUpdating = False
For Each xRg In Range("D11:D200")
If xRg.Value = "0" Then
xRg.EntireRow.Hidden = True

Else
xRg.EntireRow.Hidden = False
End If
Next xRg


'Werkbladbeveiliging terug in oorspronkelijke staat
Einde:
If BladBeveiligd Then InvoerLock_Click
End If
Application.ScreenUpdating = True

End Sub
 

Bijlagen

  • Werkbladbeveiliging.xlsm
    89,6 KB · Weergaven: 6
Beste Maarten,
Dank voor je snelle reactie.
Hoe maak ik er Selection_Change van?
 
Klik ergens in je code.
Rechts bovenin zie je een veld met de code naam.
Open deze, kies voor Selection_Change en plak daar de code in.
Uiteraard de oude verwijderen of tijdelijk uitschakelen als test.
 
Er staat een End If niet goed.
Maak er dit van:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)

    On Error GoTo Einde
[COLOR="#008000"]' Application.ScreenUpdating = False[/COLOR]

[COLOR="#008000"]'Werkblad beveiliging uitzetten[/COLOR]
    Dim BladBeveiligd As Boolean
    BladBeveiligd = ActiveWorkbook.ActiveSheet.ProtectContents
    If BladBeveiligd Then ThisWorkbook.Sheets("INVOER").Unprotect Password:=wachtwoord
    
[COLOR="#008000"]' Verandering van Keycell start actie[/COLOR]
    Dim KeyCells As Range
    Set KeyCells = Range("_ProductKeuze")
        If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
        
        [COLOR="#008000"]' Filteren[/COLOR]
            Dim xRg As Range
            Application.ScreenUpdating = False
                For Each xRg In Range("D11:D200")
                    If xRg.Value = "0" Then
                        xRg.EntireRow.Hidden = True
                
                    Else
                        xRg.EntireRow.Hidden = False
                    End If
                Next xRg
        End If

[COLOR="#008000"]'Werkbladbeveiliging terug in oorspronkelijke staat[/COLOR]
Einde:
    If BladBeveiligd Then InvoerLock_Click
    Application.ScreenUpdating = True

End Sub
 
Code werkt bij ELKE verandering

Geacht forum

Nadat de 'End if' op de juiste plaats is gezet werkt de code prima,
Alléén kom ik er nu achter dat de code OOK geactiveerd wordt als er een ander pulldown-menu gebruikt wordt.

Hoe kan ik ervoor zorgen dat de code ALLEEN geactiveerd wordt wanneer de range "_Productcode" (cel A7) veranderd?
 

Bijlagen

  • Werkbladbeveiliging2.xlsm
    89,9 KB · Weergaven: 2
Dat komt omdat die code in de Worksheet_Change staat en er geen controle is op wat de actieve cel (Target) is.
 

Bijlagen

  • Werkbladbeveiliging2.xlsm
    90,5 KB · Weergaven: 7
Laatst bewerkt:
Simpel.
Zie bijgevoegd document in #8.
 
Dit werkt prima. Je bent een kanjer!
Kan ik in plaats van de Target.Address verwijzing naar "A7" verwijzen naar "_ProductKeuze"?
 
Je kan er ook direct naar verwijzen, maar waarom zou je dat doen?
Je wilt weten welke cel de _change heeft getriggert en dat is het range object met de naam Target.
 
Nog even voor je gekeken.
Wellicht dat je dit bedoelt:
Code:
If Target.Address = Range("_ProductKeuze").Address Then
 
Beste Edmoor: Dit is precies wat ik bedoel. Graag verwijst ik vanuit VBA naar cel-namen omdat bij verplaatsing binnen Excel dan alles blijft werken.
Hartelijk dank voor je hulp!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan