Tabellenblattnamen in Makros

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
MsgBox
Bild

Betrifft: Tabellenblattnamen in Makros
von: MB12
Geschrieben am: 12.10.2015 09:20:36

Hallo zusammen,
habe zwei Fragen zu Tabellenblattnamen:
Ich habe allen Sheets einer Datei unterschiedliche Namen gegeben (z.B. "BA" oder "IA" für verschiedene Arbeitsphasen). Wenn ich ins Projekt reingehe, sind diese aber in der Reihenfolge des Anlegens mit "Tabelle 1 (BA)" bis "Tabelle 66 (IA)" aufgeführt.
Wenn ich ein Makro allen Sheets von "Tabelle 7" bis "Tabelle 25" zuordnen will, könnte ich dann so arbeiten:
For i = 7 To 25 Worksheets.Count
With Worksheets(i)
oder müsste ich für die verschiedenen Namen einen Platzhalter einfügen? Geht das überhaupt? Sonst müsste ich vermutlich die einzelnen Blattnamen nacheinander aufführen.
Ein kleines Problem dazu: Sheet 13 soll nicht einbezogen werden. Mir fällt nur ein, dieses Blatt zu kopieren und das Original zu löschen. Dann müsste eigentlich diese Kopie automatisch das Sheet 67 sein. Korrekt?
Vielen Dank für Eure Hilfe.
Margarete

Bild

Betrifft: AW: Tabellenblattnamen in Makros
von: fcs
Geschrieben am: 12.10.2015 11:45:27
Hallo Margarete,
du kannst in der Schleife die Namen der Tabellen prüfen und die Tabellen, die nicht bearbeitet werden sollen überspringen.
Gruß
Franz

Sub TabellenBearbeiten()
    Dim intSheet As Integer, wks As Worksheet
    
    For intSheet = 7 To ActiveWorkbook.Worksheets.Count
        Set wks = ActiveWorkbook.Worksheets(intSheet)
        Select Case wks.Name
            Case "Tabelle13", "TabelleXXX" 'name(n) ggf anpassen
                'Diese Tabellen nicht bearbeiten
            Case Else
                With wks
                    'mach was im Tabellenblatt
                End With
        End Select
    Next
End Sub


Bild

Betrifft: AW: Tabellenblattnamen in Makros
von: MB12
Geschrieben am: 12.10.2015 12:35:54
Hi Franz,
danke für die schnelle Lösung. Durch mein rudimentäres VBA-Wissen ist mir einiges trotzdem noch nicht klar. Ich versuche immer, den Grund zu verstehen, damit ich zukünftig ähnliche Aufgaben selbst lösen kann.
1. Heißen meine Tabellenblätter eigentlich immer noch "Tabelle 1" usw. oder aber "Tabelle 1 (BA)" usw oder ist das unwichtig, da der Code einfach mit der 7. Tabelle beginnt? Und hat das mit "intSheet" zu tun?
2. Lassen wir mal das überspringen von Sheet 13 außer acht. Bei meinem Beispiel möchte ich nur die Blätter 7 bis 25 einbeziehen, nicht aber die Blätter ab Blatt 26 bis Blatt 66. Wenn ich deinen Code richtig verstehe, müsste ich mich im Blatt 25 befinden (ActiveWorkbook), um den Code auszuführen. Ist das korrekt?
Danke schön im Voraus
Margarete

Bild

Betrifft: AW: Tabellenblattnamen in Makros
von: fcs
Geschrieben am: 12.10.2015 15:38:30
Hallo Margartete,
1. Heißen meine Tabellenblätter eigentlich immer noch "Tabelle 1" usw. oder aber "Tabelle 1 (BA)" usw oder ist das unwichtig, da der Code einfach mit der 7. Tabelle beginnt? Und hat das mit "intSheet" zu tun?
Deine Blätter heißen wie du es auf den Tabregistern im Excelprorammfenster lesen kannst.
Die index-Zählung beginnt beim linken Tab mit der Nr. 1, dabei werden ausgeblendette Blätter mitgezählt.
"intSheet" ist einfach ein Zähler, der hier in der For-Next-Schleife bei 7 beginnt und beim letzten Blatt endent. Er hat nichts mit den Blattnamen zu tun. Wenn du nur bestimmte Blätter bearbeiten willst, dann kannst du die Namen auch anders prüfen, z.B. ob der Name "(BA)" enthält oder "(IA)"
Intern verwalte Excel die Blätter mit dem sog. Codename.
Wenn du im VBA-Editor den VBA-Projektexplorer anzeigts, dann werden die Blätter in der Reihenfolge der Codenamen gelistet, der Name auf dem Tabregister wird in Klammern angezeigt.
Unter den Eigenschaften der Blätter kannst du den Codenamen -Eigenschaft = (Name)- auch ändern.
2. Lassen wir mal das überspringen von Sheet 13 außer acht. Bei meinem Beispiel möchte ich nur die Blätter 7 bis 25 einbeziehen, nicht aber die Blätter ab Blatt 26 bis Blatt 66. Wenn ich deinen Code richtig verstehe, müsste ich mich im Blatt 25 befinden (ActiveWorkbook), um den Code auszuführen. Ist das korrekt?
Nein. Wenn du die Blätter mit der INDEX-Nr. 7 bis 25 bearbeiten willst, dann muss in der Schleife das Ende des Zählers auf 25 gesetzt werden
For intSheet = 7 to 25
Probiere mal die folgenden Makros. Dann solltes du ein Gefühl bekommen, wie man die Blatt-Bearbeitung steuern kann.
Gruß
Franz

