Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1480to1484
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Nummer der Tabelle, nicht Name

Nummer der Tabelle, nicht Name
22.03.2016 15:59:25
Franz
Hallo Fachleute,
mit 'activesheeet.name' kann man den Namen einer Tabelle auslesen, so wie er auf dem Reiter unten steht.
Gibt es auch eine Möglichkeit, "Tabelle" & Nummer der Tabelle zu ermitteln, so wie sie unter 'Microsoft Excel Objekte' im VBA-Editor steht? Also die Tabelle "Daten" ist z. B. "Tabelle1". Ist das möglich?
Danke schonmal und Grüße
Franz

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Nummer der Tabelle, nicht Name
22.03.2016 16:03:07
Michael
Hallo!
Da hast Du verschiedene Möglichkeiten, schau mal:
Sub TabAnsprechen()
With ActiveSheet
Debug.Print .Name 'Name des Blattes auf dem Reiter
Debug.Print .CodeName 'Name des Blattes im VBE
Debug.Print .Index 'Position des Blattes in der Mappe
End With
End Sub
LG
Michael

AW: Nummer der Tabelle, nicht Name
22.03.2016 16:06:07
Franz
Hallo Michael,
super, danke! Bei Index war ich auch schon, und hab nicht verstanden was ich als Ergebnis bekam. Jetzt isses klar. Und 'codename' war das was ich gesucht haben.
besten Dank und Grüße
Franz

Gerne, Danke für die Rückmeldung owT
22.03.2016 16:07:52
Michael

bitte um weitere Nachhilfe
22.03.2016 16:34:29
Franz
Hallo Michael,
darf ich Dich nochmal und Deine Hilfe bitten.
Der Codename wird in eine Variable eingelesen, damit soll weitergearbeitet werden. Soweit ich's bis hierher kapiert habe, muss das eine Objektvariable sein:
Sub test()
Dim strTb As Object
set strTb = activesheet.codename
strTb.unprotect
End Sub

Das geht aber nicht so, es heißt "Objekt erforderlich." Es liegt wohl daran, dass ich der Variablen nur einen Namen zuweise, oder .........?
Kannst Du mir da bitte helfen, was ich da machen muss.
Danke schonmal und Grüße
Franz

Anzeige
AW: bitte um weitere Nachhilfe
22.03.2016 16:41:43
Michael
Hallo Franz!
Also... erstmal langsam, sonst überholst Du Dich selbst.
Aus Deinem Code lese ich, dass Du den Blattschutz eines bestimmten Blattes aufheben willst. Offenbar gehst Du davon aus, dass dieses Blatt unterschiedlich benannt sein könnte, und möchtest deshalb das Blatt über seinen CodeNamen ansprechen. Richtig?
Ein Tabellenblatt ist bereits ein Objekt; Du kannst das Aufheben des Blattschutzes dann bspw. so formulieren (Angenommen das gewünschte Blatt hat den Namen "Testdaten" und den CodeNamen "Tabelle1")
Tabelle1.Unprotect 'Über CodeName ansprechen
Worksheets("Testdaten").Unprotect 'Über Blatt-Name ansprechen
Dafür allein musst Du noch nichts in irgendwelche Variablen einlesen.
Was Du aber in Deinem Code machst ist doppelt falsch; erstens, weil Du die Variable grds. nicht brauchst (wie oben beschrieben) und zweitens weil Du das aktive Blatt ansprichst - da ist dann aber egal welchen Namen oder CodeNamen dieses Blatt hat - es wird allein durch seine Eigenschaft als aktives Blatt gewählt - auch dann würde aber reichen
ActiveSheet.Unprotect
Im Übrigen: Falls die jeweiligen Blätter einen Blattschutz mit Passwort aufweisen, wird die Unprotect-Methode fehlschlagen, wenn Du kein Passwort als Parameter mitübergibst.
LG
Michael

Anzeige
AW: bitte um weitere Nachhilfe
22.03.2016 16:59:01
Franz
Hallo Michael,
dann im Detail. Das mit dem Blattschutz war nur ein Beispielschnippsel aus dem Ganzen. Und ja, es ist richtig, dass sich der Tabellenname ändern kann.
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. Bei jedem Aufruf wird die Variable übergeben:
Private Sub btnGCSortNachMonat_Click()
Dim strTb as Object
Set strTb = ActiveSheet.CodeName
Call GCSort_nachMonat(strTb)
End Sub

