Wie Excel-Tabellenreiter automatisch beschriften?

Hallo, ich möchte die Beschriftung der Tabellenreiter automatisch realisieren. Dazu habe ich das VBA-Programm gefunden:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = „c2“ Then Exit Sub
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Worksheets
If ws.Name = Target Then
MsgBox „Dieser Name existiert bereits“
Exit Sub
End If
Next
ActiveSheet.Name = Target
End Sub

Aber der Name wird nur dann in den Reiter von C1 übernommen, wenn man den Namen in der Zelle direkt eingibt.

  1. Wie muss das Programm lauten, wenn die Zelle C1 einen Formelbezug hat, so dass der Name eigentlich aus einer anderen Zelle eines anderen Tabellenblatt stammt?

2.Da Zelle C1 auch leer sein kann, möchte ich in einer Schleife in das Programm die Abfrage mit der Bedingung einfügen, wenn leer, dann soll das Tabellenblatt „leer“ heißen. Diese Schleife erübrigt sich, wenn 1. möglich ist, denn dann kann ich dort die Abfrage über die Wenn-Funktion absichern.
Leider gehen meine VBA-Kenntnisse gegen Null.
Vielen Dank im vorraus.

Hallo

Beschreibe doch mal, was Du genau willst! Das Makro, das Du hier aufführst, macht folgendes:
Wenn Du in der Tabelle, für die dieses Makro gilt, in irgendeiner Zelle ausser in C2 etwas eingibst, wird der Name der Tabelle jedes mal geändert. Das willst Du sicher nicht, oder?

wenn leer, dann soll das Tabellenblatt „leer“

Das ginge so:

If IsEmpty(Target) Then
    ActiveSheet.Name = "leer"
Else
    ActiveSheet.Name = Target
End If

Aber das funkt nur, wenn Du in einer leeren Zelle die Tasten F2 und dann RETURN drückst. - Das gleiche gilt für einen Formelbezug: Du gibst die Formel ein und machst RETURN, dann wird Deine Tabelle umbenannt.

Ich überlege mir gerade: Willst Du etwa folgendes machen: Der Name der aktiven Tabelle soll so lauten wie der Inhalt der Zelle C1? - Dann würde ich das mit Doppelklick erledigen

Private Sub Worksheet_BeforeDoubleClick _
    (ByVal Target As Range, Cancel As Boolean)

Also: Verrate mal, was Du genau willst. Dann „werden Sie geholfen“.

Hallo Herr Wurthberg,
Großen Dank für die rasche Antwort. Leider musste ich kurzfristig Verreisen, so dass ich momentan nicht an meiner Excel-Tabelle sitzen kan, um die Vorschläge auszuprobieren.
Was will ich genau? Es ist eine Tabelle mit 23 Tabellenblättern. In der 1.Tabelle (Teili) werden in B2 bis B23 die Namen der Teilnehmer eingetragen. Dann gibt es für jeden Teilnehmer ein Tabellenblatt. Dort steht in jedem C2 der Name des Teilnehmers, also +Teili!B2… Von diesem C2 soll dann automatisch die Beschriftung des Tabellenreiters erfolgen, wenn in „Teilung“ der Name eingetragen wird. Da es aber auch weniger als 22 Teilnehmer sein können, soll die Prozedur abfragen, ob C2 einen Namen enthält. Wenn nicht, dann soll der Reiter den Namen „A“…„V“ erhalten.
Alternativ könnte aber auch nur die automatische Namensübergabe von C2 in den Reiter erfolgen. Dann müsste ich in Zelle C2 schreiben +wenn(Teili!B2="";„A“:Teili!B2). Diese Formel müsste aber auch hier automatisch übertragen werden können.
Da der Anwender keine großen in Excel hat, sollten keine zusätzlichen Tastenkombinationen zur Datenübertragung notwendig sein.
Ich hoffe, damit Klarheit in mein Anliegen gebracht zu haben.
Herzlichen Gruß
Remedium

