Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema Image
BildScreenshot zu Image Image-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema OptionButton
BildScreenshot zu OptionButton OptionButton-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema RefEdit
BildScreenshot zu RefEdit RefEdit-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema ScrollBar
BildScreenshot zu ScrollBar ScrollBar-Seite mit Beispielarbeitsmappe aufrufen

Tabindex bei verbundenen Zellen

Betrifft: Tabindex bei verbundenen Zellen von: EasyD
Geschrieben am: 21.09.2020 08:29:28

Hallo zusammen

ich habe ein geschütztes Blatt zur Datenerfassung mit einigen nicht geschützten Zellen.

mit der Tabulatortaste möchte ich nun in einer vorgegebenen Reihenfolge durch die Zellen springen können.
Das Ganze ist zusätzlich noch abhängig von dem Wert in Zelle S50, den ich durch klick auf 4 verschiedene Grafiken steuere (schreibe Wert 1 bis 4).

Meine Lösung:
(in einem Modul, wird aufgerufen im worksheet_activate)

Sub TabOrder()

'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Tabulatorreihenfolge - im ws_activate aufgerufen  _
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
'xxxxxxxxxxxxxxx in der Zelle S50 (Datenerfassung) wird bei Klick auf die Grafiken ein Kenner  _
gesetzt xxxxxxxx
'Tabulatorreihenfolge in Abhängigkeit vom ausgewählten Eingabebereich
Dim arr


intIndex = intIndex + 1

Select Case Sheets("Datenerfassung").Range("S50").Value

'Reihenfolge 1
Case 1
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 2
Case 2
arr = Array("AL9:AM9", "AL11:AM11", "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 3
Case 3
arr = Array("AL9:AM9", "AL11:AM11", "AQ9:AR9", "AQ11:AR11", "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 4
Case 4
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 Select

End Sub
Leider funktioniert das nicht wie gewünscht. Im Verdacht als Problemverursacher hatte ich die verbundenen Zellen, siehe Case 2 und 3, war ursprünglich definiert mit AL9, AL11, .... Hat aber ebenfalls nicht geholfen.

Habt Ihr Ideen dazu? Eine Beispielmappe könnte ich mit etwas Fummelei noch hochladen wenn gewünscht.

Betrifft: AW: Tabindex bei verbundenen Zellen
von: EasyD
Geschrieben am: 21.09.2020 08:36:29

Da fehlte noch was vorab:

Option Explicit
Option Base 1
Public intIndex As Integer

Betrifft: AW: Tabindex bei verbundenen Zellen
von: Luschi
Geschrieben am: 21.09.2020 09:06:32

Hallo EasyD,

was hast Du denn programmiert, wenn sich der Wert in Zelle 'S50' und vor allem, wodurch ändert sich dieser Wert:
- manuell oder durch 1 Formel
- wenn manuell, dann kann man die Zellen, die nicht geschützt sein sollen, beeinflussen
- das erspart jede Menge selbst programmierte Zugriffskontrolle

Gruß von Luschi
aus klein-Paris

Betrifft: AW: Tabindex bei verbundenen Zellen
von: EasyD
Geschrieben am: 21.09.2020 09:23:25

Hallo Luschi

auf dem Blatt gibt es 3 Eingabebereiche zur Datenerfassung.

Durch klick auf eine Grafik springe ich in diesen 3 Eingabebereichen hin und her (dafür schränke ich jeweils die scrollarea unterschiedlich ein).

Insgesamt gibt es 3 Grafiken, die 3 unterschiedliche Prozeduren auslösen.

Innerhalb dieser 3 prozeduren ändert der klick gleichzeitig den Wert in Zelle S50, welcher wiederum als Grundlage für die Steuerung der Taborder dient.

(Die prozedur Taborder ist 4-teilig, weil der zweite Eingabebereich aus 2 Teilbereichen besteht, Case 2 und 3 in der Taborder.)

Das ganze sieht am Beispiel des ersten Eingabebereiches so aus, im gleichen Modul wie die Taborder:

Sub Sprung_Grund()
'In der Erfassung zum entsprechenden Eingabebereich springen
Application.ScreenUpdating = False
Call Protect_off

'Kenner setzen als Markierung für den ausgewählten Bereich 1
'steuert die TabOrder
ActiveSheet.Range("S50").Value = 1

'Taborder auf Anfang
intIndex = 0


ActiveSheet.ScrollArea = ""
   Dim Zeile As Long, Spalte As Long
   Zeile = 5
   Spalte = 20
   With ActiveWindow
      .ScrollColumn = Spalte
      .ScrollRow = Zeile
   End With
ActiveSheet.ScrollArea = "T1:AE34"

Call Protect_on

Range("Y7").Select


Application.ScreenUpdating = True
End Sub


Betrifft: AW: Tabindex bei verbundenen Zellen
von: Luschi
Geschrieben am: 21.09.2020 09:48:19

Hallo EasyD,

der Vba-Befehl 'ActiveSheet.Range("S50").Value = 1
- löst das Change-Ereignis der Tabelle aus
- hier kann man abfragen ob die geänderte Zelle 'S50' ist (Application.Intersect)
- und wenn ja, dann die entsprechenden Zellen schützen bzw. freigeben
- und dann muß man sich um die Tab-Taste nicht mehr kümmern

Gruß von Luschi
aus klein-Paris

Betrifft: AW: Tabindex bei verbundenen Zellen
von: EasyD
Geschrieben am: 21.09.2020 09:55:33

puh

also mit application.intersect abfragen, ob sich S50 geändert hat
das bekomme ich glaube hin

aber was ist das Ergebnis der Prüfung?
Du meinst, wenn ja, dann den Zellschutz aufheben?

Bisher habe ich den Zellschutz für diese Zellen IMMER aufgehoben. Und zwar NUR für diese Zellen. Alles andere auf dem Blatt ist gesperrt.

Würde sich das Problem also erledigen, wenn ich mit dieser Methode immer nur DIE Zellen des gerade gewählten Bereiches frei gegeben habe und sonst keine weiteren Zellen auf dem Blatt?



und wo oder was ist eigentlich "klein-paris" ?
;)

Betrifft: Zur letzten Frage siehe Goethes Faust und ...
von: Luc:?
Geschrieben am: 21.09.2020 17:23:09

Auerbachs Keller, Easy,
da drumherum isset! ;-]
Gruß, Luc :-?
„Die universelle Befähigung zur Unfähigkeit macht jede menschliche Leistung zu einem unglaublichen Wunder.“ Stapps ironisches Paradoxon
Nichtsdestotrotz Durchblick verbessern mit …