Sub GCSort_nachMonat(strTb)
Application.ScreenUpdating = False
With strTb
.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
End Sub
Auch wird z. b. dieses SortierMakro von außerhalb aufgerufen, nicht aus dem Blatt selbst. Weil sich die Namen ändern, kann ich in diesem Fall z. B. die Variable "Tabelle4" an das Sortiermakro übergeben. Der Tabellenname selbst steht nicht sicher fest.
Das ist der grund, warum ich diesen Weg versuche. Ich hoffe, ich hab's gscheit erklärt........
Dass ich auch das mit dem benamten Bereich .Range("DatenKompl") ändern muss, ist mir bewusst.
Grüße
Franz
P.S.: strTb heißt die Variable (noch), weil ich es anfangs as String-V. versucht haben :-(((

Anzeige
Ui... Da müssen wir tiefer gehen...
22.03.2016 17:09:47
Michael
Franz,
:-)... Aber ich muss heute schon weg von der Maschine!
Schau ich mir morgen im Lauf des Tages an, ok?
LG
Michael

AW: Ui... Da müssen wir tiefer gehen...
22.03.2016 17:35:30
Franz
Hallo Michael,
sorry, ich musste auch grad weg. Und ja danke, ich freu mich morgen von Dir zu hören.
Schönen Abend
Franz

Idee......!
22.03.2016 17:56:17
Franz
Hallo Michael,
mir ist jetzt noch ne geniale (?) Idee gekommen, die glaub ich gut funktionieren müsste:
dim strTb as string
Die strVariable aus dem Blatt aufgerufen geht mit: strTb = ActiveSheet.Name
Von auswärts aufgerufen mit: strTb = Tabelle4.Name
Im Folgemakro isses dann ja wieder so möglich: With Worksheets(strTb).........
Beim Nachdenken und ersten Testen fällt mir jetzt noch nichts ein, wo das haken könnte. Mal schaun, ob ich bis morgen noch über irgendwas stolper.
Das sollte doch sicher sein? Was meinst Du?
Grüße
Franz

Anzeige
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

Anzeige
@ michael(migre)
23.03.2016 09:37:28
Rudi
Hallo,
Beachte auch, dass ich Dir in Deinem Code ergänzt habe, dass die Bildschirmaktualisierung wieder eingeschaltet wird, nachdem die Sortierung erfolgt ist!
Unnötig. Erfolgt automatisch mit Beendigung der Prozedur. Schadet aber auch nicht.
Gruß
Rudi

@ Rudi: Danke, aber...
23.03.2016 09:45:52
Michael
...ich hab mich da bisher an die MS Entwicklerhilfe gehalten, die dazu meint
Sie können die Geschwindigkeit Ihres Makros erhöhen, indem Sie die Bildschirmaktualisierung deaktivieren. Allerdings können Sie dann das Makro nicht mehr am Bildschirm mitverfolgen.
Denken Sie daran, die ScreenUpdating-Eigenschaft nach Beendigung des Makros auf True zurückzusetzen.

Danke für den Hinweis! Schönen Tag
Michael

Anzeige
AW: Also...
23.03.2016 09:43:05
Franz
Hallo Michael,
vielen Dank für Deine Antwort! Das mit Case ist gut. Und ja, das mit Activesheet klappt immer dann, wenn aus dem aktiven Blatt heraus angerufen wird. Aber in Deinem jetzigen Beispiel ist jetzt auch berücksichtigt, dass die Prozedur von auswärts aufgerufen werden kann. UND dass die Blattnamen veränderlich sind. Wunderbar!
Application.ScreenUpdating = True lass ich meistens weg, weil sich am Ende aller Prozeduren der Bildschirm eh immer aktualisiert, so wie ich das sehe.
Danke und Grüße
Franz

Gerne und...
23.03.2016 09:47:59
Michael
Hallo Franz
...freut mich, dass es klappt und Dir hilft. Bzgl. Application.ScreenUpdating = True lass ich meistens weg, weil sich am Ende aller Prozeduren der Bildschirm eh immer aktualisiert, so wie ich das sehe.
...siehe meine Antwort an Rudi.
LG
Michael
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige