Trigger für Tabellenänderungen

Hallo,
Folgendes Problem:

Ich habe eine Arbeitsmappe mit verschiedenen Tabellen, die möglicherweise auch vom User umbenannt oder ergänzt werden.

Jetzt gibt es Makros, welche sich auf eine gezielte, möglicherweise jedoch nicht die aktive Tabelle beziehen sollen.

Jetzt habe ich in einer User Toolbar ein Dropdown-Feld, welches entscheidet, welche Tabelle für die Makros herangezogen werden sollen.
Im Dropdown-Feld müssen alle existierenden, nicht ausgeblendeten Tabellen der Arbeitsmappe stehen.

Theoretisch ist das ja alles schön und gut, ich brauche jedoch noch eine Möglichkeit, darauf zu reagieren, wenn eine Tabelle kopiert, eingefügt, gelöscht, umbenannt oder ausgeblendet wird, um dementsprechend die Toolbar zu aktualisieren.

Wie heißt/heißen die Funktion/en dafür?
Danke,
Michael

Hi Michael,

Jetzt habe ich in einer User Toolbar ein Dropdown-Feld,
welches entscheidet, welche Tabelle für die Makros
herangezogen werden sollen.

wie/wo finde ich in Excel eine „User Toolbar“, was ist das? Eine Userform?

Welche XL-Version hast du?

Gruß
Reinhard

Danke der Nachfrage…
Hallo,

wie/wo finde ich in Excel eine „User Toolbar“, was ist das?
Eine Userform?

Der Code, denke das erklärt alles:

Sub BeispielBar()
Dim BarName As String
BarName = "meine Buttons"
Dim myBar As CommandBar
Dim box As CommandBarComboBox
On Error Resume Next
 Application.CommandBars(BarName).Delete
Set myBar = \_
 Application.CommandBars.Add(BarName, msoBarTop, False, True)
 myBar.Visible = True
 Set box = myBar.Controls.Add(Type:=msoControlComboBox)
 For Each WS In Worksheets
 If (WS.Visible = xlSheetVisible) Then \_
 box.AddItem (WS.name)
 Next WS
End Sub

Welche XL-Version hast du?

Excel 2003.

Hi Michael,

das Problem ist die automatische Aktualisierung der Liste in der ComboBox. Wie du mit dem nachstehenden Code sehen kannst wird die Liste erst dann aktualisiert wenn man in der Liste schon was ausgewählt hat, d.h. man hat vielleicht ein Blatt ausgewählt daß es gar nicht mehr gibt.

Um eine annähernde Aktualisierung könntest du im Modul „DieseArbeitsmappe“ sowas eintragen:

Private Sub Workbook_NewSheet(ByVal Sh As Object)
Call nn
End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Call nn
End Sub

Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
Call nn
End Sub

und da gibts ja noch mehr Ereignisse für ein Sheet, die kannst du ja noch dranhängen.
SheetCalculate kann kritisch werden bei großen Tabellen mit vielen Berechnungen aus Performancegründen, mußte testen.

Alternativ zu dem Ganzen, schmeiß die Combobox wieder raus, ist sowieso Verschwendung dafür eine ganze Zeile zu benutzen und setze stattdessen oben z.B. neben das Fragezeichen eine Schaltfläche.

Diese Schaltfläche ruft dann eine List- oder Combobox auf, oder eine Userform auf der sich die Listbox befindet, die immer aktuell ist

Mit Riesemaufwand und noch unklar ob es deine Problematik zu 100% abdecken kann könnte man mittels API den Mauszeiger überwachen ob er sich unten über den Tabellenregistern befindet und sobald er diesen Bereich wieder verläßt könnte man dies benutzen um die Liste zu aktualisieren.

Das bedingt m.E. aber daß da ein Timer permanent mitläuft und permanent die Mausposition abfragt. D.h. der Timer muß beim Mappenöffnen gestartet werden , dies bedingt daß man den User dazu zwingen muß daß er die Mappe mit aktivierten Makros öffnen muß, ansonsten kriegt er nur ein leeres Baltt zu sehen.

Es gäbe noch andere Vorgehensweisen, aber alle sehr aufwendig. Man könnte unten die Tabellenrgister ausblenden und eigene Schaltflächen basteln die sie ersetzen. Dazu muß man natürlich auch Extras–Optionen deaktivieren damit keiner dort die Tabellenregister wieder einblenden könnte.

Alles viel zu viel Aufwand *find*, aber wenn du dich daran versuchen willst, bitteschön, durch solche Aufgaben wächst man in Vba-Hinsicht.

