3.4k Aufrufe
Gefragt in Tabellenkalkulation von
Hallo zusammen

Ich habe ein Datenerhebungsformular, wo ausser die Eingabefelder alle anderen Zellen geschützt sind. Nun möchte ich, dass z.B. von E2:M2 jeweils pro Zelle nur eine Zahl von 0 bis 9 eingegeben werden kann und dann der Cursor automatisch nach rechts springt OHNE Enter, Tab oder Pfeil Tasten zu betätigen. Also z.B. in Zelle E1 gebe drücke ich die Taste "6" und der Cursor hüpft sofort auf die Zelle F2 etc.

Kann mir da jemand weiterhelfen?

Schon mal besten Dank!
Gruss Hardy

24 Antworten

0 Punkte
Beantwortet von rainberg Profi (14.9k Punkte)
Hallo Hardy,

OHNE Enter, Tab oder Pfeil Tasten zu betätigen...


... ist das meines Wissens nicht möglich.

Gruß
Rainer
0 Punkte
Beantwortet von
Hi All,

Doch doch. Allerdings nur mit einem kleinen Trick.
Füge im VBA-Editor (Alt+F11) im Modul "DieseArbeitsmappe" folgenden Code ein.

Private Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal vKey As Long) As Integer 'Wichtig Welche Taste wurde gedrückt

Private Sub Workbook_Open()
Workbook_Activate
End Sub

Private Sub Workbook_Activate()

'formatiert das Blatt so, dass nur zu ungesperrten
'Zellen gesprungen wird:
Sheets("Tabelle1").EnableSelection = xlUnlockedCells

'erstellt den Eventhandler zur Tasteneingabe
Application.OnKey "1", "DieseArbeitsmappe.Pruefen"
Application.OnKey "{97}", "DieseArbeitsmappe.Pruefen"

Application.OnKey "2", "DieseArbeitsmappe.Pruefen"
Application.OnKey "{98}", "DieseArbeitsmappe.Pruefen"

Application.OnKey "3", "DieseArbeitsmappe.Pruefen"
Application.OnKey "{99}", "DieseArbeitsmappe.Pruefen"

Application.OnKey "4", "DieseArbeitsmappe.Pruefen"
Application.OnKey "{100}", "DieseArbeitsmappe.Pruefen"

Application.OnKey "5", "DieseArbeitsmappe.Pruefen"
Application.OnKey "{101}", "DieseArbeitsmappe.Pruefen"

Application.OnKey "6", "DieseArbeitsmappe.Pruefen"
Application.OnKey "{102}", "DieseArbeitsmappe.Pruefen"

Application.OnKey "7", "DieseArbeitsmappe.Pruefen"
Application.OnKey "{103}", "DieseArbeitsmappe.Pruefen"

Application.OnKey "8", "DieseArbeitsmappe.Pruefen"
Application.OnKey "{104}", "DieseArbeitsmappe.Pruefen"

Application.OnKey "9", "DieseArbeitsmappe.Pruefen"
Application.OnKey "{105}", "DieseArbeitsmappe.Pruefen"

Application.OnKey "0", "DieseArbeitsmappe.Pruefen"
Application.OnKey "{96}", "DieseArbeitsmappe.Pruefen"


End Sub

Sub Pruefen()

Dim WshShell As Object
Set WshShell = CreateObject("WScript.Shell")

For k = 48 To 57
keypressed = CBool(GetAsyncKeyState(k))
If keypressed Then
ActiveCell.Value = k - 48
Exit For
End If
Next k
If keypressed = False Then
For k = 96 To 105
keypressed = CBool(GetAsyncKeyState(k))
If keypressed Then
ActiveCell.Value = k - 96
Exit For
End If
Next k
End If

WshShell.SendKeys "{Tab}", True 'erst rechts, dann runter
'oder
'WshShell.SendKeys "{ENTER}", True 'erst runter, dann rechts

End Sub

Private Sub Workbook_Deactivate()

'setzt die Tasteneingabe auf Standard zurück
Application.OnKey "1"
Application.OnKey "{97}"

Application.OnKey "2"
Application.OnKey "{98}"

Application.OnKey "3"
Application.OnKey "{99}"

Application.OnKey "4"
Application.OnKey "{100}"

