AW: Löschen von Zeilen oder Kolonnen selektiv unterdrücken
07.07.2025 12:17:21
Jürgen19
Hallo
so, nun habe ich die beiden Möglichkeiten ausprobiert. Die Variante "Blattschutz" gefällt mir nicht so sehr. Hier bekommt der Benützer eine standard Meldung, die nicht das aussagt, was sie sollte.
Variante "Undo" sieht so aus:
Option Explicit
Dim Auswahl
Dim gewaehlte_zeilen As String
Dim LöschenVerboten As Boolean
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'
' Prozedur prüft, ob Blatt geschützt oder Benutzer IT-Guru ist. Falls Ja geschieht nichts.
'
' Falls Nein, wird geprüft ob eine oder mehrere Zeilen angewählt sind. Falls Ja
' werden die Parameter für das Löschverbot gesetzt
'
' Format von Target bei
' Zeile(n) ="$xxx:$yyy"
' Kolonne(n) = "$a:$b"
' Bereich ="$a$xxx" oder "$a$xxx:$b$yyy"
'
' mit xxx,yyy = Zeilennunmmer
' a,b = Kolonnenbuchstabe(n)
'
If ActiveSheet.ProtectContents = True Or _
Worksheets("Berechtigte").Range("rg_aktiver_function") = "IT-Guru" Then Exit Sub
'
gewaehlte_zeilen = Target.Address
LöschenVerboten = False
'
' prüfen ob Zeile(n) angewählt, zweites Zeichen muss numerisch sein
'
If IsNumeric(Mid(gewaehlte_zeilen, 2, 1)) Then
If InStr(1, gewaehlte_zeilen, ":", vbTextCompare) > 0 Then
Set Auswahl = Target
LöschenVerboten = True
End If ' InStr(1, gewaehlte_zeilen, ":", vbTextCompare) > 0
End If ' IsNumeric(Mid(gewaehlte_zeilen, 2, 1))
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
'
Dim answ As Long
Dim msg_text As String
'
' Eine Änderung wurde vorgenommen.
' Falls es sich um eine Löschung handelt und LöschenVerboten = True wird die Löschung
' rückgängig gemacht
'
' VarType(Auswahl) = vbObject wenn Zeile(n) gelöscht wurden
' VarType(Auswahl) = vbVariant + vbArray) wenn ein Bereich gelöscht wurde
'
If (VarType(Auswahl) = vbObject Or VarType(Auswahl) = vbVariant + vbArray) And LöschenVerboten Then
With Application
.EnableEvents = False
.Undo
.EnableEvents = True
End With ' Application
'
' Meldung an Benutzer geben
'
If VarType(Auswahl) = vbObject Then
msg_text = " Sie dürfen nicht gelöscht werden!"
Else ' VarType(Auswahl) = vbObject
msg_text = " Der Inhalt darf nicht gelöscht werden!"
End If ' VarType(Auswahl) = vbObject
answ = MsgBox("Die Zeile(n) " & gewaehlte_zeilen & " wurden angewählt." & msg_text & vbLf & vbLf & _
"Die Löschung wurde rückgängig gemacht!" & vbLf & vbLf & _
"Falls eine Löschung notwendig ist, bitte an IT melden!", _
vbOKOnly + vbExclamation, "Löschen von Zeilen")
End If ' (VarType(Auswahl) = vbObject Or VarType(Auswahl) = vbVariant + vbArray) And LöschenVerboten
'
End Sub
'
Danke Daniel für die Tips
Jürgen