Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
604to608
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
604to608
604to608
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Tabellenblattnamen als Variablen
27.04.2005 07:05:55
TZ
Guten Morgen allerseits!
Habe wiedermal eine Frage:
Ich habe etliche Tabellen in einer Excel-Anwendung - diese haben z.B. die Namen A, B, C,...
Nun habe ich eine "Haupttabelle" in welcher diese Tabellennamen aufgelistet sind. Ich habe nun hinter jedem Tabellennamen in der Haupttabelle eine "durchsichtige" rechteckige Fläche gezeichnet und rufe mit einem Makro z.B. Makro A bei Tabellennamen A auf.
Nachteil: Wenn eine neue Tabelle hinzugefügt wird, muss ich jedesmal ein neues Makro schreiben - für den neuen Tabellennamen. Das scheint mir sehr kompliziert - könnte ich da nicht irgendwie die Tabellennamen als Variablen einlesen. Das Makro hat immer dieselbe Funktion.
Im weiteren möchte ich wissen, wie ich im Autostart ein Makro erstelle, welches alle Tabellenblätter "unsichtbar" (visible) macht - die Haupttabelle muss jedoch angezeigt bleiben.
Besten Dank für Eure Anregungen
Viele Grüsse
TZ

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

Betreff
Datum
Anwender
Anzeige
Inhaltsverzeichnis
27.04.2005 07:15:45
Erich
Hallo TZ (?),
so mach ich mein Inhaltsverzeichnis:
Option Explicit
Sub inhaltsverzeichnis_erstellen()
'Inhaltsverzeichnis aller Tabellenblätter
'im erten Tabellenblatt ab Zeile A1 einfügen
Dim Blatt As Object
Dim zeile As Double
Dim NewSheet As Worksheet
Dim i As Integer
zeile = 3
'Fehlerhandling
On Error Resume Next
'Abfrage unterdrücken
Application.DisplayAlerts = False
Application.ScreenUpdating = False
'Sheet Inhaltsverzeichnis auf jeden Fall löschen
Sheets("Inhaltsverzeichnis").Delete
'Neues Tabellenblatt mit dem Namen Inhaltsverzeichnis hinzufügen
Set NewSheet = Worksheets.Add
NewSheet.Name = "Inhaltsverzeichnis"
Sheets("Inhaltsverzeichnis").Move Before:=Sheets(1) ' = Tabellenblatt als erstes
'Überschrift Einfügen und formatieren
With Sheets("Inhaltsverzeichnis").Range("A1")
.Value = "Inhaltsverzeichnis"
.Font.Name = "Arial"
.Font.Size = "18"
.Font.Bold = True
.Font.ColorIndex = 6
.Interior.ColorIndex = 5
.Interior.Pattern = xlSolid
.Interior.PatternColorIndex = xlAutomatic
.Font.Underline = xlUnderlineStyleSingle
End With
With Cells(1, 2)
.Font.Name = "Arial"
.Font.Size = "18"
.Font.Bold = True
.Font.ColorIndex = 6
.Interior.ColorIndex = 5
.Interior.Pattern = xlSolid
.Interior.PatternColorIndex = xlAutomatic
End With
With Cells(1, 3)
.Font.Name = "Arial"
.Font.Size = "18"
.Font.Bold = True
.Font.ColorIndex = 6
.Interior.ColorIndex = 5
.Interior.Pattern = xlSolid
.Interior.PatternColorIndex = xlAutomatic
End With


