Brauche einen Excel Makro zum wechseln von Tabellen?
Kurzgefasst brauche ich einen Makro mit folgender Logik:
Wenn irgendeine Zelle angeklickt wird, worin die ersten drei Zeichen identisch sind wie mit einem Tabellenblatt, dann soll zu dem Tabellenblatt gewechselt werden.
Also Zelle A1 heißt zum Beispiel "AAA_Tabelle1".
Klickt man nun auf A1, soll Excel zum Tabellenblatt mit dem Namen "AAA" springen.
Und dies bitte automatisiert. Denn manuell könnte ich es auch machen, aber dann wären halt alle Werte fest und nicht variabel. Mein manueller/nicht flexibler Code lautet:
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
If ActiveCell Like "AAA*" Then
Sheets("AAA").Select
End If
End Sub
Vielen Dank im Voraus
3 Antworten
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
If Not Intersect(Target, Range("A1:A100")) Is Nothing Then
Sheets(Left(Target.Value, 3)).Activate
End If
End Sub
Wobei ich mit A1:A100 den Bereich eingegrenzt habe. Ganz offen lassen würde ich das nicht. Wenn doch gewollt, einfach die zweite und vierte Zeile weglassen.
Ich sage mal ein riesen DANKESCHÖN!
Super. Klappt wunderbar, danke für deine schnelle Hilfe.
Eine kleine Bitte hätte ich noch ohne deine Zeit rauben zu wollen. Undzwar hätte es für mich einen ziemlich großen Lerneffekt, wenn du die Zeilen kommentieren würdest, sodass man alles nachvollziehen kann. Somit könnte ich später falls nötig auch eigene Anpassungen leichter realisieren.
Erklärungsbedarf gibt es bei Zeile 1,2 und 4. Der Rest ist klar.
If Not Intersect(Target, Range("A1:A100")) Is Nothing Then
Das ist quasi die Standard-Zeile um in einem Ereignismakro den Bereich zu beschränken, auf den es angewendet wird. Die doppelte Verneinung macht dabei Sinn, warum kann ich nicht wirklich erklären. Der Befehl lautet in etwa:
"Wenn das Ziel (Target, also die Zelle, die gerade selektiert wurde) und die angegebene Range übereinstimmen (Intersect), das Ziel also in dem Bereich liegt, dann mache etwas."
Konkret wird das umgesetzt mit: Wenn die Übereinstimmung von Ziel und Bereich NICHT NICHTS ist (not nothing), dann ...
On Error GoTo ErrorHandler
ist eine Sprungmarke, die den Fehler abfängt, wenn ich - in der nächsten Zeile - versuche, ein Blatt zu öffnen, das es nicht gibt. Dann springe ich zur Marke ErrorHandler: (Als Marke erkennbar am Doppelpunkt) und gebe die Meldung aus.
Exit Sub
Damit bewirke ich, das, wenn das Blatt geöffnet wurde, die ganze Prozedur abgebrochen wird. Praktisch springt der Code dann nach End Sub.
Das muss sein, weil sonst als nächstes die Fehlermeldung ausgegeben würde, auch wenn das Blatt gefunden und geöffnet wurde.
Vielen Dank für deine ausführliche Antwort.
Jedoch hatte ich beim Zählen der Zeilen ganz oben angefangen.
Also:
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
If Not Intersect(Target, Range("A1:A100")) Is Nothing Then
Sheets(Left(Target.Value, 3)).Activate
Das verwirrt mich Jetzt, dann die erste Zeile kam doch von Dir!? Egal.
Die erste Zeile wird von Excel so vorgegeben, wenn man ein Ereignismakro startet, das auf die Auswahl einer Zelle reagieren soll (Oben im Editor von "Allgemein" auf "Worksheet" wechseln --> Selection Change (rechts daneben, wird meist automatisch ausgewählt, da kannst Du aber auch andere Ereignisse vorgeben).
DAS reagiert dann, sobald eine Zelle ausgewählt wird und erstellt automatisch die Variable "Target", die die Adresse der ausgewählten Zelle zurückgibt.
Die zweite hatte ich bereist erklärt.
Sheets(Left(Target.Value, 3)).Activate
"Sagt": Nimm die 3 Zeichen, die in Target, also der ausgewählten Zelle, am Anfang (links) stehen und nutze sie als Namen eines Blattes und aktiviere dieses Blatt.
Hieße in Deinem Beispiel halt: Nimm von "AAA_Tabelle1" die "AAA" und aktiviere das Blatt AAA.
Vielen DANK! :)
Das mit Zeile eins sollte dich nicht verwirren.
Denn ich habe dies zwar aus dem Netz genommen jedoch nicht verstanden gehabt. Dazu noch kam zwischen "As" und "Range" noch ein "Excel" hinzu. Daher war ich allgemein auf eine Erklärung angewiesen.
Danke nochmal
Stimmt, das "Excel." war mir gar nicht aufgefallen. Ist nicht Standard, aber scheint auch nicht zu stören. War mir noch nicht untergekommen.
Vielen Dank nochmal für den Code. Klappt alles nach wie vor 1A! Nur bräuchte ich eine kleine Änderung welches ich leider nicht hinbekomme :(
Sheets(Left(Target.Value, 3)).Activate
Die oben stehende Zeile soll so angepasst werden, dass in dem geöffneten Sheet dann immer die Zelle A1 ausgewählt ist.
Das musst Du anhängen:
Sheets(Left(Target.Value, 3)).Activate
ActiveSheet.Range("A1").Select
Danke für den Versuch. Leider geht es nicht. Da kommt immer die MsgBox ""Kein passendes Blatt gefunden!" da anscheinend die Zelle A1 nicht ausgewählt wird.
Sorry, muss mich entschuldigen. Der Code funktioniert doch. Ich habe es aus Versehen im falschen Sheet geschrieben.
Es gibt ja schon ein paar Antworten.
Springen auf eine gewünschte Seite geht aber auch mit Hyperlinks.
Sind es nicht zu viele Seiten, die erreicht werden müssen, können diese Links eine Art Index zur Navigation in dem Excel Workbook bilden.
So kommt man recht schnell hin und her ohne Makro. Je Unterseite könnte einen Link zurück zum Index haben.
===
Meine VBA Lösung sieht beim Öffnen des WB alle Seiten in eine Liste zu geben und diese als DropDown auswählbar zu halten. Dann muss man gar nichts tippen, sondern klappt nur auf und wählt.
Danke für deine Antwort.
Folgendes Problem herrscht bei Hyperlinks:
Beim Wechsel auf ein anderes Tabellenblatt möchte ich keine spezielle Zelle definieren, sondern die letzte angeklickte Zelle einfach beibehalten. Über die normale "Link" Funktion von Excel, muss leider immer eine Zelle mitgewählt werden.
Stimmt. Dieser Nachteil besteht. Dann hoffe ich dass die vorgeschlagenen VBA Lösungen fruchten.
Wie wäre es denn wenn du dir ein Signalwort ausdenkst und dann dahinter das Ziel schreibst? Also z.B. "Sht_AAA"
Das erkennst du dann mit
If left(Traget.value,4) = "Sht_" then
sheets(Replace(target.value,"Sht_","").activate
End if
Etwas erweitert: