2.1k Aufrufe
Gefragt in Tabellenkalkulation von
Hallo,
in der Hoffnung, dass ihr mir helfen könnt:
Ich habe eine Tabelle, in der von meiner Mitarbeiterin Zelle für Zelle von links nach rechts Daten eingegeben werden. Nach der Eingabe springt sie mit der TAb-Taste zur nächsten Zelle. Am Ende fängt sie in der nächsten Zeile links wieder an. Leider ist die Tabelle nicht sicher vor übersprungenen (leer gelassenen) Zellen. Dies ist in Zellen einer Spalte besonders ärgerlich, hier würde ich gerne das Weiterspringen per Tab verhindern, solange die Zelle nicht gefüllt ist. (Eigentlich hätte ich erwartet, dass dies auch funktioniert, wenn bei aktivierter Gültigkeitsprüfung einer Zelle das Häkchen bei "leere Zellen ignorieren" herausgenommen wurde. Tut es aber nicht.) Alle Beispiele, die ich gegoogelt habe, bezogen sich immer nur auf einzelne oder auch mehrer Zellen in einer Zeile z.B. E5. Oder man wurde nach der ersten Eingabe in Zelle A1 beim ersten Betätigen der Tab-Taste sofort zu meiner Problem-Spalte Y geleitet.
Wie kann man also immer dann das Weiterspringen stoppen, wenn die Eingabe in der Zelle der Spalte Y dran ist? (Vorzugsweise auch immer nur dann, wenn diese leer ist)

6 Antworten

0 Punkte
Beantwortet von
Hallo Mr. Frost,

hier mal mein Vorschlag. Füge den Code in das entsprechende Tabellenmodul des VBA-Editors (Alt+F11) ein.
Dim AltCell As Range
Private Sub Worksheet_Activate()
Set AltCell = ActiveCell
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If AltCell Is Nothing Then Set AltCell = Target 'um Fehler zu vermeiden.
If Not Intersect(AltCell, Range("Y:Y")) Is Nothing And AltCell = "" Then
Application.EnableEvents = False
AltCell.Select
Application.EnableEvents = True
MsgBox "Bitte geben Sie hier einen Wert ein!"
Else
Set AltCell = Target
End If
End Sub
Gruß Mr. K.
0 Punkte
Beantwortet von
Hallo xlKing,
vielen Dank für deine schnelle Antwort.. Ich konnte deinen Vorschlag erst heute ausprobieren, am Ende aber erfolgreich !
Zunächst hatte ich deinen Code einfach an den schon vorhandnen angehängt (mit Leerzeilen dazwischen). Danach erhielt ich bei der ersten Bewegung (in eine andere Zelle springen) die Fehlermeldung 424 "Objekt erforderlich".
Der code "If AltCell Is Nothing Then" war dann gelb markiert.
Wenn ich in den Inhalt einer Zelle verändert habe (oder auch nicht) kam beim Verlassen ein Kompilierungsfehler und die erste Zeile des gesamten Codes war gelb hinterlegt.
Versuchsweise habe ich dann den Ursprungscode (Datumsfunktion) herausgenommen, so dass dein Vorschlag dann alleine lief.
Und siehe da, es funzt !
Da ich von VBA fast keine Ahnung habe: Könntest Du mir die beiden Funktionen noch "zusammenbasteln", oder kann man pro Tabelle nur eine Funktion nutzen?
Achja, und wäre auch eine Meldung möglich, die bei der Eingabe von selbst verschwindet, ohne dass man OK drücken muss?
Hier der Code für die Datumsfunktion:

Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.Unprotect
If Target.Column = 9 Then
If Target.Value <> "" And Target.Value <> " " Then Target.Offset(0, 2).Value = Date
End If
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub

Vielen Dank für deine Mühe !
Mr.Frost
0 Punkte
Beantwortet von
Hallo Mr. Frost.

von schon vorhandenem Code hattest du nichts geschrieben, sonst hätte ich dich darauf hingeweisen, dass die Zeile Dim AltCell As Range unbedingt die erste Zeile im Codemodul sein muss. Ansonsten sollten sich die beiden Codes problemlos anhängen lassen (nur eben umgekehrt!)