With Cells(2, 1)
.Value = "sortiert nach Blatt-Nr."
.Font.Name = "Arial"
.Font.Size = "16"
.Font.Bold = True
.Font.Underline = xlUnderlineStyleSingle
End With
With Cells(2, 5)
.Value = "alphabetisch sortiert"
.Font.Name = "Arial"
.Font.Size = "16"
.Font.Bold = True
.Font.Underline = xlUnderlineStyleSingle
End With
'Laufende Blattnummerierung + Blattname einfügen
For Each Blatt In Sheets
Sheets("Inhaltsverzeichnis").Cells(zeile, 1).Value = "Blatt " & zeile - 2
Sheets("Inhaltsverzeichnis").Cells(zeile, 2).Value = Blatt.Name
Sheets("Inhaltsverzeichnis").Hyperlinks.Add Anchor:=Cells(zeile, 2), Address:="", SubAddress:="'" & _
Blatt.Name & "'!A1", TextToDisplay:=Blatt.Name
zeile = zeile + 1
Next Blatt
ActiveSheet.Columns("B:B").EntireColumn.AutoFit
'Kopiere die zwei erstellten Spalten und sortiere Hyperlinks
Range("A3", Range("B65536").End(xlUp)).Select
Selection.Copy
Range("D3").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Range("D3", Range("E65536").End(xlUp)).Select
Selection.Sort Key1:=Range("E3"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
ActiveSheet.Columns("D:E").EntireColumn.AutoFit
ActiveWindow.DisplayGridlines = False
Range("A3").Select
ActiveWindow.FreezePanes = True
Cells(1, 4).Select
'Userform ausblenden
'frmInhaltsverz.Hide
'Ursprungszustand wieder herstellen
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

mfg
Erich
EXCEL-Shareware und Freeware: http://www.toolex.de
EXCEL und Lottogewinne machen glücklich: http://48678.rapidforum.com
Anzeige
AW: Inhaltsverzeichnis
27.04.2005 07:39:44
TZ
Guten Morgen Erich
Besten Dank für Deine Anregung - ich brauche eher etwas einfaches. Das Inhaltsverzeichnis muss nicht selbständig erstellt werden. Da ich so oder so ein neues Tabellenblatt erstellen muss ist es für mich einfach, auch den Namen in die Haupttabelle zu schreiben. Mein Problem ist nur, dass ich jedesmal das gleiche Makro mit dem neuen Verweis zum Tabellennamen schreiben muss.
Vielleicht hast Du noch eine andere Lösung?
Auf jedenfall besten Dank!
Gruss TZ
Besten Dank!
Gruss TZ
AW: Tabellenblattnamen als Variablen
27.04.2005 08:17:23
Kurt
hi,
probier mal
das auswählen der jeweiligen tabelle über doppelklick
in das klassen modul der tabelle "Inhaltsverzeichnis":
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean) If Target.Column = 1 And Target.Value <> "" Then Sheets(Target.Cells.Value).Visible = True Sheets(Target.Cells.Value).Select End If End Sub
zum erstellen des inhaltsverzeichnisses und ausblenden der anderen tabellen
in das klassen modul der tabelle "Inhaltsverzeichnis":
Sub Inhaltsverzeichnis()
Dim I As Integer
For I = 1 To Worksheets.Count
If Worksheets(I).Name "Inhaltsverzeichnis" Then
Cells(I, 1) = Worksheets(I).Name
Worksheets(I).Visible = xlVeryHidden
End If
Next I
End Sub
zum ausblenden der ausgewählten tabelle beim rücksprung zum inhaltsverzeichnis
in das klassenmodul der arbeitsmappe:

Private Sub Workbook_SheetdeActivate(ByVal Sh As Object)
If Sh.Name <> "Inhaltsverzeichnis" Then
Worksheets(Sh.Name).Visible = xlVeryHidden
End If
End Sub

...und Tschüss Kurt
Anzeige
AW: Tabellenblattnamen als Variablen
27.04.2005 09:42:47
Boris
Hi,
am Einfachsten liest du die "TopLeftCell"-Eigenschaft des aufrufenden Buttons aus und übergibst den Wert der linken Nachbarzelle an die Hauptprozedur.
Option Explicit

Sub aufruf()
Call welche_tabelle(Range(ActiveSheet.Shapes(Application.Caller).TopLeftCell.Address).Offset(0, -1).Text)
End Sub