Application.OnKey "5"
Application.OnKey "{101}"

Application.OnKey "6"
Application.OnKey "{102}"

Application.OnKey "7"
Application.OnKey "{103}"

Application.OnKey "8"
Application.OnKey "{104}"

Application.OnKey "9"
Application.OnKey "{105}"

Application.OnKey "0"
Application.OnKey "{96}"

End Sub

Wenn du die Datei nun schließt (als xls oder xlsm speichern!) und neu öffnest sollte es funktionieren. Bei mir klappts super.

Gruß Mr. K.
0 Punkte
Beantwortet von
@xlKing aka Mr. K

Danke für Deine Antwort. Da ich mit Makros/ VBA wenig vertraut bin, hier noch einige Zusatzfragen an Dich.

1) 'Wichtig Welche Taste wurde gedrückt --> Das verstehe ich leider nicht ganz, was meinst Du genau?
2) Generell: muss ich alle Passagen welche mit einem ' beginnen rauslöschen oder kann das drin bleiben?
3)Wenn ich es richtig verstehe, dann gilt das für die gesamte Arbeitsmappe, so dass ausschliesslich Zahlen von 0 bis 9 eingegeben werden können und er danach automatisch zur nächsten ungeschützten Zelle springt oder?
4) Wie muss ich vorgehen um im Blatt nur bestimmte Bereiche mit dem Code anzusprechen? Also eben z.B. meine Zellen E2:M2 und noch andere definierte Bereiche? Ich habe im Blatt Zahlen (wo das absolut cool wäre) aber eben auch normale Texteingaben, wo es freie Eingabe sein muss. Hoffe, dazu gibt's ebenfalls eine Möglichkeit :-)
5) diesen Abschnitt verstehe ich nicht, was macht der genau und was bedeuten die Zahlen genau?
Dim WshShell As Object
Set WshShell = CreateObject("WScript.Shell")

For k = 48 To 57
keypressed = CBool(GetAsyncKeyState(k))
If keypressed Then
ActiveCell.Value = k - 48
Exit For
End If
Next k
If keypressed = False Then
For k = 96 To 105
keypressed = CBool(GetAsyncKeyState(k))
If keypressed Then
ActiveCell.Value = k - 96
Exit For
End If
Next k
End If

WshShell.SendKeys "{Tab}", True 'erst rechts, dann runter
'oder
'WshShell.SendKeys "{ENTER}", True 'erst runter, dann rechts

End Sub

***
Besten Dank für Deine Hilfe!

Gruss Hardy
0 Punkte
Beantwortet von
Ergänzung zu meiner ersten Antwort

zu Punkt 4)
4) Wie muss ich vorgehen um im Blatt nur bestimmte Bereiche mit dem Code anzusprechen? Also eben z.B. meine Zellen E2:M2 und noch andere definierte Bereiche? Ich habe im Blatt Zahlen (wo das absolut cool wäre) aber eben auch normale Texteingaben UND ZAHLENEINGABEN, wo es freie Eingabe sein muss, UND DER CURSOR IM FALLE EINER ZAHLENEINGABE EBEN NICHT AUTOMATISCH WEITERSPRINGEN SOLL. Hoffe, dazu gibt's ebenfalls eine Möglichkeit :-)

So sollte es nun komplett sein.

übrigens habe ich deinen Code bereits getestet und es funktioniert einwandfrei bei Zahleneingabe :-))

Danke und Gruss
Hardy
0 Punkte
Beantwortet von
Hallo Hardy,

zu 1. Das war nur ein alter Kommentar von mir, den ich versehentlich aus einer anderen Datei mit rüberkopiert habe. Da Excel selbst keine zufriedenstellende Funktion bietet einen Tastendruck auszuwerten, habe ich mit dieser Funktion einen Verweis zum Windowshandler gesetzt.
zu 2. Text oder Code dem ein führendes Apostroph voransteht wird als Kommentar ausgewertet. Kann zum besseren Verständnis des Codes drin bleiben, kann wahhlweise aber auch rausgelöscht werden.
zu 3. Ja, derzeit gilt es für die gesamte Arbeitsmappe und nein es können auch andere Zeichen eingegeben werden, aber nur bei Zahlen wird automatisch weitergesprungen. Das hast du ja mittlerweile bestimmt schon selbst bemerkt.
zu 4. Da lässt sich bestimmt auch was machen, so kam das allerdings aus deiner ursprünglichen Frage nicht raus. Melde mich gleich nochmal dazu.
zu 5. hier werden in einer Schleife alle 20 Zahlentasten anhand ihrer offiziellen Key_ID geprüft ob eine davon gedrückt wurde, deren Wert in die Aktive Zelle übernommen und dann weitergesprungen. Das Weiterspringen musste auch wieder mit externer Funktion umgesetzt werden, da weder die VBA-Eigene SendKeys Anweisung noch die Excel-Interne SendKeys-Methode bei mir für diese Tasten funktioniert hatte. Aber das nur am Rande.