Hallo Herr Wurthberg,
Größen Dank für die rasche Antwort. Leider musste ich kurzfristig Verreisen, so dass ich momentan nicht an meiner Excel-Tabelle sitzen kann und die Vorschläge auszuprobieren.
Was will ich genau? Es ist eine Tabelle mit 23 Tabellenblättern. In der 1.Tabelle (Teili) werden in B2 bis B23 die Namen der Teilnehmer eingetragen. Dann gibt es für jeden Teilnehmer ein Tabellenblatt. Dort steht in jedem C2 der Name des Teilnehmers, also +Teili!B2… Von diesem C2 soll dann automatisch die Beschriftung des Tabellenreiters erfolgen, wenn in „Teilung“ der Name eingetragen wird. Da es aber auch weniger als 22 Teilnehmer sein können, soll die Prozedur abfragen, ob C2 einen Namen enthält. Wenn nicht, dann soll der Reiter den Namen „A“…„V“ erhalten.
Alternativ könnte aber auch nur die automatische Namensübergabe von C2 in den Reiter erfolgen. Dann müsste ich in Zelle C2 schreiben +wenn(Teili!B2="";„A“:Teili!B2). Diese Formel müsste aber auch hier automatisch übertragen werden können.
Da der Anwender keine großen in Excel hat, sollten keine zusätzlichen Tastenkombinationen zur Datenübertragung notwendig sein.
Ich hoffe, damit Klarheit in mein Anliegen gebracht zu haben.
Herzlichen Gruß
Remedium

Hallo Herr Wurthberg,
Größen Dank für die rasche Antwort. Leider musste ich kurzfristig Verreisen, so dass ich momentan nicht an meiner Excel-Tabelle sitzen kann und die Vorschläge auszuprobieren.
Was will ich genau? Es ist eine Tabelle mit 23 Tabellenblättern. In der 1.Tabelle (Teili) werden in B2 bis B23 die Namen der Teilnehmer eingetragen. Dann gibt es für jeden Teilnehmer ein Tabellenblatt. Dort steht in jedem C2 der Name des Teilnehmers, also +Teili!B2… Von diesem C2 soll dann automatisch die Beschriftung des Tabellenreiters erfolgen, wenn in „Teilung“ der Name eingetragen wird. Da es aber auch weniger als 22 Teilnehmer sein können, soll die Prozedur abfragen, ob C2 einen Namen enthält. Wenn nicht, dann soll der Reiter den Namen „A“…„V“ erhalten.
Alternativ könnte aber auch nur die automatische Namensübergabe von C2 in den Reiter erfolgen. Dann müsste ich in Zelle C2 schreiben +wenn(Teili!B2="";„A“:Teili!B2). Diese Formel müsste aber auch hier automatisch übertragen werden können.
Da der zukünftige Anwender keine großen in Excel hat, sollten keine zusätzlichen Tastenkombinationen zur Datenübertragung notwendig sein.
Ich hoffe, damit Klarheit in mein Anliegen gebracht zu haben.
Herzlichen Gruß
Remedium

Sub Frage1()
ccc = Array(72, 97, 115, 116, 32, 106, 101, 116, 122, _
    116, 32, 90, 101, 105, 116, 32, 103, 101, 102, 117, _
    110, 100, 101, 110, 63)
For i = 0 To UBound(ccc)
ttt = ttt & Chr(ccc(i))
Next i
MsgBox ttt
End Sub
Sub Test()
ccc = Array(74, 97, 44, 32, 109, 97, _
    99, 104, 39, 115, 32, 109, 97, 108, 33)
For i = 0 To UBound(ccc)
ttt = ttt & Chr(ccc(i))
Next i
MsgBox ttt
End Sub
Sub Frage2()
ccc = Array(65, 98, 101, 114, 32, 101, 114, 32, _
    104, 97, 116, 32, 71, 114, 117, 110, 100, 107, _
    101, 110, 110, 116, 110, 105, 115, 115, 101, _
    32, 105, 110, 32, 69, 120, 99, 101, 108, 63)
For i = 0 To UBound(ccc)
ttt = ttt & Chr(ccc(i))
Next i
MsgBox ttt
End Sub

Versuch das mal:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = „c2“ Then Exit Sub
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Worksheets
If ws.Name = Target Then
MsgBox „Dieser Name existiert bereits“
Exit Sub
End If
Next
'hier ändern und testen:
'ActiveSheet.Name = Target
'das zu ändernde sheet ist ws und nicht das aktive
ws.Name = Target
End Sub

fg

Dirk_P

wo soll ich das einbauen?

auch hier, wo soll ich das einbauen?

die test funktionieren nicht, es gibt keine reaktion

Hallo,