Sub welche_tabelle(Blattname As String)
MsgBox "Sie haben die Tabelle " & Blattname & " ausgewählt", 64, "Gebe bekannt..."
End Sub

Also: Jedem Button einfach die Prozedur "aufruf()" zuweisen - der Rest ergibt sich dann von selbst.
Grüße Boris
Anzeige
Sorry - war etwas zu umständlich...
27.04.2005 09:46:42
Boris
Hi,
...denn die TopLeftCell-Eigenschaft gibt ja ein Range-Objekt zurück. Demzufolge ist das Auslesen der Adresse und Rückgabe an die Range-Eigenschaft einfach nur Blödsinn ;-) (wenngleich es natürlich auch funktioniert):
Option Explicit

Sub aufruf()
Call welche_tabelle(ActiveSheet.Shapes(Application.Caller).TopLeftCell.Offset(0, -1).Text)
End Sub


Sub welche_tabelle(Blattname As String)
MsgBox "Sie haben die Tabelle " & Blattname & " ausgewählt", 64, "Gebe bekannt..."
End Sub

Grüße Boris
Anzeige
AW: Sorry - war etwas zu umständlich...
27.04.2005 12:45:40
TZ
Hallo Boris
Bitte entschuldige die Verspätung - bin am Rest des Tages am Arbeiten.
Also - irgendwie läuft das Makro nicht, ich weiss auch nicht warum.
Kenne mich nicht so aus in der Makroerstellung, deshalb ist es für mich schwierig zu sagen warum.
Ich habe jetzt eine Versuchstabelle aufgebaut - mit dem Namen x.
Habe drei weitere Tabellen mit den Namen a, b, c.
In der Tabelle x befindet sich in der Zelle C25 ein a, in der Zelle C26 ein b, in der Zelle C27 ein c - in jeder dieser drei Zellen habe ich ein durchsichtiges Rechteck.
Wenn ich jetzt auf das Rechteck in Zelle C25 (a) drücke, müsste die Tabelle a ausgewählt werden und das Standardmakro ausgeführt werden.
Nun könnte ich jeweils, wenn ich bsp. eine Tabelle d einfüge, das Standardmakro kopieren und einfach den Namen für die Tabelle d eintragen und in Tabelle x eine neue Schaltfläche in der Zeile C28 (d) erstellen.
Wenn es nun aber ginge, dass ich an den Makros nichts machen müssen, sondern nur die Eintragung in Tabelle x mit dem Rechteck vornehmen müsste, könnte ich dies einem Laien wie mir zumuten, selbst Tabellen einzufügen, ohne Makros ändern zu müssen.
Nur geht das?
Besten Dank für Deine bisherige Hilfe.
Gruss
Thomas
Anzeige
Ganz genau so geht das...
27.04.2005 13:09:27
Boris
Hi,
...mit dem Unterschied, dass ich in meiner Lösung davon ausgegangen bin, dass die Rechtecke rechts neben den Blattnamen platziert sind.
Sind sie genau auf der Zelle mit den Blattnamen platziert (bestensfalls ausgerichtet an die Zellgröße - also "aufgezogen" bei gedrückter Alt-Taste),
dann muss aus dem Code nur der Teil mit Offset raus.
Sieht dann so aus:
Option Explicit

Sub aufruf()
Call welche_tabelle(ActiveSheet.Shapes(Application.Caller).TopLeftCell.Text)
End Sub


Sub welche_tabelle(Blattname As String)
MsgBox "Sie haben die Tabelle " & Blattname & " ausgewählt", 64, "Gebe bekannt..."
End Sub

