expertenaustausch > microsoft.* > microsoft.excel

Dirk Muellermann (15.09.2005, 23:46)
Hi NG,

wenn in Excel keine Datei geöffnet ist, dann sind die meisten Schaltflächen der Symbolleisten inaktiv und werden grau dargestellt.
Nur die Funktionen - wie z. B. Neu oder Datei öffnen - sind aktiv und können genutzt werden.

Ich habe diverse Makros, die ich mittels Schaltfläche in der Symbolleiste starte. Die Makros sind nur innerhalb einer Tabelle
anzuwenden. Doch werden diese selbstdefinierten Schaltflächen immer aktiv dargestellt. Die Makros überprüfen zwar, ob eine Tabelle
geöffnet ist, so dass keine Fehlermeldung erfolgt, doch irritiert es diverse User, dass die Symbole immer aktiv sind.

Gibt es eine Möglichkeit diese Symbole - sofern keine Datei geöffnet ist, zu deaktivieren?

Vielen Dank im Voraus.

Gruß
Melanie Breden (16.09.2005, 07:09)
Hallo Dirk,

Dirk Muellermann schrieb:
> Ich habe diverse Makros, die ich mittels Schaltfläche in der Symbolleiste starte. Die Makros sind nur innerhalb einer Tabelle
> anzuwenden. Doch werden diese selbstdefinierten Schaltflächen immer aktiv dargestellt. Die Makros überprüfen zwar, ob eine
> Tabelle
> geöffnet ist, so dass keine Fehlermeldung erfolgt, doch irritiert es diverse User, dass die Symbole immer aktiv sind.
> Gibt es eine Möglichkeit diese Symbole - sofern keine Datei geöffnet ist, zu deaktivieren?


wenn du schon eine Prüfung hast, ob eine Datei geöffnet ist,
dann kannst du darauf reagieren und die Enabled-Eigenschaft
der Schaltfläche entsprechend einstellen:

Werden deine selbstdefinierten Schalltflächen zur Laufzeit erstellt, oder
hast du sie manuell einer Symbolleiste zugewiesen?

Mit freundlichen Grüssen
Melanie Breden
Reiner Wolff (16.09.2005, 07:31)
Moin Dirk,

*Dirk Muellermann* schrieb:
> wenn in Excel keine Datei geöffnet ist, dann sind die meisten Schaltflächen der Symbolleisten inaktiv und werden grau dargestellt.
> Nur die Funktionen - wie z. B. Neu oder Datei öffnen - sind aktiv und können genutzt werden.
> Ich habe diverse Makros, die ich mittels Schaltfläche in der Symbolleiste starte. Die Makros sind nur innerhalb einer Tabelle
> anzuwenden. Doch werden diese selbstdefinierten Schaltflächen immer aktiv dargestellt. Die Makros überprüfen zwar, ob eine Tabelle
> geöffnet ist, so dass keine Fehlermeldung erfolgt, doch irritiert es diverse User, dass die Symbole immer aktiv sind.
> Gibt es eine Möglichkeit diese Symbole - sofern keine Datei geöffnet ist, zu deaktivieren?


Das könntest Du erreichen, indem die Symbole beim Öffnen der zugehörigen
Makro-Datei erstmal deaktiviert werden bzw. dabei abgeklopft wird, ob eine
Datei geöffnet ist.
Wenn Du dann dazu auf die Ereignisse des Excel-Application-Objektes darauf
reagierst, wenn eine Datei geschlossen/geöffnet/gewechselt (ggf. auch auf
den Tabellenblatt-Wechsel) wird, dann solltest Du alle Möglichkeiten haben,
die Symbole bei Bedarf zu deaktivieren.
Hierzu solltest Du Dich mit folgender Variablendeklaration beschäftigen
Dim WithEvents xlApp As Excel.Application

Weiteres zu der Benutzung findest Du ggf. in der OnlineHilfe und bei
Google.

HTH
Greetinx aus Kiel
Reiner
Dirk Muellermann (16.09.2005, 21:09)
> wenn du schon eine Prüfung hast, ob eine Datei geöffnet ist,
> dann kannst du darauf reagieren und die Enabled-Eigenschaft
> der Schaltfläche entsprechend einstellen:
> Werden deine selbstdefinierten Schaltflächen zur Laufzeit erstellt, oder
> hast du sie manuell einer Symbolleiste zugewiesen?


Die Schaltflächen habe ich manuell angelegt und sie werden nur selten geändert oder angepasst.

Die Makros sind in der personl.xls gespeichert. Diese Datei ist in einem zusätzlichen Startordner abgelegt. Die Makros werden von
mehreren Arbeitskollegen gleichzeitig genutzt, d. h. dass die personl.xls-Datei immer schreibgeschützt geöffnet werden muss.

Kannst du mir ein Beispiel für die Enabled-Eigenschaft geben?

Gruß
Melanie Breden (16.09.2005, 21:21)
Hallo Dirk,

Dirk Muellermann schrieb:
> Die Schaltflächen habe ich manuell angelegt und sie werden nur selten geändert oder angepasst.
> Kannst du mir ein Beispiel für die Enabled-Eigenschaft geben?


da du die Schaltflächen manuell erstellt hast, musst du sie über
deren Beschriftungstext ansprechen:

Application.CommandBars(1).Controls("Mein Button").Enabled=False

Mit freundlichen Grüssen
Melanie Breden
Dirk Muellermann (19.09.2005, 17:43)
> da du die Schaltflächen manuell erstellt hast, musst du sie über
> deren Beschriftungstext ansprechen:
> Application.CommandBars(1).Controls("Mein Button").Enabled=False

Ich habe den o. g. Term in die personl.xls Datei ergänzt, doch wenn Excel gestartet wird und keine Datei geöffnet ist, dann wird die
entprechende Schaltfläche immer noch aktiv dargestellt.

Wird das Makro ausgeführt, kommt eine Fehlermeldung:
Laufzeitfehler '9':
Index außerhalb des gültigen Bereichs

Als "Mein Button" habe ich den Namen eingegeben, der auch angezeigt wird, wenn man mit der Maus über der Schaltfläche verweilt.

Wofür steht die 1 hinter CommandBars?

Was habe ich falsch gemacht?

Gruß

Dirk
Melanie Breden (19.09.2005, 20:27)
Hallo Dirk,

Dirk Muellermann schrieb:
> Wird das Makro ausgeführt, kommt eine Fehlermeldung:
> Laufzeitfehler '9':
> Index außerhalb des gültigen Bereichs
> Als "Mein Button" habe ich den Namen eingegeben, der auch angezeigt wird,
> wenn man mit der Maus über der Schaltfläche verweilt.
> Wofür steht die 1 hinter CommandBars?


das ist die Arbeitsblatt-Menüleiste (Datei, Bearbeiten etc.)

> Was habe ich falsch gemacht?


Du musst die Symbolleiste referenzieren, auf der dein Button eingefügt ist.
z.B. für die Standard-Symbolleiste:

Application.CommandBars("Standard").Controls("Mein Button").Enabled=False

Mit freundlichen Grüssen
Melanie Breden
Dirk Muellermann (20.09.2005, 20:45)
> Hierzu solltest Du Dich mit folgender Variablendeklaration beschäftigen
> Dim WithEvents xlApp As Excel.Application


Ich habe versucht mich einzulesen, aber das übersteigt meine Kenntnisse von VB. Kannst du mir eine kurzen Lösungsweg skizzieren. Für
mich sollten die Ereignisse öffnen/schließen einer Datei relevant sein.

Vielen Dank im Voraus.

Gruß
Reiner Wolff (21.09.2005, 07:34)
Moin Dirk,

*Dirk Muellermann* schrieb:
>> Hierzu solltest Du Dich mit folgender Variablendeklaration beschäftigen
>> Dim WithEvents xlApp As Excel.Application

> Ich habe versucht mich einzulesen, aber das übersteigt meine Kenntnisse von VB. Kannst du mir eine kurzen Lösungsweg skizzieren. Für
> mich sollten die Ereignisse öffnen/schließen einer Datei relevant sein.


Einen Ansatz habe ich unten einmal angefügt. Die Programmierung zeigt
allerdings lediglich das Prinzip und funktioniert nicht in allen Fällen, da
ich vermutlich in der Kürze meiner Zeit nicht alle notwendigen Ereignisse
erwischt habe, aber Dir wird vielleicht die Funktionsweise klarer.

HTH
Greetinx aus Kiel
Reiner

Kopiere folgenden Code in das Modul 'Diese Arbeitsmappe':
Option Explicit

Public WithEvents xlApp As Excel.Application
Public Knopf As CommandBarButton

Private Sub TabellenblattPrüfen()
Dim Sh As Object

If Not IsNothing(ActiveWorkbook) Then
If Not IsNothing(ActiveWorkbook.ActiveSheet) Then
Set Sh = ActiveWorkbook.ActiveSheet
'Prüfen, ob es sich um eine Tabellenblatt handelt
If Sh.Type = xlWorksheet And Sh.Visible And
Sh.Parent.Windows(1).Visible Then
Knopf.Enabled = True
Else
Knopf.Enabled = False
End If
Else
Knopf.Enabled = False
End If
Else
Knopf.Enabled = False
End If
End Sub

