1.2k Aufrufe
Gefragt in Tabellenkalkulation von
Hallo zusammen,

ich habe folgenden Code um mehrere Tabellenblätter zu markieren:

    Sheets(Array("Name1", "Name2", "Name3", "Name4")).Select

Das funktioniert soweit auch bestens, bist der Blattname von "Name4" geändert wird, denn dann
wird dieses Blatt nicht mehr gefunden und das produziert einen Fehler/Abbruch.

Gibt es die Möglichkeit, das Tabellenblatt "Name4" anders anzusprechen, um es zu markieren?

Liebe Grüße

Peter

8 Antworten

0 Punkte
Beantwortet von beverly_ Experte (3.3k Punkte)

Hi Peter,

du kannst sie über ihren Index ansprechen:

    Sheets(Array(1, 2, 3, 4)).Select

Du musst dabei aber bedenken, dass der Index unabhängig vom Namen des Blattes ist - wenn also das Blatt mit dem Index 4 an die 6.Position verschoben wird, dann wird Blatt 5 zu Blatt 4, Blatt 6 zu Blatt 5 und Blatt 4 zu Blatt 6.

Bis später, Karin

0 Punkte
Beantwortet von
Hallo Karin,

phantastisch! :-D

... und so einfach! (Ich hatte mit den merkwürdigsten Schreibweisen experimentiert, anstatt einfach mal "nur" eine Zahl einzugeben)

Ein echter Stirnklatscher eben...  ;-)

Lassen sich die Blätter eigentlich gegen Verschieben und/oder Löschen schützen?

Liebe Grüße

Peter
0 Punkte
Beantwortet von beverly_ Experte (3.3k Punkte)

Hi Peter,

Zitat: Lassen sich die Blätter eigentlich gegen Verschieben und/oder Löschen schützen?

Ja, indem du die Arbeitsmappe insgesamt schützt.

Bis später, Karin

0 Punkte
Beantwortet von
Hi Karin,

die gesamte Arbeitsmappe zu schützen ist hier kontraindiziert.
Ich werde schon einen Weg finden, und wenn ich über Code die Blattnamen einzeln abfrage und vergleiche, irgendsowas  ;-)

Trotzdem danke.

LG

Peter
0 Punkte
Beantwortet von beverly_ Experte (3.3k Punkte)

Hi Peter,

wenn die Tabelle umbenannt wird, dann nützt dir ihr Name nichts. Aber du kannst den Codenamen der Tabelle verwenden. Codenamen könne nicht so ohne weiteres geändert werden im Gegensatz zu den Tabellennamen - man muss dazu nämlich in den VBA-Editor gehen, und das tut "Otto Normaverbraucher" sicher weniger.

Du kannst außerdem verhindern, dass der Code zum Selektieren der Tabellenblätter auf einen Fehler läuft, wenn du sie in einer Schleife durchläufst und dabei die gewünschten in ein Array schreibst:

Sub TabsAuswaehlen()
    Dim wksTab As Worksheet
    Dim arrTabs()
    Dim lngZaehler As Long
    For Each wksTab In Worksheets
        Select Case wksTab.CodeName
            Case "Tabelle1", "Tabelle2", "Tabelle3"
                ReDim Preserve arrTabs(0 To lngZaehler)
                arrTabs(lngZaehler) = wksTab.Name
                lngZaehler = lngZaehler + 1
        End Select
    Next wksTab
    If arrTabs(0) <> "" Then Worksheets(arrTabs()).Select
End Sub

Falls ein Tabellenblatt nicht vorhanden ist wird es einfach nicht mit ins Array geschrieben.


Bis später, Karin

0 Punkte
Beantwortet von peters Mitglied (460 Punkte)
Guten Morgen Karin,

mit Arrays blicke ich absolut nicht durch, da verstehe ich nicht wirklich, was Dein Code da genau im Einzelnen macht.

Die Auswahl über die Codenamen habe ich in meinen Code zu integrieren versucht, habe aber keine Schreibweise gefunden, die nicht unweigerlich einen Fehler produziert hat.

LG

Peter
+1 Punkt
Beantwortet von beverly_ Experte (3.3k Punkte)

Hi Peter,

hier der Code nochmal mit Kommentaren:

Sub TabsAuswaehlen()
    Dim wksTab As Worksheet
    Dim arrTabs()
    Dim lngZaehler As Long
    ' Schleife über alle Tabellenblätter
    For Each wksTab In Worksheets
        ' Auswahl entsprechend Codename des laufenden Blattes
        Select Case wksTab.CodeName
            ' Codenamen der Blätter die berücksichtigt werden sollen
            Case "Tabelle1", "Tabelle2", "Tabelle3"
                ' erweitere das Array von Feld 0 bis laufenden Zähler
                ' und behalte dabei die bereits eingelesenen Inhalte bei
                ReDim Preserve arrTabs(0 To lngZaehler)
                ' in laufendes Arrayfeld den Namen vom Reiter des Blattes eintragen
                arrTabs(lngZaehler) = wksTab.Name
                ' Zähler um 1 erhöhen
                lngZaehler = lngZaehler + 1
        End Select
    Next wksTab
    ' erstels Arrayfeld ist nicht leer, also wurden Blattnamen eingetragen
    ' deshalb können die im Array enthaltenen Blätter selektiert werden
    If arrTabs(0) <> "" Then Worksheets(arrTabs()).Select
End Sub

In der Zeile ReDim Preserve arrTabs(0 To lngZaehler) wird das Array immer wieder neu dimensioniert, d.h. es wird in jedem Schleifendurchlauf um jeweils 1 Feld erweitert, wobei die Inhalte der bereits belegten Felder erhalten bleiben - dies bewirkt der Parameter Preserve (=bewahre). Im 1. Schleifendurchlauf wird das Array von 0 bis 0 dimensioniert (1. Arrayfeld ist standardmäßig immer das 0. Feld) und dann der Name des laufenden Blattes eingetragen. Beim 2. Schleifendurchlauf wird das Array von 0 bis 1 dimensioniert, erhält also ein weiteres Feld in das der Name des nächsten laufenden Blattes eingetragen wird das der Case-Bedingung entspricht. Beim 3. Durchlauf wird das Array von 0 bis 2 dimensioniert, hat nun also 3 Felder und das 3. Blatt welches der Bedingung entspricht wird eingetragen. Das Array wird immer nur dann im ein Feld erweitert, wenn ein Blattname den festgelegten Codenamen entspricht.

Ich bin davon ausgegangen, dass mehr als nur die zu selektierenden Blätter in der Mappe vorhanden sind. Der Code macht also nicht anderes als dynamisch alle Blattnamen in das Array einzutragen, welche der im Case festgelegten Bedingung entsprechen.

Bis später, Karin

0 Punkte
Beantwortet von peters Mitglied (460 Punkte)
Hallo Karin,

das hast Du sehr verständlich beschrieben. Danke!
Das habe nun sogar ich (!) verstanden  :-)

LG
Peter
...