nun bin ich wieder an meinem Arbeitsplatz und kann testen. Es ist mit peinlich, dass ich mit der 1. Prozedur in meiner Anfrage die Frage verkompliziert habe. Tatsächlich wird der Reitername aus jeder Zelle außer C2 geändert. Ich hatte mich bei damaligen Test gefreut, dass sich der Reitername überhaubt ändert.

Trotden oder gerade deswegen vielen Dank für die Hilfe und Entschuldigung. Die vorgeschlagenen Prozeduren habe ich getestet, aber die führten nicht zum gewünschten Ergebnis bzw. zeigten keine Reaktion.

Nun steh ich wieder am Anfang. Wie ich in meiner nachträglichen Fallgestaltung geschrieben habe, soll sich die Zelle C2 in jedem Tabellenblatt ändern, wenn sich im Tabellenblatt Teili der Name ändert. Dabei soll die Prüfung vorgenommen werden, ob die Zelle leer ist. Die Prüfung, ob sich der Name des Tabellenblatt doppelt, habe ich aus dem Beispiel einfach übernommen, spielt aber in meiner Fallgestaltung keine Rolle und kann eigentlich raus.

Mit netten Gruß
Remedium

So, jetzt mal in Ruhe:

Sub Worksheet_Change()

Dim ws As Worksheet

'If Target.Address = "c2" Then Exit Sub

For Each ws In ActiveWorkbook.Worksheets
    If ws.Cells(2, 3).Value <> "" Then
        If ws.Name <> "Teili" And Not sheetExists(ws.Cells(2, 3).Value) Then
            ws.Name = ws.Cells(2, 3).Value
        End If
    End If
Next

End Sub
Function sheetExists(nameToFind)

Dim ws As Worksheet

sheetExists = False

For Each ws In ActiveWorkbook.Worksheets
    If UCase(ws.Name) = UCase(nameToFind) Then sheetExists = True
Next

End Function

sofern in c2 des umzubenennenden Sheets etwas steht und kein Sheet mit dem Namen da ist, wird es umbenannt.

Teste mal.

fg

Dirk_P

Hallo Dirk_P,
es passiert gar nichts.
Gruß
Remedium

Was ist denn gar nichts?

Du startest aus dem Workbook deiner Wahl die Sub Worksheet_Change und dann sollte es laufen. (Bei mir ging es)

Gehe mal in den Code in die Zeile
For Each ws In ActiveWorkbook.Worksheets

Drücke F9 (Zeile sollte jetzt rot hinterleg sein)
Starte die Routine (F5) und gehe mit F8 Schritt für Schritt weiter.
Welche Teile des Codes werden abgearbeitet?

Nur um das noch einmal klar zu stellen: Voraussetzungen das was passiert sind:
Das Sheet hat nicht den Namen „Teili“
In C2 des jeweiligen Sheets steht ein Name
Es gibt noch kein Sheet mit dem Namen aus C2

fg

Dirk_P

Hallo Dirk_P,
vielen Dank für Deine Antwort.
Sofort beim Start kommt die Meldung: Fehler beim Komilieren.
Die Voraussetzungen habe ich geprüft und sie sind eingehalten.

fg
Remedium

ok.

Lege in der Datei ein Modul an: Rechte Maustaste über dem Dateinamen, Einfügen -> Modul.
Verschiebe den Code dahin, der darf nämlich nicht „in“ dem Sheet liegen.

Dann kompilieren und starten.

fg

Dirk_p

Dallo Dirk _P,
jetzt funzt es. Allerdings nicht automatisch. Nun bin ich bei der Aufgabenstellung davon ausgegangen, dass ich eine Prozedur nur in die Sheets lege, die automatisch umbenannt werden. Es ergibt sich, dass noch Sheets dazukonmmen, die nicht umbenannt werden dürfen und das Feld C2 anderweitig belegt ist. Diese würden jetz auch umbenannt.
Lässt sich da was machen?
Gruß
Remedium

Angenommen, es sind drei Sheets, die nicht umbenannt werden dürfen, und diese Sheets heissen: „Summe“, „Total“ und „Betrag“. Dann musst ganz am Anfang des Makros - nach Sub Worksheet_Change() -folgende Zeilen einfügen:

asn = ActiveSheet.Name
If asn = "Summe" Or asn = "Total" Or asn = "Betrag" Then Exit Sub

Bei diesen drei Tabellen geschieht dann nichts.

Grüsse Niclaus