Also...
23.03.2016 08:57:49
Michael
Morgen Franz!
Zunächst zu Deiner Idee: Ja, es ist problemlos möglich den (Anzeige-)Namen eines Tabellenblattes in einer String-Variablen zu speichern, und den Variablen-Inhalt (Text) dann anderswo dem Worksheets()-Objekt zu übergeben, um ebendieses anzusprechen.
Dennoch aber, und das hab ich gestern schon angedeutet, ist das in Deinem Fall ein Umweg, den Du Dir sparen kannst. Denn...
In Deiner Prozedur btnGCSortNachMonat_Click holst Du Dir bisher (bzw. gem. Deiner Idee) den Namen bzw. CodeNamen der aktiven Tabelle, und übergibst diesen dann Deiner Prozedur GCSort_nachMonat. Das ist insofern unnötig, weil Du die eigentliche Sortier-Prozedur ja gleich immer auf das aktive Tabellenblatt richten kannst; und wenn die Sortierprozedur durch eine Schaltfläche auf dem jeweiligen Tabellenblatt ausgelöst wird, ist dieses Tabellenblatt auch schon aktiv. D.h.
Sub GCSort_nachMonat()
Application.ScreenUpdating = False
'Mit dem jeweils aktiven Tabellenblatt
With ActiveSheet
.Unprotect
.Range("DatenKompl").Sort Key1:=.Range("C3"), Order1:=xlAscending, _
Key2:=.Range("F3"), Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
.Range("B2").Select
.Protect
End With
'Nicht vergessen: Bildschirmaktualisierung wieder einschalten!
Application.ScreenUpdating = True
End Sub
Beachte auch, dass ich Dir in Deinem Code ergänzt habe, dass die Bildschirmaktualisierung wieder eingeschaltet wird, nachdem die Sortierung erfolgt ist!
Mit der Bezugnahme im Sortiermakro auf das aktive Tabellenblatt, ist auch der Umstand erfüllt, den Du hier angesprochen hast:
Es geht aber auch noch darum, dass es mehrere Tabellenblätter gibt, die exakt gleich aufgebaut sind, nur unterschiedliche Werte haben. In diesen Blättern werden exakt diesselben Aktionen aufgerufen, z. B. sortieren eines bestimmten Bereiches. Darum wollte ich nicht für jedes Blatt immer wieder das gleiche Makro irgendwohin kopieren (was ich bis jetzt habe), sondern wollte ein allgemeingültiges Makro für alle Blätter haben.
Falls damit aber gemeint war, dass in Deiner Arbeitsmappe bspw. 10 Tabellenblätter vorhanden sind, von denen wieder um zB 5 den gleichen Aufbau haben und nur diese 5 von dem Sortiermakro erfasst werden sollen, dann musst Du das in eine Schleife packen:
Sub GCSort_nachMonat()
Dim Ws As Worksheet
Application.ScreenUpdating = False
'Durchgehen aller Tabellenblätter dieser Mappe
For Each Ws In ThisWorkbook.Worksheets
Select Case Ws.CodeName
'Bei diesen Tabellenblätter passiert das...
Case Is = "Tabelle1", "Tabelle2", "Tabelle3"
'...was hier folgt
With Ws
.Unprotect
.Range("DatenKompl").Sort Key1:=.Range("C3"), Order1:=xlAscending, _
Key2:=.Range("F3"), Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
.Range("B2").Select
.Protect
End With
'Bei anderen Tabellenblättern passiert nichts...
Case Else
'...wenn hier kein Code folgt
End Select
Next
'Nicht vergessen: Bildschirmaktualisierung wieder einschalten!
Application.ScreenUpdating = True
End Sub
Alles klar?
LG
Michael