Tabulatorreihenfolge auf geschütztem Blatt
15.11.2019 08:12:29
EasyD
ich habe ein geschütztes Blatt mit einer Reihe ungesperrter Zellen zur Bearbeitung.
Das Blatt ist "aufgeteilt" in 3 Teilbereiche die ich per Klick auf eine Grafik ansteuere (ganz links der erste Bereich, Klick auf Grafik springt weiter nach rechts in den zweiten Bereich usw). Das ganze ist quasi ein 3-teiliges Erfassungsformular, nur einer der Bereiche soll immer sichtbar sein.
Jetzt will ich die Zellen zur Bearbeitung mit der Tabulatortaste vernünftig bedienen können.
Der unten stehende Code läuft wie gewünscht, hat aber eine Schwäche.
Wenn ich die Tabulatorreihenfolge für einen Bereich nicht bis zum Ende durchklicke, dann aber schon auf die Grafik klicke um in einen anderen Bereich zu springen, wird der Tabstopp (intIndex) nicht wieder auf 0 gesetzt damit die Reihenfolge bei der ersten Zelle des neu ausgewählten Bereiches wieder los geht. Stattdessen springt er bei Tabulator dann gleich zu der nächsten Stelle - Bsp - wenn ich den ersten Bereich bis zur Stelle 9 durch gegangen bin, dann in den zweiten Bereich wechsele, macht er bei Stelle 10 weiter - ich möchte aber natürlich die erste....
Den Wert in Sheets("Datenerfassung").Range("S50") ändere ich jeweils ebenfalls bei klick auf die Grafik, damit TabOrder weiß in welchem Bereich wir uns befinden.
Und ganz verzwickt wird es dadurch, dass die Anzahl der Zellen in den 3 Bereichen unterschiedlich ist. Wenn ich bspw im zweiten Bereich schon bei Stelle 30 angekommen bin, hakt sich das natürlich enorm wenn ich in den ersten Bereich wechsele, da der wieder nur 14 Stellen insgesamt hat (also die 31ste Stelle natürlich gar nicht finden kann).
Gibt's Ideen dazu wie ich die Momentan ausgewählte Stelle in diesem array merken kann?
Hinweis:
Im zweiten Bereich ist noch eine Bedingung eingebaut die mir bei Auswahl eines Kontrollkästchens 3 Zellen sperrt oder entsperrt, deshalb ist die Tabulatorreihenfolge für den zweiten Bereich nochmal aufgesplittet, im übrigen aber genauso wie die anderen Bereiche.
In dem Blatt:
Private Sub Worksheet_Activate()
[y7].Select 'erste Stelle im ersten Bereich
Application.OnKey "{TAB}", "TabOrder"
End Sub
In einem Modul:
Option Explicit
Option Base 1
Dim intIndex As Integer
Sub TabOrder()
'Tabulatorreihenfolge in Abhängigkeit vom ausgewählten Eingabebereich
Dim arr
intIndex = intIndex + 1
'Reihenfolge im ersten Bereich
If Sheets("Datenerfassung").Range("S50").Value = 1 Then
arr = Array("y7", "y9", "y11", "y13", "x17", "y19", "x21", "x23", "y25", "ac17", "ad19", "ac21", "ac23", "ad25")
Range(arr(intIndex)).Select
If intIndex = 14 Then intIndex = 0
'Reihenfolge im zweiten Bereich, ohne gesperrte
ElseIf Sheets("Datenerfassung").Range("S50").Value = 2 Then
arr = Array("al9", "al11", "aq9", "aq11", "al17", "al19", "al21", "al26", "am26", "an26", "aq26", "as26", "al27", "am27", "an27", "aq27", "as27", "al28", "am28", "an28", "aq28", "as28", "al29", "am29", "an29", "aq29", "as29", "al30", "am30", "an30", "aq30", "as30")
Range(arr(intIndex)).Select
If intIndex = 32 Then intIndex = 0
'Reihenfolge im zweiten Bereich, alle Zellen
ElseIf Sheets("Datenerfassung").Range("S50").Value = 3 Then
arr = Array("al9", "al11", "aq9", "aq11", "al17", "al19", "al21", "aq17", "aq19", "aq21", "al26", "am26", "an26", "aq26", "as26", "al27", "am27", "an27", "aq27", "as27", "al28", "am28", "an28", "aq28", "as28", "al29", "am29", "an29", "aq29", "as29", "al30", "am30", "an30", "aq30", "as30")
Range(arr(intIndex)).Select
If intIndex = 35 Then intIndex = 0
'Reihenfolge im dritten Bereich
ElseIf Sheets("Datenerfassung").Range("S50").Value = 4 Then
arr = Array("bb9", "bb11", "bb13", "bb15", "bb17", "bb19", "bb21", "bb23", "bb25", "bf9", "bf11", "bf14", "bg25")
Range(arr(intIndex)).Select
If intIndex = 13 Then intIndex = 0
End If
End Sub
und das hier ist der Klick auf die Grafik am Bsp für den zweiten Bereich, die anderen sind entsprechend
Sub Sprung_Bereich2()
Application.ScreenUpdating = False
ActiveSheet.ScrollArea = ""
Call Protect_off
If ActiveSheet.Shapes("Kontrollkästchen_AE").DrawingObject.Value = 1 Then
'Kenner setzen als Markierung für den ausgewählten Bereich
'Bei Bereich 1 und 3 gibt's direkt den Wert 1 oder 4 ohne Abfrage eines Kontrollkästchens
ActiveSheet.Range("S50").Value = 2
Else
ActiveSheet.Range("S50").Value = 3
End If
Dim Zeile As Long, Spalte As Long
Zeile = 5
Spalte = 35
With ActiveWindow
.ScrollColumn = Spalte
.ScrollRow = Zeile
End With
ActiveSheet.ScrollArea = "AI1:AT34"
Call Protect_on
Range("AL9").Select 'erste Zelle des Bereiches auswählen
Application.ScreenUpdating = True
End Sub