PDA

Vollständige Version anzeigen : Zelleinträge nur durch Eingabemaske erlauben


adehler
08.07.2015, 09:07
Hallo zusammen,

ich habe eine Tabelle, die durch eine Eingabemaske "gefüttert" wird. Nun möchte ich gerne verhindern, dass die Anwender direkt in die Zellen der Tabelle schreiben können, da einige blind Zeilen kopieren und dadurch Fehler entstehen.

Die Eingabe soll somit nur über die Eingabemaske gestattet sein. Blattschutz bringt ja nicht viel, weil dann ja auch die Eingabe über die Maske scheitert.

Vielen Dank für eure Hilfe

Liebe Grüße

Anja

chris-kaiser
08.07.2015, 09:11
Hi,

Blattschutz bringt ja nicht viel, weil dann ja auch die Eingabe über die Maske scheitert

warum?
.Protect "xyz", Userinterfaceonly:=true

lässt Eingaben über VBA zu aber keine am Blatt..

anbei eine Demo

adehler
08.07.2015, 13:23
Hallo Chris,

vielen Dank. Das habe ich auch schon probiert. Leider erhalte ich ständig einen Fehler "Laufzeitfehler 1004" wenn ich dann versuche über die Eingabemaske etwas einzutragen. Was mache ich denn falsch?

chris-kaiser
08.07.2015, 13:33
Hi,

funktioniert es denn nicht in meiner Demo!?

Was mache ich denn falsch
Dann wird was an deinem Code nicht passen, nur diesen kann ich nicht sehen...

adehler
08.07.2015, 13:42
Mit deiner Demo funktioniert es.

Hier mal ein Teil des Codes, da stoppt das Makro:

'Neuer Eintrag Schaltfläche Ereignisroutine
Private Sub CommandButton1_Click()
Dim lZeile As Long
'Wenn der Benutzer einen neuen Eintrag erzeugen möchte,
'erstellen wir einen neuen Eintrag in der ListBox und markieren
'diesen, damit der Benutzer die Daten eintragen kann

lZeile = 2 'Start in Zeile 2, Zeile 1 sind ja die überschriftrn
'Schleife solange etwas in der ersten Spalte in Tabelle 1 drin steht
Do While Trim(CStr(Tabelle1.Cells(lZeile, 1).Value)) <> ""
lZeile = lZeile + 1 'Nächste Zeile bearbeiten
Loop

'Nach Durchlauf dieser Schleife steht lZeile in der ersten leeren Zeile von Tabelle1
'Neuen Eintrag in die Tabelle1 schreiben, Spalte ID muss gefüllt sein, damit
'unsere Routinen die Zeile wiederfinden!
Tabelle1.Cells(lZeile, 1) = CStr("Neuer Eintrag")

'Und neuen Eintrag in die UserForm eintragen
ListBox1.AddItem CStr("Neuer Eintrag")

'Den neuen Eintrag markieren mit Hilfe des ListIndexes
ListBox1.ListIndex = ListBox1.ListCount - 1
'Durch das Click Ereignis der ListBox werden die Daten automatisch geladen

With TextBox1
.SetFocus
.SelStart = 0
.SelLength = Len(.Text)
End With

CheckBox1.Value = False
CheckBox2.Value = False
CheckBox3.Value = False
CheckBox4.Value = False
CheckBox5.Value = False
CheckBox6.Value = False


End Sub

Deinen Code habe ich dem ganzen Arbeitsblatt zugeordnet. Kann es sein, dass ich den Namen des UserForms noch erwähnen muss?

Liebe Grüße

chris-kaiser
08.07.2015, 13:46
Hi,

wo ist dein Protect?
Wenn Du in meiner Mappe einen Doppelklick auf "dieseArbeitsmappe" machst siehst du darinnen ein Workbook_open
mit dem Protect darinnen.

adehler
08.07.2015, 13:58
Deinen Code habe ich ebenfalls hinter "DieseArbeitsmappe" gelegt und das Blatt geschützt.

Trotzdem bekomme ich die Fehlermeldung.

Liebe Grüße

chris-kaiser
08.07.2015, 14:22
hi,

Private Sub Workbook_Open()
Dim sh As Worksheet
For Each sh In Sheets
sh.Protect "xyz", Userinterfaceonly:=True
Next
End Sub

ich habe es mal so geändert, bei mir geht das jetzt mit neuem Eintrag.

adehler
08.07.2015, 14:33
Hi Chris,

vielen Dank, aber bei mir bleibt das Problem bestehen. Hast du den Code ebensfalls hinter "DieseArbeitsmappe" gespeichert? Oder in den Code integriert?

lg

edit: Habe es nun doch hinbekommen. Musste das Arbeitsblatt erstmal schließen. Jetzt funktioniert es. Dankeschöööööön. :)

chris-kaiser
08.07.2015, 14:47
Hallo Anja,

anbei mit der Datei, wo ich ein paar mal "neuer Eintrag" hinzugefügt habe.

Du könntest auch noch die Eigenschaft hinzufügen
Tabelle1.Cells(lZeile, 1).Value = CStr("Neuer Eintrag")

ich hatte schon mal den Fall das Default-Eigenschaften nicht genommen wurden!

adehler
08.07.2015, 14:56
Kommando zurück. "Neuer Eintrag" funktioniert zwar, aber beim "Löschen" bekomme ich nun die nächste Fehlermeldung...:(

"Die Delete-Methode des Range-Obkjektes konnte nicht ausgeführt werden."

Die Einträge vom ersten Tabellenblatt kann ich zwar löschen, aber vom zweiten Tabelleblatt leider nicht. Der Code von dir spricht doch aber alle Tabellenblätter an, oder?


'Löschen Schaltfläche Ereignisroutine
Private Sub CommandButton2_Click()
Dim lZeile As Long

'Wenn kein Datensatz in der ListBox markiert wurde, wird die Routine beendet
If ListBox1.ListIndex = -1 Then Exit Sub

'Zum Löschen benötigen wir die Zeilennummer des ausgewählten Datensatzes
lZeile = 2 'Start in Zeile 2, Zeile 1 sind ja die Überschriften
'Schleife solange etwas in der ersten Spalte in Tabelle 1 drin steht
Do While Trim(CStr(Tabelle1.Cells(lZeile, 1).Value)) <> ""


'Datensatz ID Spalte mit selektiertem Eintrag der ListBox vergleichen
If ListBox1.Text = Trim(CStr(Tabelle1.Cells(lZeile, 1).Value)) Then

If MsgBox("Wollen Sie den Datensatz wirklich löschen?", _
vbQuestion + vbYesNo, "Datensatz löschen?") = vbYes Then

'Eintrag gefunden, die ganze Zeile wird nun gelöscht
Tabelle1.Rows(CStr(lZeile & ":" & lZeile)).Delete
Tabelle2.Rows(CStr(lZeile & ":" & lZeile)).Delete
End If


'Die ListBox muss nun neu geladen werden!
Call UserForm_Initialize
If ListBox1.ListCount > 0 Then ListBox1.ListIndex = 0
ListBox1.ListIndex = ListBox1.ListCount - 1

Exit Do 'Vorzeitiges Ende, da der Datensatz schon gefunden ist

End If


lZeile = lZeile + 1 'Nächste Zeile bearbeiten
Loop

End Sub

Tut mir wirklich leid :rolleyes:

chris-kaiser
08.07.2015, 17:37
Hi,

hmm
dann so

'Eintrag gefunden, die ganze Zeile wird nun gelöscht
Tabelle1.Rows(CStr(lZeile & ":" & lZeile)).Delete
Call aus
Tabelle2.Rows(lZeile).Delete
Call ein

und

Sub aus()
Tabelle2.Unprotect "xyz"
End Sub

Sub ein()
Tabelle2.Protect "xyz", userinterfaceonly:=True
End Sub

adehler
09.07.2015, 13:13
Hallo Chris,

vielen Dank. Habe es jetzt etwas anders gelöst und es funktioniert. Im Initialisierungsprozess lasse ich Protect von beiden Tabellenblättern aufheben und beim Beenden wieder aktivieren.

Vielen Dank und liebe Grüße

Anja