'entwickelt von Winfried Radner 'e-mail: Wolf.W.Radzinski@onlinehome.de 'Benutzung frei - ohne Gewähr 1) Programmcodedatei: http://www.rendar.de/excel/jump_3.txt runterladen, öffnen,komplett markieren, kopieren (in die Zwischenablage bzw. das Clipboard) und dann den Text in die gewünschte (leere) Arbeitsmappe kopieren und zwar folgendermaßen ... a) Excel starten b) mit den Tasten in den VBA Editor wechseln c) mit den Projekt Explorer öffnen d) Doppelklick auf den Eintrag "DieseArbeitsmappe" e) in das (bei neuer Arbeitsmappe) leere Fenster rechts daneben klicken f) kopiert den Inhalt des Clipboards hinein. Fertig! g) dieses Fenster schließen h) das letzte (ganz rechte) Arbeitsblatt wird beim (Neu)Start automatisch als Sprungadressenblatt definiert! i) über kommt man an 3 Makros - die man sich auch auf Buttons oder Tastenkürzel legen kann I) reset_springen (setzt letztes Blatt als Sprungadressenblatt und schaltet das Springen EIN) II) SprAdrAS (macht das gerade AKTIVE Blatt zum Sprungadressenblatt) III) springen_EinAus (schaltet das Springen temporär Ein und Aus, der gesetzte Status wird per MessageBox mitgeteilt) 2) Aufgabe: veranlaßt den Sprung in eine andere Zelle (evtl. auf anderem Arbeitsblatt) entweder nach einem Zellwechsel oder nach einer Eingabe bzw. Änderung in einer Zelle. 3) Funktionsweise: Der Code schaut bei jedem Workbook_SheetChange bzw. Workbook_SheetSelectionChange in einem vorher definierten und extra angelegten Arbeitsblatt (auch mehrere möglich), ob für die gerade aktive Zelle ein Sprungziel definiert wurde. Wenn ja, veranlaßt es den sofortigen Sprung in diese neue Zelle - natürlich nur, wenn a) ein Sprungziel korrekt definiert wurde und b) dieses auch erreichbar ist! 4) Syntax der "benutzerdefinierten" Sprungzieleinträge in der Sprungzieltabelle. Annahme für die folgenden Beispiele: a) zur Zeit aktive Zelle sei (oder wird durch Sprung dort hin) >>> Tabelle2!E7 b) Name der Sprungzieltabelle sei "sprungadr" folgende Angaben beziehen sich auf Zelleinträge in der Tabelle "sprungadr" sei folgender Eintrag in sprungadr!E7 --folgt--> WOHIN springt der Cursor nach einer _Eingabe_ bzw. Änderung in der Zelle E7 des Blattes "Tabelle2" (da der Sprung in jeder Zelle E7 eines beliebigen Arbeitsblattes ausgeführt wird - soweit möglich - sollte man für Änderungen im Blatt "sprungadr" das Springen vorher AUSschalten!) $B$3 --> Tabelle2!B3 (Zelle absolut) [0,0] --> Tabelle2!E7 (Zelle relativ) [-3,5] --> Tabelle2!J4 [1,-1] --> Tabelle2!D8 Tabelle3!$B$3 --> Tabelle3!B3 (Blatt absolut) Tabelle3![0,0] --> Tabelle3!E7 Tabelle3![-3,5] --> Tabelle3!J4 Tabelle3![1,-1] --> Tabelle3!D8 Tabelle3! --> zum letzten aktiven Zellbereich in Tabelle3 [-1]!$B$3 --> Tabelle1!B3 (Blatt relativ) [-1]![0,0] --> Tabelle1!E7 [-1]![-3,5] --> Tabelle1!J4 [-1]![1,-1] --> Tabelle1!D8 [-1]! --> zum letzten aktiven Zellbereich in Tabelle1 [3]!$B$3 --> 3.Blatt!B3 (Blatt#INDEX absolut) [3]![0,0] --> 3.Blatt!E7 [3]![-3,5] --> 3.Blatt!J4 [3]![1,-1] --> 3.Blatt!D8 [3]! --> zum letzten aktiven Zellbereich im 3.Blatt =Wenn(Tabelle2!E7>200;"[3]!$B$3";"[0,1]") --> true: 3.Blatt!B3 false: Tabelle2!F7 sei folgender Eintrag in sprungadr!E7 --folgt--> WOHIN springt der Cursor nachdem er Tabelle2!E7 _erreicht_? (da der Sprung in jeder Zelle E7 eines beliebigen Arbeitsblattes ausgeführt wird - soweit möglich - sollte man für Änderungen im Blatt "sprungadr" das Springen vorher AUSschalten!) >>>>>VORSICHT vor ENDLOSSCHLEIFEN!<<<<< s$B$3 --> Tabelle2!B3 (Zelle absolut) s[0,0] --> Tabelle2!E7 (Zelle relativ) s[-3,5] --> Tabelle2!J4 s[1,-1] --> Tabelle2!D8 sTabelle3!$B$3 --> Tabelle3!B3 (Blatt absolut) sTabelle3![0,0] --> Tabelle3!E7 sTabelle3![-3,5] --> Tabelle3!J4 sTabelle3![1,-1] --> Tabelle3!D8 sTabelle3! --> zum letzten aktiven Zellbereich in Tabelle3 s[-1]!$B$3 --> Tabelle1!B3 (Blatt relativ) s[-1]![0,0] --> Tabelle1!E7 s[-1]![-3,5] --> Tabelle1!J4 s[-1]![1,-1] --> Tabelle1!D8 s[-1]! --> zum letzten aktiven Zellbereich in Tabelle1 s[3]!$B$3 --> 3.Blatt!B3 (Blatt#INDEX absolut) s[3]![0,0] --> 3.Blatt!E7 s[3]![-3,5] --> 3.Blatt!J4 s[3]![1,-1] --> 3.Blatt!D8 s[3]! --> zum letzten aktiven Zellbereich im 3.Blatt =Wenn(Tabelle2!E7>200;"s[3]!$B$3";"s[0,1]") --> true: 3.Blatt!B3 false: Tabelle2!F7 der INHALT von Tabelle2!E7 entscheidet, WOHIN gesprungen wird, der Inhalt von Zelle E7 ist dabei aber nicht so ohne weiteres per Tastatur änderbar! z.B. Nur durch Markierung mehrerer Zellen, wobei E7 die aktive Zelle ist. Erweiterung: die =Wenn(Bedingung;Wahr;Falsch) Klammer kann auch folgendermaßen in (die Zelle) Tabelle2!E7 eigegeben werden |>200|[3]!$B$3|[0,1] bei Änderung des Wertes in Zelle E7 s|>200|[3]!$B$3|[0,1] bei Erreichen der Zelle E7 mit =Wenn(...) hat man aber wesentlich mehr Möglichkeiten z.B. =WENN(N(Tabelle2!E7)>200;"[3]!$B$" & Tabelle2!E7 + 3;"$E$7") bleibt bei falscher Eingabe in Zelle E7 und springt bei korrekter Eingabe in 3.Blatt Spalte_B Zelle 204 und höher! 5) KORREKTUR 25.4.2001 a) die Sprungzieltabelle(n) sollte(n) KEINE VERBUNDENEN ZELLEN enthalten, dies könnte zu Fehlverhalten führen (z.B. in einer WENN Formel?)! b) um verbundene Zellen im Eingabeformular bzw. der Dateneingabetabelle zu ermöglichen wurden 2 weitere interne (private) Funktionen eingebaut! c) die Sprungzieladresse einer verbundenen Zelle muß auf der Sprungzieltabelle in die LINKE OBERE ZELLE des auf dem Datenblatt verbundenen Bereiches eingetragen werden! Beispiel: In Tabelle1 seien die Zellen B5:C7 VERBUNDEN (6 Zellen als eine einzige dargestellt) Nach einer Eingabe/Wertänderung in dieser Zelle soll der Cursor z.B. nach F6 springen. Dann muß in sprungadr!B5 z.B. einer der folgenden Einträge gemacht werden $F$6 [0,3] springt zu F5 (nicht [0,4], wie bei nicht verbundenen Zellen!) von dort könnte man dann z.B. mit s[1,0] sofort zu F6 weiterverzweigen. Relative Adressierung in Verbindung mit verbundenen Zellen ist "mit Vorsicht zu genießen" 6) Tipp: ich lege die Sprungziele im Sprungzielblatt entweder direkt in die Eingabezelle des Ausgangsblattes ODER in Zellen, die im Ausgangangsblatt AUSGEBLENDET wurden.