Bis gleich Mr. K.
0 Punkte
Beantwortet von
Hallo nochmal,

leider habe ich festgestellt, dass bei sehr schnell aufeinanderfolgender Eingabe, es vorkommen kann, dass Windows sich den
neuen Tastendruck nicht lang genug merkt um nach Makroende erneut darauf reagieren zu können. Daher habe ich den Code
nochmal ein wenig umgeschrieben und deinen Wünschen angepasst. Sollte jetzt funktionieren.

Lösche sämtlichen Code aus dem Modul "DieseArbeitsmappe und füge stattdessen in dem Modul, das deinem Tabellenblatt
entspricht diesen Code ein.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'Dieses Event reagiert auf verschieben der Aktiven Zelle

Set Zahleingabe = Range("E1,E2:M2,F7") 'Zellen bei denen gesprungen werden soll.

'Wenn die aktive Zelle nach Zahleingabe springen soll.
If Not Intersect(Target, Zahleingabe) Is Nothing Then

'Für Zahleingabe vorbereiten
For key = 0 To 9
Application.OnKey Trim(Str(key)), ActiveSheet.Name & ".Taste" & Trim(Str(key))
Application.OnKey "{" & 96 + key & "}", ActiveSheet.Name & ".Taste" & key
Next key

'Eingabe von Buchstaben abschalten
On Error Resume Next
For key = 65 To 90 'A-Z
Application.OnKey "{" & key & "}", ""
Next key
For key = 186 To 226 'Sonderzeichen
Application.OnKey "{" & key & "}", ""
Next key
Else

'Bei Druck von Tabulator wird hiermit wieder zur benachbarten Zelle gesprungen

'Eingabetasten auf Standard zurücksetzen
For key = 0 To 9
Application.OnKey Trim(Str(key))
Application.OnKey "{" & 96 + key & "}"
Next key
On Error Resume Next
For key = 65 To 90 'A-Z
Application.OnKey "{" & key & "}"
Next key
For key = 186 To 226 'Sonderzeichen
Application.OnKey "{" & key & "}"
Next key
End If

End Sub
Sub Taste1()
ActiveCell.Value = 1
Springen
End Sub
Sub Taste2()
ActiveCell.Value = 2
Springen
End Sub
Sub Taste3()
ActiveCell.Value = 3
Springen
End Sub
Sub Taste4()
ActiveCell.Value = 4
Springen
End Sub
Sub Taste5()
ActiveCell.Value = 5
Springen
End Sub
Sub Taste6()
ActiveCell.Value = 6
Springen
End Sub
Sub Taste7()
ActiveCell.Value = 7
Springen
End Sub
Sub Taste8()
ActiveCell.Value = 8
Springen
End Sub
Sub Taste9()
ActiveCell.Value = 9
Springen
End Sub
Sub Taste0()
ActiveCell.Value = 0
Springen
End Sub
Sub Springen()

Dim WshShell As Object
Set WshShell = CreateObject("WScript.Shell")

'Formatiert das Sheet so, dass nur zu nicht gesperrten Zellen gesprungen wird
ActiveSheet.EnableSelection = xlUnlockedCells

'Springt zur nächsten Zelle
WshShell.SendKeys "{Tab}", True 'erst rechts, dann runter
'oder
'WshShell.SendKeys "{ENTER}", True 'erst runter, dann rechts

'Hinweis: wenn du lieber erst nach unten und dann nach rechts springen willst, entferne das
'Apostroph vor dem unteren WshShell und setze dafür eins vor dem oberen WshShell.

