Excel: schnelle Navigation zwischen Tabellenblättern mit VBA

Worum geht’s?

Wir befinden uns ins Excel, versionsunabhängig: Denkbar ist dabei eine große Menge an „Detail-Sheets“ und ein „Übersichts-Sheet“, zwischen denen immer schnell hin und her navigiert werden soll. Ein kurzes Beispiel soll eine einfache Navigation zwischen Tabellenblättern (Sheets) in Excel zeigen.
excel-tabellenblatter-navigation-sheets-skizze-sketch

In diesem Beispiel zeige ich zwei Methoden: einen einfachen Button und die Navigation mittels Zellen und deren Inhalt. Beide Methoden werden über VBA-Programmierung realisiert. Das Resultat sieht so aus:

Download

Am einfachsten wäre vermutlich meine vorbereitete Excel-Datei. Diese enthält bereits entsprechenden Code und kann mit weniger Aufwand angepasst werden.
Download section
navigation (.xlsm, 23KB)
Die Excel-Datei enthält Makros, die ihr aktivieren müsst, damit die Navigation funktioniert. Eventuelle Sicherheits-Popups müssen bestätigt werden – anders sind Makros in Excel nunmal nicht möglich.
Sie enthält außerdem ein Tabellenblatt #Main als Übersichtsseite und eine #Vorlage als Vorlage für neue Sheets. Durch einen Klick oder die Tastennavigation auf einen Namen der #Main wird die Navigation ausgelöst. Sollte das Tabellenblatt nicht existieren, wird es erstellt und zusätzlich alle bestehenden Tabellenblätter alphabetisch sortiert. Aus diesem Grund ist vor Main und Vorlage ein Raute-Symbol – dadurch werden die Reiter der Sheets auch mit Sortierung immer am Anfang (ganz links) angezeigt.
Wenn ihr die Benennung der Sheets oder das Verhalten anpassen wollt, schaut weiter unten, dort steht wie es geht.

Code

Wer bereits größere Dokumente hat, baut sich den Code vielleicht schneller ein.
Öffnet in Excel den Code-Editor mit ALT+F11 und öffnet aus der linken Explorer-Struktur eure „Übersichtsseite“ (in Klammer stehen immer die Namen eurer Tabellenblätter). Fügt dort folgenden Code ein:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim switchSheetRange As Range, selectedCell As Range
    
    ' ######## EDIT HERE
    Set switchSheetRange = Range("A:A")
    newSheetIfNotExists = True
    useBlueprint = False
    blueprintSheetName = "#Vorlage"
    sortSheets = False
    ' ##################
    
    On Error Resume Next
    If Selection.Count = 1 Then
        If Not Intersect(Target, switchSheetRange) Is Nothing Then
            Set selectedCell = Selection
            If Not IsEmpty(selectedCell.Value) Then
                If SheetExists(selectedCell.Value) Then
                    ThisWorkbook.Sheets(selectedCell.Value).Activate
                ElseIf newSheetIfNotExists Then
                    createOrNot = MsgBox("Arbeitsblatt " & selectedCell.Value & " existiert noch nicht. Erstellen?", 1, selectedCell.Value & " erstellen?")
                    If createOrNot = 1 Then
                        If useBlueprint Then
                            Worksheets(blueprintSheetName).Copy After:=Worksheets(ActiveWorkbook.Worksheets.Count)
                            ActiveSheet.Name = selectedCell.Value
                        Else
                            Sheets.Add After:=Worksheets(ActiveWorkbook.Worksheets.Count)
                            ActiveSheet.Name = selectedCell.Value
                        End If
                        If sortSheets Then
                            Sort_Active_Book
                        End If
                        ThisWorkbook.Sheets(selectedCell.Value).Activate
                    End If
                End If
            End If
        End If
    End If
End Sub

Function SheetExists(SheetName As String, Optional wb As Excel.Workbook)
   Dim s As Excel.Worksheet
   If wb Is Nothing Then Set wb = ThisWorkbook
   On Error Resume Next
   Set s = wb.Sheets(SheetName)
   On Error GoTo 0
   SheetExists = Not s Is Nothing
End Function

Sub Sort_Active_Book()
' via: https://support.microsoft.com/de-de/kb/812386
Dim i As Integer
Dim j As Integer
Dim iAnswer As VbMsgBoxResult
For i = 1 To Sheets.Count
   For j = 1 To Sheets.Count - 1
     If UCase$(Sheets(j).Name) > UCase$(Sheets(j + 1).Name) Then
        Sheets(j).Move After:=Sheets(j + 1)
     End If
   Next j
Next i
End Sub

Ihr seht bereits im EDIT HERE Bereich die anzupassenden Variablen:

Set switchSheetRange = Range("A:A")

gibt den Bereich an, der eure klickbaren Zellen enthält. Wie bekannt sind Spalten mich Buchstaben und Zeilen mit Zahlen benannt. Mögliche Angaben wären:

Range("B:B")

,

Range("C1:C20")

,

Range("1:2")

.

newSheetIfNotExists = [True/False]

– Soll ein neues Tabellenblatt erstellt werden, wenn eins mit dem Namen des geklickten Zelleninhalts noch nicht existiert?

useBlueprint = [True/False]

– Soll beim Erstellen eine Vorlage genutzt werden? Wenn ja,

blueprintSheetName = [True/False]

– Der Sheet-Name eures Vorlagensheets

sortSheets = [True/False]

– Sollen die Sheets nach dem Neuerstellen eines Sheets alphabetisch sortiert werden?

Damit steht die Zellennavigation von der Übersichtsseite zu den Detailseiten. Rückzu wollte ich eine andere Lösung benutzen (die auch einfacher zu machen ist):
excel-tabellenblatter-navigation-sheets-buttonErstellt über die Excel-Entwicklertools (müssen ggf. über „Optionen -> Menüband anpassen“ eingeblendet werden) eine neue Schaltfläche auf der Vorlagenseite – das geht über Entwicklertools -> Einfügen. Daraufhin öffnet sich ein Makrofenster; klickt hier einfach auf „Neu“ und der Code-Editor öffnet sich automatisch und zeigt euch den Code des Buttons an. Fügt hier zwischen den bestehenden zwei Zeilen folgendes ein:

ThisWorkbook.Sheets("#Main").Activate

Wobei natürlich das „#Main“ zum Namen eurer Übersichtsseite umbenannt werden muss.

That’s it! Es müsste nun so funktionieren wie in meinem Video oben gezeigt. Sehr basic, aber u.U. nützlich!

Schreibe einen Kommentar