Ein Tipp, gewöhne dir in deinem Interesse an immer Option Explicit zu benutzen.

Gruß
Reinhard

Option Explicit
'
Sub BeispielBar()
Dim BarName As String, WS As Worksheet
BarName = "meine Buttons"
Dim myBar As CommandBar
Dim box As CommandBarComboBox
On Error Resume Next
Application.CommandBars(BarName).Delete
Set myBar = \_
Application.CommandBars.Add(BarName, msoBarTop, False, True)
myBar.Visible = True
Set box = myBar.Controls.Add(Type:=msoControlComboBox)
box.Caption = "meine Box"
box.OnAction = "nn"
For Each WS In Worksheets
 If (WS.Visible = xlSheetVisible) Then box.AddItem (WS.Name)
Next WS
End Sub
'
Sub nn()
Dim WS As Worksheet
With Application.CommandBars("meine Buttons").Controls("meine Box")
 .Clear
 For Each WS In Worksheets
 If (WS.Visible = xlSheetVisible) Then .AddItem (WS.Name)
 Next WS
 MsgBox "huhu"
End With
End Sub

Hallo Michael

Vor dem Löschen eines Tabellenblattes wird das „Workbook_SheetDeactivate“-Ereignis aufgerufen.

Viele Grüße
Carsten

anderer Lösungsansatz

Jetzt habe ich in einer User Toolbar ein Dropdown-Feld,
welches entscheidet, welche Tabelle für die Makros
herangezogen werden sollen.
Im Dropdown-Feld müssen alle existierenden, nicht
ausgeblendeten Tabellen der Arbeitsmappe stehen.

Theoretisch ist das ja alles schön und gut, ich brauche jedoch
noch eine Möglichkeit, darauf zu reagieren, wenn eine Tabelle
kopiert, eingefügt, gelöscht, umbenannt oder ausgeblendet
wird, um dementsprechend die Toolbar zu aktualisieren.

Hi Michael,

da Makros nur funktionieren wenn die Mappe mit aktivierten Makros gestartet wird sag Bescheid wenn du Code brauchst der den Benutzer dazu zwingt. Ohne aktivierte Makros kriegt er dann nur ein leeres Blatt zu sehen.

Sub tt und die Select-Schleife in Sub Test müßtest du noch um die anderen Punkte des Kontextmenüs des Tabellenregisters ergänzen und pro Eintrag auch noch eine Sub analog zu Sub Einf und Sub UmB erstellen.

Option Explicit
'
Sub tt()
With Application.CommandBars("ply")
 .Controls("&Einfügen...").OnAction = "Test"
 .Controls("&Umbenennen").OnAction = "Test"
End With
End Sub
'
Sub Test()
Select Case CommandBars.ActionControl.TooltipText
 Case "&Einfügen..."
 Call Einfg
 Case "Blatt umbenennen"
 Call UmB
 Case Else
 Exit Sub
End Select
Call ListeAktualisieren
End Sub
'
Sub Einfg()
Worksheets.Add after:=Worksheets(Worksheets.Count)
End Sub
'
Sub UmB()
Dim Eingabe, Mldg, Titel
Mldg = "Neuen Namen des Blattes " & ActiveSheet.Name & " eingeben"
Titel = "Umbenennung"
Eingabe = InputBox(Mldg, Titel, ActiveSheet.Name)
If Eingabe = "" Then Exit Sub
On Error GoTo Fehler
ActiveSheet.Name = Eingabe
Exit Sub
Fehler:
MsgBox "ungültiger name"
End Sub
'
Sub ListeAktualisieren()
'Code um deine Combobox zu aktualisieren
End Sub

Gruß
Reinhard

Tabellenblattregister überwachen

Hi Michael,

mach das ganze mal lieber so:

In DieseArbeitsmappe:

Option Explicit
'
Private Sub Workbook\_BeforeClose(Cancel As Boolean)
Dim C As CommandBarButton
For Each C In Application.CommandBars("ply").Controls
 C.OnAction = ""
Next C
End Sub

In Modul1:

Sub tt()
With Application.CommandBars("ply")
 .Controls("&Einfügen...").OnAction = "Test"
 .Controls("&Einfügen...").Tag = "Einfügen"
 .Controls("&Umbenennen").OnAction = "Test"
 .Controls("&Umbenennen").Tag = "Umbenennen"
End With
End Sub
'
Sub Test()
With CommandBars.ActionControl
 If .Tag "" Then Application.Run .Tag
End With
End Sub
'
Sub Einfügen()
MsgBox "E"
End Sub
'
Sub Umbenennen()
MsgBox "U"
End Sub

Gruß
Reinhard