Damit die Meldung von selbst verschwindet musst du jedoch über Einfügen -> Userform ein Benutzerformular hinzufügen und dort ein Label mit deinem Text hinterlegen. Habe den Code entsprechend angepasst, nur grad im Moment keine Gelegenheit zum Testen. Sollte aber funktionieren. Falls nicht meld dich einfach nochmal.

Dim AltCell As Range
Private Sub Worksheet_Activate()
Set AltCell = ActiveCell
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If AltCell Is Nothing Then Set AltCell = Target 'um Fehler zu vermeiden.
If Not Intersect(AltCell, Range("Y:Y")) Is Nothing And AltCell = "" Then
Application.EnableEvents = False
AltCell.Select
Application.EnableEvents = True
UserForm1.Show vbModeless
Application.Wait Now + TimeValue("0:00:02")
Unload UserForm1
Else
Set AltCell = Target
End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.Unprotect
If Target.Column = 9 Then
If Target.Value <> "" And Target.Value <> " " Then Target.Offset(0, 2).Value = Date
End If
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub
Gruß Mr. K.
0 Punkte
Beantwortet von
Hallo XLKing,
super, Dein Vorschlag funzt. Aber da wäre doch noch ´ne Kleinigkeit:
Die Textbox wird offensichtlich für eine einstellbare Zeit angezeigt. Während dieser Zeit ist keine Eingabe möglich, die Textbox wartet gewissermaßen ihre Zeit ab.
Wäre das auch anders möglich ? Textbox wartet solange, bis eine Eingabe erfolgt?

Und dann noch eine letzte Frage: Wie müsste der Code aussehen, wenn man diese "Stopbox" in mehreren Spalten einer Tabelle einsetzen wollen würde? (Wobei es hier vermutlich zwei Varianten geben wird: a. Zwei oder mehrere Spalten nebeneinander und b. z.b. Spalte m und y)
Fragen über Fragen ... , ich hoffe ich nerve nicht :-))

Viele Grüße
Mr.Frost
0 Punkte
Beantwortet von
Hallo,

ein bisschen wundere ich mich schon. Bereits im ersten Codebeispiel hatte ich dir mit der Zeile MsgBox "Bitte geben Sie hier einen Wert ein!" eine Box aufgezeigt, die wartet bis der Nutzer OK drückt. Das wolltest du nicht. Du wolltest eine Meldung "die bei der Eingabe von selbst verschwindet", was ich dir mit Userform1.Show usw. gezeigt habe. Nun soll die Box doch wieder auf Eingabe warten? Offensichtlich willst du wohl die Eingabe direkt in der Box machen und nicht in der Zelle. Das löst du am einfachsten indem du z.B. die Zeilen
Eingabe = Inputbox("Bitte geben Sie einen Wert ein")
AltCell=Eingabe

anstelle der Msgbox bzw. anstelle der zeilen Userform bis Unload hinzufügst. Damit kennst du nun Alle drei Wege, ein Formular anzuzeigen.

Um auf mehrere Spalten zu reagieren brauchst du nur den Bereich anpassen. z.B.
If Not Intersect(AltCell, Range("Y:Z,AB:AB")) Is Nothing And AltCell = "" Then
Bei Einzelspalten ist dabei zu beachten, dass die Spalte nach einem Doppelpunkt nochmal angegeben wird. Außerdem wird als Trennung zwischen den Bereichen nicht wie gewohnt ein Semikolon sondern aufgrund des Englischen Formats ein Komma gesetzt.

Ich hoffe ich konnte dir damit helfen.
Gruß Mr. K.
0 Punkte
Beantwortet von
Hallo xlKing,

nein, ich wollte nicht direkt in die Textbox schreiben. Ich meinte, dass die Textbox von selbst verschwindet, sobald man eine Eingabe in der Zelle macht. Dann spart man sich den Klick auf ok und kann den angezeigten Text solange lesen, wie man möchte. Aber ich glaube, man kann das auch über die Eingabemeldung innerhalb der Gültigkeitsprüfung machen.
Vielen Dank auf jeden Fall für Deine kompetente Hilfe.

Viele Grüße
Mr.Frost
...