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
Hallo nochmals
Kannst meine erneute Nachfrage vergessen- hat sich erledigt. Aus irgendeinem Grund ist im geschützten Blatt plötzlich angewählt gewesen "jeder kann geschützte und ungeschützte Zellen anwählen", also beides markiert gewesen....

Gruss Hardy
0 Punkte
Beantwortet von
Hallo Hardy,

entferne die Zeile

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

oder setze ein Apostroph davor. Dann passiert dir das nicht mehr. Ich hatte sie mit aufgenommen, da ich nicht wusste, ob du dauerhaft nur nicht gesperrte Zellen auswählen willst.

Mr. K.
0 Punkte
Beantwortet von
Schön, dass es jetzt klappt :-)
0 Punkte
Beantwortet von

Hallo Mr. K.,

ich habe ein ähnliches Anliegen und bin mir sicher Du kannst mir helfen! yes

wenn ich in die Zelle die ziffer "1" oder "2" eingebe,
soll der Cursor automatisch (ohne Entertaste) auf die nächste Zelle nach rechts springen.
Wenn ich die Enter- oder Leer-Taste  betätige soll er ebenfalls einfach nur in die nächste Zelle springen.

In folgender Reihenfolge:
C4 -> D4 -> E4 -> F4 -> G4
->C5 -> D5 -> E5 -> F5 -> G5
->C6 -> D6 -> E6 -> F6 -> G6
->C7 -> D7 -> E7 -> F7 -> G7

usw. bis ->G40.

Vielen Dank

0 Punkte
Beantwortet von
Bearbeitet

Hallo Mingos,

warum machst du hierfür keine neue Frage auf? Das würde anderen Nutzern die Übersicht erleichtern. Du kannst hier auch Links einfügen, die auf alte Threads verweisen. 

Seis drum. Dann antworte ich dir eben hier: Deine Angaben sind dürftig. Korrigiere mich, wenn ich mich irre: Ich vermute, du willst das gewünschte Verhalten nur im genannten Bereich erleben. In diesem Bereich soll nur 1 oder 2 eingegeben werden, Andere Eingaben sind unzulässig. Außerhalb des Bereichs und auf anderen Tabellenblättern sollen Eingaben normal passieren. Von diesem Szenario ausgehend probiere mal das folgende Makro:

Erstelle ein neues Modul (z.B. Modul1) und gib dort diesen Code ein:

Sub Weiterspringen()
  
  Dim Bereich As Range, i As Single
  
  Set Bereich = Range("C4:G40")
  
  If Not Intersect(ActiveCell, Bereich) Is Nothing Then
    i = (ActiveCell.Row - Bereich.Row) * Bereich.Columns.Count _
      + ActiveCell.Column - Bereich.Column + 1
    If i = Bereich.Cells.Count Then Bereich.Cells(1).Select _
    Else Bereich.Cells(i + 1).Select
  End If
 
End Sub
Sub Eingabe0()
  ActiveCell = 0
  Weiterspringen
End Sub
Sub Eingabe1()
  ActiveCell = 1
  Weiterspringen
End Sub
Sub Eingabe2()
  ActiveCell = 2
  Weiterspringen
End Sub

Gehe dann in das Modul das deinem Tabellenblatt entspricht (z.B. Tabelle1) und gib dort diesen Code ein:

Dim abgeschaltet As Boolean

Private Sub Worksheet_Activate()
  If Not Intersect(ActiveCell, Range("C4:G40")) Is Nothing Then Abschalten
End Sub

Private Sub Worksheet_Deactivate()
  Zuruecksetzen
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Not Intersect(Target, Range("C4:G40")) Is Nothing Then
  If abgeschaltet = False Then Abschalten
Else
  If abgeschaltet = True Then Zuruecksetzen
End If
  
End Sub
Private Sub Abschalten()
  
  'Schaltet das Standardverhalten bestimmter Tasten bei Tastendruck ab.
  
  'Zahlen abschalten
  On Error Resume Next
  For key = 0 To 9
  Application.OnKey Trim(Str(key)), "" 'Ziffern 0-9
  Application.OnKey "+" & Trim(Str(key)), "" 'Zeichen !"§$%&/()=
  Application.OnKey "^%" & Trim(Str(key)), "" 'Zeichen ²³{[]}
  Next key

  'Nummernblock abschalten
  For key = 96 To 111
  Application.OnKey "{" & key & "}", "" '0-9+-*/,
  Next key

  'Eingabe von Buchstaben abschalten
  For key = 65 To 90 'A-Z
  Application.OnKey "{" & key & "}", ""  'Kleinbuchstaben a-z
  Application.OnKey "+{" & key & "}", "" 'Großbuchstaben A-Z
  Application.OnKey "^%{" & key & "}", "" 'Drittbelegung @€µ etc.
  Next key
  
  'Sonderzeichen abschalten
  For key = 186 To 226
  Application.OnKey "{" & key & "}", "" 'äöüß+-,.#^´<
  Application.OnKey "+{" & key & "}", "" 'ÄÖÜ?*';:_>
  Application.OnKey "^%{" & key & "}", "" '|~\
  Next key

  'Verhalten definieren
  Application.OnKey " ", "Weiterspringen"
  Application.OnKey "{RETURN}", "Weiterspringen"
  Application.OnKey "{ENTER}", "Weiterspringen"
  Application.OnKey "0", "Eingabe0" 'Zifferntaste 0
  Application.OnKey "1", "Eingabe1" 'Zifferntaste 1
  Application.OnKey "2", "Eingabe2" 'Zifferntaste 2
  Application.OnKey "{96}", "Eingabe0" 'Nummernblock 0
  Application.OnKey "{97}", "Eingabe1" 'Nummernblock 1
  Application.OnKey "{98}", "Eingabe2" 'Nummernblock 2
  
  abgeschaltet = True