'lässt wieder die Anwahl jeder Zelle zu
ActiveSheet.EnableSelection = xlNoRestrictions

End Sub

Bei mir klappts jetzt perfekt.
Gruß Mr. K.
0 Punkte
Beantwortet von
@xlKing aka Mr. K

besten Dank für die neue Lösung und Deine Erklärungen.

Ich habe das so gemacht, wie von Dir beschrieben. Allerdings funktioniert das bei mir nicht.

Ich habe lediglich den Range wie folgt angepasst (Hinweis: hat aber in der Original Vorlage dieselbe Fehlermeldung ausgespuckt)
Set Zahleingabe = Range("E2:M2") 'Zellen bei denen gesprungen werden soll. Da ich nur hier Zahlen will und Cursor Sprung automatisch und keinen Text

Problem: Im Bereich E2:M2 passiert beim Drücken einer Buchstaben Taste gar nichts (=richtig, sprich keine Eingabe und kein Springen), jedoch beim Drücken einer Zahlentaste kommt folgende Fehlermeldung:
Das Makro "\\Pfad&Datei Name&'Blattname.Taste1' kann nicht ausgeführt werden. Das Makro ist möglicherweise in dieser Arbeitsmappe nicht verfügbar, oder alle Makros wurden deaktiviert.

An was kann das liegen?

Danke und Gruss
Hardy
0 Punkte
Beantwortet von rainberg Profi (14.9k Punkte)
Hallo,

habe auch mal getestet.
Bei mir funktioniert der Code einwandfrei, allerdings muss man auf "Option Explicit" verzichten, da keine Variablen deklariert sind.

Gruß
Rainer
0 Punkte
Beantwortet von
Hallo Rainer,

vielen Dank für dein Feedback. Wenigstens bei dir funktioniert der Code. Auf Option Explicit verzichte ich übrigens ganz bewusst, da
ich oft noch in letzter Minute diverse Variablennamen ändere oder hinzufüge und mir nicht noch zusätzliche Bugs durch fehlende
Dimensionierung einbauen will.

Hallo Hardy,

da bin ich leider auch grad überfragt. Hast du wirklich Alles richtig kopiert? Hast du die Datei mal gespeichert und neu geöffnet?
Manchmal hilfts. Bist du sicher, dass du nicht nach dem Anspringen einer Zelle im Bereich E2:M2 das Tabellenblatt umbenannt
hast? Vielleicht hat auch ausgerechnet dein System ein Problem, den Punkt als Trennzeichen zwischen Blatt- und Makroname zu
erkennen. Versuch mal folgendes. Kopiere den Code ab Sub Taste1 bis zum Schluss in ein Standardmodul (das fügst du über
Menüpunkt Einfügen -> Modul hinzu). Im Tabellenmodul steht nun nur noch das Worksheet_SelectionChange-Ereignis. Dort
entfernst du ActiveSheet.Name & sowie den Punkt vor "Taste". Auf diese Weise umgehst du mögliche Probleme, die mit dem
Namen des Blatts oder der Datei zu tun haben.
Übrigens solltest du doch noch das Workbook_Deactivate-Ereignis aus Antwort 2 unten an den Code im Tabellenmodul
anfügen. So umgehst du Probleme beim Wechsel zu einer anderen Datei, wenn grade eine Zahl-Zelle markiert ist.

Sollte auch das nicht helfen, schreib einfach mal Schritt für Schritt auf, was du vielleicht anders machst, als wir.

Gruß Mr. K.
0 Punkte
Beantwortet von
@xlKing aka Mr. K

Sorry für die späte Antwort, war geschäftlich abwesend.

Habe es nun so umgesetzt gemäss deiner letzten Antwort und nun funktioniert das Eingeben der Zahlen im definierten Bereich und das Springen einwandfrei.
Leider können nun auch per Mausklick und/oder Pfeiltasten die nicht gesperrten Zellen angewählt werden, was unschön ist. (natürlich kann nichts eingegeben werden). Es wäre eleganter, wenn der Cursor ja nur immer auf die ungesperrten Zellen = Eingabzellen springen würde.

Gibt's dazu auch noch eine smarte Abhilfe?

Jedenfalls schon mal vielen Dank! Du warst eine super Hilfe!

Gruss Hardy
...