Private Sub Workbook_Open()
Set xlApp = Application
Set Knopf = xlApp.CommandBars("Benutzerdefiniert 1").Controls("Test")
TabellenblattPrüfen
End Sub

Private Sub Workbook_NewSheet(ByVal Sh As Object)
TabellenblattPrüfen
End Sub

Private Sub xlApp_NewWorkbook(ByVal Wb As Workbook)
TabellenblattPrüfen
End Sub

Private Sub xlApp_SheetActivate(ByVal Sh As Object)
TabellenblattPrüfen
End Sub

Private Sub xlApp_SheetDeactivate(ByVal Sh As Object)
TabellenblattPrüfen
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
TabellenblattPrüfen
End Sub

Private Sub Workbook_Deactivate()
TabellenblattPrüfen
End Sub
Dirk Muellermann (21.09.2005, 18:04)
> Kopiere folgenden Code in das Modul 'Diese Arbeitsmappe':
[..]
> Private Sub Workbook_Deactivate()
> TabellenblattPrüfen
> End Sub


Vielen Dank Reiner für das o. g. Script.

Leider funktioniert es bei Excel2000 nur innerhalb der personl.xls-Datei. Wenn Excel gestartet wird, wird automatisch die
personl.xls geladen und somit auch das Makro abgespult (= Workbook Open). Wenn man zwischen zwei Tabellenblätter wechselt oder die
Datei schließt werden immer die entsprechenden Unterroutinen ausgeführt.

Öffnet/Schließt man aber eine beliebige andere Datei, dann passiert gar nichts.

Unter Excel97 funktionieret das Makro auch bei jeder beliebigen Datei. Ausnahme: der Unterpunkt CloseBefore wird beim Schließen
einer Datei nicht ausgeführt?

Was muss man modifizieren, damit das Makro auch unter Excel2000 läuft? Was muss man beim CloseBefore-Befehl ändern, damit das
Ereignis registriert wird?

Gruß

Dirk
Reiner Wolff (21.09.2005, 20:23)
Moin Dirk,

*Dirk Muellermann* schrieb:
> Vielen Dank Reiner für das o. g. Script.


Bitte gern geschehen.

> Leider funktioniert es bei Excel2000 nur innerhalb der personl.xls-Datei. Wenn Excel gestartet wird, wird automatisch die
> personl.xls geladen und somit auch das Makro abgespult (= Workbook Open). Wenn man zwischen zwei Tabellenblätter wechselt oder die
> Datei schließt werden immer die entsprechenden Unterroutinen ausgeführt.
> Öffnet/Schließt man aber eine beliebige andere Datei, dann passiert gar nichts.


Das kann ich soweit bestätigen, allerdings wird es auch in einer neu
geöffneten Datei ausgeführt, wenn dort ein anderes Tabellenblatt ausgewählt
wird.

> Unter Excel97 funktionieret das Makro auch bei jeder beliebigen Datei. Ausnahme: der Unterpunkt CloseBefore wird beim Schließen
> einer Datei nicht ausgeführt?
> Was muss man modifizieren, damit das Makro auch unter Excel2000 läuft? Was muss man beim CloseBefore-Befehl ändern, damit das
> Ereignis registriert wird?


Ehrlich gesagt, weiß ich es nicht und müsste es erst ausprobieren.
An dieser Stelle möchte ich eines Deiner vorherigen Postings zitieren:
>>> Ich habe versucht mich einzulesen, aber das übersteigt meine Kenntnisse
>>> von VB. Kannst du mir eine kurzen Lösungsweg skizzieren.

^^^^^^^^^^
Ich würde meinen, das habe ich getan.
Für den ersten Augenschein liefert der unten angefügte Code wohl das
erwartete Ergebnis, allerdings kann ich Dir nicht mit ruhigem Gewissen dazu
raten, meinen Code überhaupt einzusetzen.
Aber vielleicht hilft es Dir ja trotzdem weiter.

Greetinx aus Kiel
Reiner

P.S.:
Um die Fragen zu klären, habe ich mal folgenden Code hinzugefügt:
Private Sub xlApp_WorkbookDeactivate(ByVal Wb As Workbook)
Knopf.Enabled = False
End Sub

Private Sub xlApp_WorkbookOpen(ByVal Wb As Workbook)
TabellenblattPrüfen
End Sub
Ähnliche Themen