End Sub
Private Sub Zuruecksetzen()
  On Error Resume Next
  'Zahlen einschalten
  For key = 0 To 9
  Application.OnKey Trim(Str(key))
  Application.OnKey "+" & Trim(Str(key))
  Application.OnKey "^%" & Trim(Str(key))
  Next key
  
  'Nummernblock einschalten
  For key = 96 To 111
    Application.OnKey "{" & key & "}"
  Next key

  
  'Eingabe von Buchstaben einschalten
  On Error Resume Next
  For key = 65 To 90 'A-Z
  Application.OnKey "{" & key & "}"
  Application.OnKey "+{" & key & "}"
  Application.OnKey "^%{" & key & "}"
  Next key
  
  'Sonderzeichen einschalten
  For key = 186 To 226
  Application.OnKey "{" & key & "}"
  Application.OnKey "+{" & key & "}"
  Application.OnKey "^%{" & key & "}"
  Next key
  
  'Definiertes Verhalten zurücksetzen
  Application.OnKey " "
  Application.OnKey "{RETURN}"
  Application.OnKey "{ENTER}"
  Application.OnKey "0"
  Application.OnKey "1"
  Application.OnKey "2"
  Application.OnKey "{96}"
  Application.OnKey "{97}"
  Application.OnKey "{98}"
  
  abgeschaltet = False
  
End Sub

Wenn du nun im Bereich C4:G40 Enter oder Space drückst springt es 1 weiter Eingaben wie 1 oder 2 werden gemacht und dann eins weiter gesprungen. Andere Eingaben sind nicht möglich.

Du kannst den Code natürlich auch an deine Bedürfnisse anpassen. Versuchs einfach mal.

Gruß Mr. K.

0 Punkte
Beantwortet von
posso usare l'italiano or english
0 Punkte
Beantwortet von
Hallo Mr. K.,

sorry für die so verspätet Antwort.

Als erstes möchte ich mich wirklich sehr herzlich dafür bedanken dass Du Dich meiner Sache angenommen hast!

Vielen vielen vielen lieben Dank!

Du glaubst gar nicht was das für eine Arbeitserleichterung für mich darstellt!!! Danke!

Ich trau mich gar nicht zu fragen, aber wenn das kein allzu großer Aufwand für Dich ist:

1. ist es möglich dass nach der letzten Eingabe in "G40", er automatisch wieder zu "C4" springt? - was müsste ich dann am Code ändern? (ja ich bin was VBA angeht ein blutiger Anfänger... :-/)

2. was muss ich ändern wenn ich möchte dass die Taste "0" die gleiche Funktion hat wie "1" und "2"?

3. was muss ich ändern wenn der benannte Bereicht geändert werden soll? z.B. "D10" bis "G60"?

Besten Dank schon mal im Voraus und ein schönes Weekend

Besten Gruß

Mingos
0 Punkte
Beantwortet von
Hallo Mingos,

ich dachte eigentlich der Code sei soweit verständlich, dass du weitere Tasten selbst hinzufügen kannst.

Um Platz zu sparen habe ich gleich den Code oben um deine Zusatzfragen ergänzt. Nun kannst du auch die Taste 0 verwenden und die Sub "Weiterspringen" springt dank einer kleinen IF-Abfrage nun nach der letzten wieder zur ersten Zelle im Bereich. Wenn du den Bereich ändern willst musst du das an drei Stellen im Code tun. Ersetze jeweils Range("C4:G40") durch z.B. Range("D10:G60")

Gruß Mr. K.
0 Punkte
Beantwortet von
Hallo Mingos,

um Platz zu sparen habe ich gleich den Code oben um deine Zusatzfragen ergänzt. Jetzt kannst du auch die Taste 0 verwenden und die Sub "Weiterspringen" springt dank einer kleinen IF-Abfrage nach der letzten nun wieder zur ersten Zelle im Bereich. Wenn du den Bereich ändern willst musst du das an drei Stellen im Code machen. Ersetze jeweils Range("C4:G40") durch Range("D10:G60")

Gruß Mr. K.
0 Punkte
Beantwortet von

perfekt!!! yesyesyes

1000 Dank!!! 

Jetzt nur noch (hoffentlich) eine Kleinigkeit:

Ich hab folgenden Code:

****

Sub clean()
Range("C4", "G40").ClearContents

End Sub

***

jetzt soll er direkt nach dem die Zellen geleerte wurden --> in Zelle "C2" (ist eine Dropdownliste) --> dann nach Auswahl und mit Enter bestätigen in Zelle "B4" (manuelle Zeiteingabe) springen --> dann nach bestätigen mit Enter in Zelle "C4"

ist das machbar?

Vielen Dank schon mal im Voraus

und besten Gruß

...