Sub Blattnamen()
    Dim intSheet As Integer, wks  As Worksheet
    
    For intSheet = 1 To ActiveWorkbook.Worksheets.Count
        Set wks = ActiveWorkbook.Worksheets(intSheet)
        If MsgBox("Tabellen-Infos:" & vbLf _
            & "Index-Nr: " & intSheet & vbLf _
            & "Blattname: " & wks.Name & vbLf _
            & "Codename: " & wks.CodeName, _
            vbOKCancel, "Anzeige von Information zu Tabellen") = vbCancel Then
            Exit Sub
        End If
        
    Next
    
End Sub
Sub Blattnamen2()
    Dim intSheet As Integer, wks  As Worksheet
    
    For intSheet = 1 To ActiveWorkbook.Worksheets.Count
        Set wks = ActiveWorkbook.Worksheets(intSheet)
        If InStr(wks.Name, "(IA)") > 0 Or InStr(wksName, "(BA)") > 0 Then
        If MsgBox("Tabellen-Infos:" & vbLf _
            & "Index-Nr: " & intSheet & vbLf _
            & "Blattname: " & wks.Name & vbLf _
            & "Codename: " & wks.CodeName, _
            vbOKCancel, "Anzeige von Information zu Tabellen") = vbCancel Then
                Exit For
        End If
        End If
    Next
    
End Sub


Bild

Betrifft: AW: Tabellenblattnamen in Makros
von: MB12
Geschrieben am: 12.10.2015 16:22:13
Hallo Franz und Matthias,
habe heute viel gelernt von tollen Erklärungen und perfekten Lösungen; meine Fragen sind mehr als beantwortet - ganz herzlichen Dank euch beiden!!

Bild

Betrifft: AW: Tabellenblattnamen in Makros
von: matthias
Geschrieben am: 12.10.2015 12:24:33
Hallo Margarete,

For i = 7 To 25
    If i = 13 Then GoTo Nächste
    With Worksheets(i)
        'Deine Aktionen
    End With
Nächste:
Next i
Bitte bedenke dass bei "Worksheets(i)" i einen Index darstellt, welcher sich an der Reihenfolge der Sheets orientiert und nicht am Code-Namen. So muss "Tabelle66 (IA)" nicht zwingend das 66. Blatt von links sein. Kommt es also vor, dass deine Reihenfolge der Blätter verschoben werden sollte, so kannst du nicht nach obigem Prinzip vorgehen.
Variante 1 wäre alle Blätter durchzugehen und den Codenamen mit einem in ein Schleife stehenden _ Namen zu vergleichen. Dies ist jedoch der langsamste Weg, gerade bei vielen Blättern, da er für jedes Blatt alle i's durchgeht.

Dim wks As Worksheet
For Each wks In ThisWorkbook.Worksheets
    For i = 7 To 25
        If i = 13 Then GoTo Nächste
        If wks.CodeName = "Tabelle" & i Then
            With wks
                'Deine Aktionen
            End With
            Exit For
        End If
Nächste:
    Next i
Next wks
Wesentlich schneller in der Ausführung wäre da jedoch die Code-Namen alle aufzulisten:
Dim wks As Worksheet
For i = 7 To 25
    Select Case i
        Case 7: Set wks = Tabelle7
        Case 8: Set wks = Tabelle8
        Case 9: Set wks = Tabelle9
        '...
        Case 13: GoTo Nächste
        Case 14: Set wks = Tabelle14
        '...
        Case 25: Set wks = Tabelle25
    End Select
    With wks
        'deine Aktionen
    End With
Nächste:
Next i
lg Matthias

Bild

Betrifft: AW: Tabellenblattnamen in Makros
von: matthias
Geschrieben am: 12.10.2015 13:29:23
Ach übrigens kannst du in den Eigenschaften den Code-Namen der Blätter ändern, dazu einfach F4 drücken.
Damit kannst du deine Blätter welche nicht bearbeitet werden sollen anders benennen, Beispielhaft "TB13". Alle anderen lässt du "Tabelle7", "Tabelle8", usw. Dann kannst du für alle Blätter deren Code-Namen mit "Tabelle" beginnen folgendes machen:

For Each wks In Thisworkbook.Worksheets
    If wks.Codename = "Tabelle" & * Then
        With wks
            'deine Aktionen
        End With
    End If
Next wks


 Bild

Beiträge aus den Excel-Beispielen zum Thema "Tabellenblattnamen in Makros"