Und den Rechtecken wird allen nur das Makro "aufruf()" zugewiesen.
Grüße Boris
Anzeige
AW: Ganz genau so geht das...
27.04.2005 14:34:56
TZ
Hallo Boris
Funktioniert - nur nicht ganz.
Ich habe dann mit Call nach Msg mein Makro aufgerufen - mal geht's mal nicht.
Das Makro wird teilweise in Tabelle x ausgeführt - irgendwie hat er nicht die
Tabelle a (b, c) aktiv ausgewählt für die Makroausführung.
Hast Du noch eine Idee?
Danke und Gruss
Thomas
Eine Idee?
27.04.2005 14:50:27
Boris
Hi,
...ohne deinen eigentlichen Code zu kennen: Nein.
Poste ihn doch einfach mal - oder noch besser: Lad mal ne kleine Beispielmappe auf den Server.
Grüße Boris
AW: Eine Idee?
28.04.2005 06:59:12
Thomas
Guten Morgen Boris
Entschuldige die Verspätung - hatte keinen Zugriff.
Habe die Datei unter
https://www.herber.de/bbs/user/21814.xls
abgelegt.
Viele Dank und Gruss
Thomas
Anzeige
AW: Eine Idee?
28.04.2005 09:30:15
Boris
Hi Thomas,
in Modul 1 steht nur noch:

Sub welche_tabelle(Blattname As String)
Application.ScreenUpdating = False
Sheets(Blattname).Visible = True
Sheets(Blattname).Select
Sheets(Blattname).Copy After:=Sheets(1)
Rows("1:25").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Range("A1").Select
Application.CutCopyMode = False
Selection.ClearContents
Sheets(Blattname).Visible = False
Application.ScreenUpdating = True
End Sub


Sub aufruf()
Call welche_tabelle(ActiveSheet.Shapes(Application.Caller).TopLeftCell.Text)
End Sub

Und jedem Rechteck weist du du die Prozedur "aufruf()" zu.
Grüße Boris
Anzeige
AW: Eine Idee?
28.04.2005 12:31:02
Thomas
Jupiiiii Boris, es funktioniert!
Habe nun auch versucht im Auto_open alle Tabellen zu schliessen ausser Tabelle x.
Eigentlich funktionierts, habe aber das eigenartige Gefühl, dass die Lösung nicht sehr "sauber" ist. Kann es da zu Laufzeitproblemen kommen?

Sub Auto_open()
Application.Dialogs(xlDialogSaveAs).Show
For Each sh In Sheets
Sheets("x").Visible = True
sh.Visible = False
Next sh
'Sheets("a").Visible = False
'Sheets("b").Visible = False
'Sheets("c").Visible = False
Application.VBE.ActiveVBProject.VBComponents.Remove _
Application.VBE.ActiveVBProject.VBComponents("Modul2")
End Sub

Also dann, vielleicht höre ich noch was.
Vorerst vielen Dank für Deine Hilfe.
Thomas
Anzeige
AW: Eine Idee?
29.04.2005 16:10:46
Boris
Hi Thomas,
ich versteh den Sinn deiner Auto_Open()-Routine nicht.
Erstens stammt diese aus Urzeiten, in denen es das Ereignis Workbook_Open() noch nicht gab.
Zweitens: Warum löschst du per Code das Modul2? Sich selbst zerstörenden Code halte ich immer für - sagen wir - bedenklich.
Grüße Boris
AW: Eine Idee?
03.05.2005 07:28:31
Thomas
Hallo Boris
Bitte entschuldige die verspätete Antwort.
Ich kenne kein anderes Vorgehen - bin eben noch Anfänger.
Das Modul 2 lösche ich aus dem Grund, da ich die Datei mehrmals aufrufen muss,
aber nur einmal eine Kopie (Speichern unter) erstellen will.
So habe ich die Sicherheit, dass der Vorgang Speichern unter nur einmal aufgerufen wird.
Hast Du für das Visible-Problem eine Idee? Sonst werde ich einfach alle Tabelle vor dem abspeichern des Originals "unsichtbar schalten".
Viele Grüsse
Thomas

156 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige