909 Aufrufe
Gefragt in Anwendungen(Java,C++...) von martin68 Einsteiger_in (35 Punkte)

Hallo zusammen, ich bräuchte nochmals eure Hilfe.

  1. Ich habe drei Arbeitsblätter, auf dem ersten habe ich zwei Userformen die ich per Button öffne und auf dem zweiten Arbeitsblatt habe ich eine Userform die per Button geöffnet wird. Blatt drei sollte nur für mich bearbeitet werden können z.B. per Kennwort.

Nun wollte ich die drei Blätter schützen, sodass nur über die Userform etwas eingegeben werden kann. Sobald ich den Blattschutz aktiviere, kann ich auch nicht mehr auf den Button klicken der die Userform öffnet.

  1. Sollte nun jemand in eine Zelle etwas eintragen wollen, sollte er den Hinweis „bitte nutze die Userform“ bekommen. Jeweils für Arbeitsblatt 1 und Arbeitsblatt 2 Blatt.

Ich schreib mal den Code den ich habe unten hin, der bringt mir aber immer wieder einen Laufzeitfehler

Private Sub Worksheet_Change(ByVal Target As Range)

Dim lngZeile As Long

Application.EnableEvents = False

Application.Undo                                       <--   hier bringt er immer den Laufeitfehler

MsgBox "Bitte Userform 2 verwenden"

UserForm2.Show

Application.EnableEvents = True

End Sub

Nun meine Frage an Euch, was und wo schreibe ich nun den jeweiligen Code rein?

Ich möchte mich für Eure Hilfe schon einmal sehr herzlich im Voraus bedanken

6 Antworten

+1 Punkt
Beantwortet von
ausgewählt von martin68
 
Beste Antwort

Hallo Martin,

leider habe ich keine Idee, wie ich dir hier weiterhelfen könnte. dein erstes Problem:

Sobald ich den Blattschutz aktiviere, kann ich auch nicht mehr auf den Button klicken der die Userform öffnet.

Doch, das sollte eigentlich gehen. zumindest bei mir gibts da keine Einschränkungen. Probiers nochmal indem du beim Schützen des Tabellenblattes nur die Standardhäkchen drin lässt und nicht alles anhakst. Nur so als Idee. Welchen Button verwendest du denn? Es sollte entweder ein Formular-Steuerelement-Button oder ein AktiveX-Button sein.

Auch dein Code funktioniert bei mir einwandfrei und ohne Laufzeitfehler. Diesen musst du sowohl in das Modul Tabelle1 als auch in das Modul Tabelle2 reinkopieren. Den Laufzeitfehler kann ich nicht nachvollziehen. Was sagt dieser denn aus? Du könntest ihn höchstens überspringen indem du zu Beginn des Codes die Zeile On Error Resume Next hinzufügst.

Sub Makroname
On Error Resume Next
'Dein Code

Allerdings ist der Code überflüssig. In dem Moment wo du das Tabellenblatt sperrst, sind Eingaben eh nicht mehr möglich, also springt auch der Code nur in Zellen an, du explizit zur Eingabe freigeschaltet hast. Das geht über Rechtsklick - Zellen formatieren. Entferne dazu auf dem Register Schutz das Häkchen vor Gesperrt.

Wenn das alles nichts hilft, dann stell doch mal eine Beispieldatei hier rein. Wie das geht kannst du hier nachlesen. Aber ob ich oder jemand Anderes dir dann mehr helfen kann, weiß ich noch nicht.

Gruß Mr. K.

0 Punkte
Beantwortet von martin68 Einsteiger_in (35 Punkte)

Guten Morgen Mr. K.,

vielen Dank für die schnelle Antort und Hilfestellung,

leider bin ich nicht weitergekommen, ich nehme gerne den Vorschlag an und hänge die Datei mit an.

https://supportnet.de/forum/?qa=blob&qa_blobid=17861480436587065883

1. Trotz sperren der Arbeitsmappe und des Blattschutz kann ich nach wie vor in eine Zelle des Blatt "erledigt" schreiben.

2. Sind die Blätter "Mitarbeiter und eingabe Reklamation" per Arbeitsmappe gesperrt, überträgt es keine Daten von "eingabe Reklamation" nach "erledigt" mehr (kann und sollte nur übertragen, wenn in eingabe Reklamation in Spalte "I" ein Datum über die UserForm2 eingetragen wird), dies funktioniert nicht bei gesprrter Mappe.

3. Wird in der UserForm2 das Datum aus versehen falsch eingegeben (zu früh oder falsch), kann ich in der Userform2 nicht mehr per Tab Taste in die nächste Textbox springen, sondern ich bleibe in der aktuellen Textbox und der Text wird dann um die Tab Taste in der aktuellen Textbox versetzt

4. es kommt immer wieder der Fehler mit "Application.Undo"

Ich hoffe das es hierfür eine Abhilfe gibt.

Gruß Martin

+1 Punkt
Beantwortet von

Hallo Martin,

habe die Datei mal geringfügig angepasst. Versuchs einfach mal. Und wenn es Probleme gibt, dann meld dich wieder.

zu 1. kann ich nichts sagen. Wenn der Blattschutz aktiv ist. kann ich auf dem Blatt "erledigt" nix mehr reinschreiben. So soll es auch sein. Sperren der Arbeitsmappe bringt nix. Damit sperrst du lediglich die Möglichkeit Blätter zu verschieben und umzubenennen etc. und noch ein paar andere Kleinigkeiten, die mit dem Blattschutz selbst nix zu tun haben. Das Blatt musst du separat über Blatt schützen sperren oder per Makro (siehe. Pkt. 2)

zu 2. Wenn das Blatt gesperrt ist, können keine Einträge stattfinden, auch nicht solche, die per Makro erfolgen. Du musst den Blattschutz also zu Beginn des Makros mit ActiveSheet.Unprotect aufheben und mit ActiveSheet.Protect am Ende des Makros neu setzen. Siehe beiliegende Datei. Das Passwort lautet: "Passwort"

zu 3. Auch das kann ich leider nicht nachvollziehen. Bei mir wird der Wert in Textbox5, 7 oder 9 nach Falscheingabe gelöscht und der Cursor springt in die nächste Textbox. Aber ich sehe wo der Fehler liegt. Denn durch das Löschen der Textbox erzeugst du ebenfalls eine falsche Eingabe, wodurch evtl. bei dir (bei mir nicht) das AfterUpdate-Ereignis erneut ausgelöst wird.

zu 4. wenigstens weiß ich jetzt wo der Undo-Fehler herkommt. Du gibst über das Userform neue Einträge ein. In diesem Fall kommt der neue Eintrag über das Makro, weshalb kein Rückgängig-Eintrag erfolgt, der zurückgenommen werden könnte. On Error resume next war hier der falsche Ansatz. On Error GoTo Weiter wäre richtiger. siehe Datei.

Gruß Mr. K.

0 Punkte
Beantwortet von martin68 Einsteiger_in (35 Punkte)

Hallo Mr. K.

Vielen Dank für die rasche und schnelle Hilfe und die Zeit die du für mich opferst.

Gerne komme ich nochmal auf dein Angebot zurück.

  1. Nun kann ich wieder in die UserForm2 nur eine Zahl eingeben z.B.: 1 und ich bekomme ein Datum 01.01.1900 – es kommt auch keine Fehlermeldung
  2. Es erscheint nur noch bei „Mitarbeiter“ bitte Eingabemaske benutzen.Bei den anderen beiden Blättern nicht mehr - wobei man sich die Frage stellen kann, ob dies überhaupt noch benötigt wird, wenn der Blattschutz aktiv ist.
  3. Kann es vielleicht daran liegen, dass wir unterschiedliche Versionen von Office verwenden, das es bei dir Funktioniert und bei mir nicht?        Ich nutze Office 2016

Nochmals vielen Dank für deine Hilfe

Gruß Martin

+1 Punkt
Beantwortet von
Bearbeitet

Hallo Martin,

danke für dein Verständnis. Es kann durchaus an den verschiedenen Excel-Versionen liegen. Bei mir klappt es so wie gewünscht, weil ich ein altes stabiles Excel verwende. Die Anschaffung von Office 2016 steht bei mir noch auf dem Plan, aber was ich hier immer so lese und höre, scheint es damit öfter mal Probleme zu geben. Auf Arbeit haben einige Kollegen wieder Office 2010 eingeführt, nachdem es bei 2016 aus nicht erkennbaren Gründen zu Programm-Abstürzen kam. Ich selbst hab auf dem Firmen-PC jedoch bislang keine Probleme mit 2016.

Ich kann verstehen, wenn sich bei dir inzwischen etwas Frust breitmacht. Aber leider kann ich dir hier aufgrund der unterschiedlichen Versionen nicht mehr weiterhelfen. Meine Codeänderungen sollen dir ja auch nur als Beispiel dienen. Letztlich musst du entscheiden, ob du das Blatt nun schützen willst (dann brauchst du Application Protect bzw. Unprotect ggf mit Parametern dahinter, die du per Makrorekorder aufzeichnen kannst) oder ob dir die Meldung "Bitte Userform benutzen" wichtiger ist (dann brauchst du Application.EnableEvents und On error goto irgendwas)

Zu 1: wer gibt schon bei Datum eine 1 ein? Aber gut. Für den Fall kannst du den Code wie folgt ändern:

If IsDate(TextBox5) Then TextBox5 = Format(TextBox5, "yyyy.mm.dd") Else MsgBox "Geben Sie ein Datum ein!"

Die Fehlermeldung kommt deshalb nicht, weil nach dem Umwandeln die Textbox den Fokus behält. Wenn du das nicht willst, dann lösche wieder die Zeile Cancel=True. Steht erstmal ein Datum drin und ist dieses zu Früh, kommt auch wieder die Fehlermeldung beim Verlassen der Textbox.

zu 2: Sag ich ja, bei aktivem Blattschutz ist es nicht möglich eine Normal-Eingabe zu machen, von daher ist der Code "Bitte Userform benutzen" überflüssig und kann gelöscht werden.

Gruß Mr. K.

0 Punkte
Beantwortet von martin68 Einsteiger_in (35 Punkte)
Hallo Mr. K.,

super es funktioniert, vielen Dank für die Geduld mit mir.

Du hast mir, mit den ganzen Code, sehr geholfen. Auch mit dem letzen Code.

Ich denke so wie es läuft, kann man damit sich durchaus einen Überblick verschaffen.

An dieser Stelle nochmals einen recht herzlichen Dank für die Hilfe.

Gruß Martin
...