Betrifft: AW: Zur letzten Frage siehe Goethes Faust und ...
von: EasyD
Geschrieben am: 22.09.2020 08:15:07

Aha... da hab ich schon das ein oder andere Mal gut gegessen ;)

Aber zurück zu meinem Problem.

Ich weiß nicht ob das richtig durch gekommen ist:

Es kommt schon auf die Reihenfolge der anzusteuernden Zellen an.
Du musst Dir vorstellen, dass in den Eingabebereichen die einzelnen Zellen nicht hintereinander liegen und somit blosses Drücken der Tabulatortaste (ohne vorherige Festlegung der Reihenfolge) dazu führen würde, dass die Reihenfolge eine andere ist, als von der Datenerfassungsmaske vorgegeben (Bspw würde ich natürlich bei einer Adresse nicht zuerst die Postleitzahl, dann die Strasse und dann den Ort eingeben wollen).

Deine Anregung hat mich zu folgendem Lösungsansatz gebracht, leider auch noch nicht mit dem gewünüschen Ergebnis. Das Ergebnis jetzt ist lediglich, dass er mir - wenn ich mich bspw im ersten Bereich befinde - beim Drücken der Tabulatortaste nicht mehr rüber in den zweiten Bereich springt sondern einfach in der momentan gewählten Zelle hängen bleibtz:

Sub Sprung_Grund()

Dim LockedCells, FreeCells As Range
Set FreeCells = Range("Y7, Y9, Y11, Y13, X17, Y19, X21, X23, Y25, AC17, AD19, AC21, AC23, AD25") _

Set LockedCells = Range("AL9:AM9, AL11:AM11, AQ9, AQ11, AL17, AL19:AM19, AL21:AM21, AQ17, AQ19: _
AR19, AQ21:AR21, 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")

'In der Erfassung zum entsprechenden Eingabebereich springen
Application.ScreenUpdating = False
Call Protect_off

FreeCells.Locked = False
LockedCells.Locked = True

'Kenner setzen als Markierung für den ausgewählten Bereich Grund
'steuert die TabOrder
ActiveSheet.Range("S50").Value = 1

'Taborder auf Anfang
intIndex = 0


ActiveSheet.ScrollArea = ""
   Dim Zeile As Long, Spalte As Long
   Zeile = 5
   Spalte = 20
   With ActiveWindow
      .ScrollColumn = Spalte
      .ScrollRow = Zeile
   End With
ActiveSheet.ScrollArea = "T1:AE34"

Call Protect_on

Range("Y7").Select


Application.ScreenUpdating = True
Set FreeCells, LockedCells = Nothing

End Sub


Betrifft: AW: Zur letzten Frage siehe Goethes Faust und ...
von: EasyD
Geschrieben am: 22.09.2020 08:25:35

ich glaub ich habe den Übeltäter gerade gefunden.... im ws_activate des Blattes
Private Sub Worksheet_Activate()

'xxxxxxxxxxxxxxxxxx Tabulatorreihenfolge festlegen - Steuerung durch das "Taborder" im  _
Modul_Div xxxxxxxxxxxxxxxxxxxxxxxxxx
[y7].Select
Application.OnKey "{TAB}", "TabOrder"
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx




Call Protect_off

'.... diverse Anweisungen hier


'xxxxxxxxxxxxxxxx und hier liegt des Bösen Wurzel begraben xxxxxxxxxxxxxx
'Kenner setzen für Beginn des TabOrder im ersten Bereich (Grundangaben)
ActiveSheet.Range("S50").Value = 1
Call TabOrder '-> jetzt frag mich mal wie das hier rein gekommen ist.....
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


ActiveSheet.ScrollArea = "A1:AE34"
Call Protect_on
Set CellsE = Nothing: Set CellsF = Nothing: Set CellsG = Nothing

End Sub


Beiträge aus dem Excel-Forum zum Thema "Tabindex bei verbundenen Zellen"