Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
408to412
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
408to412
408to412
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Call alle_aus - Fehler?

Call alle_aus - Fehler?
Rico
Hallo,
ich habe gestern durch die freundliche Hilfe eines Forum-Mitglieds einen VBA-Code bekommen, der die Excel Application beim starten einer bestimmten Tabelle auf eine feste Größe (Beispiel 400x400 Pixel) minimiert. Zur besseren Veranschaulichung meines Problems hier erst mal der Code
-------------------------------------------------------------------
Code in das Modul von "DieseArbeitsmappe":
Option Explicit

Private Sub Workbook_Activate()
With Application
.WindowState = xlNormal
.Width = 400
.Height = 400
.DisplayStatusBar = False
.DisplayFormulaBar = False
.DisplayScrollBars = False
.Left = 100
.Top = 10
End With
Call alle_aus
End Sub


Private Sub Workbook_Deactivate()
Call alle_ein
End Sub

Code in ein Standardmodul:
Option Explicit
Option Private Module
Sub alle_aus()
Dim cb As CommandBar
For Each cb In CommandBars
If cb.Type 2 Then cb.Enabled = False
Next
End Sub
Sub alle_ein()
Dim cb As CommandBar
For Each cb In CommandBars
cb.Enabled = True
Next
End Sub
---------------------------------------------------------------------
Der Code funktioniert wunderbar beim Starten. Mein Problem ist nun folgendes:
Der VBA-Code im ersten Modul

Private Sub Workbook_Deactivate()
Call alle_ein
End Sub

sieht für mich aus, als wäre das die Anweisung, beim schließen der Arbeitsmappe alle Änderungen (Größe, Weglassen der Menüs...) wieder Rückgänging zu machen. Da ich Makros im Moment nur mit dem Recorder schreiben kann, kenne ich mich leider nicht so aus. Ist für mich aber eine logische Schlußfolgerung.
So, wenn ich nun die Tabelle (demnach auch das ganze Programm) schließe, dann treten eben diese rückgängigen Änderungen leider nicht in Kraft. Öffne ich nach dem Schließen eine ganz andere (normale) Tabelle, so öffnet sich Excel in der Größe 400x400 Pixel und es fehlen die Arbeitsmappenregister + Scrollbalken. Maximiert man die Tabelle dann, so ist der Vertikale Scrollbalken plötzlich "in der Mitte" der Tabelle - quasi an der Stelle, wo die 400 Pixel zu Ende waren.
Also scheint die Anweisung aus dem ersten Modul nicht so richtig zu sein. Oder habe ich was falsch gemacht? Gibt es noch einen zusätzlichen VBA-Code, der das umgeht, das Excel diesen Fehler macht?
Ihr könnt den Code ja mal ausprobieren, um zu sehen, was ich meine.
Wie immer vielen Dank vorab für Eure Hilfe. :-)
Gruß
Rico
AW: Call alle_aus - Fehler?
Oberschlumpf
Hallo Rico
Verwende zusätzlich zum Deactivate-Ereignis auch das BeforeClose-Ereignis.
Bedeutet, setze den Code
Call alle_ein
auch in dieses Ereignis im Klassenmodul:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
End Sub

-----------------------------------------------------
Erklärung:
Das Ereignis

Private Sub Workbook_Deactivate()
End Sub

tritt ein, wenn die Datei nicht geschlossen wird, Du aber eine andere Excel-Datei öffnest.
Bsp.
Mappe1.xls ist geöffnet und somit "aktiviert"
Mappe2.xls wird geöffnet und dadurch "aktiviert" - automatisch wird Mappe1.xls "deaktiviert" und es tritt das "Deactive"-Ereignis ein.
Verstanden?
Das Ereignis

Private Sub Workbook_BeforeClose(Cancel As Boolean)
End Sub

tritt ein, sobald eine Excel-Datei geschlossen wird.
Bsp.
Mappe1.xls ist geöffnet und somit "aktiviert"
Mappe1.xls wird geschlossen und...
...ist noch immer "aktiviert"
...VOR dem Schließen tritt das Ereignis "BeforeClose" ein
...Mappe1.xls wird NICHT "deaktiviert", deshalb auch kein "Deactive"-Ereignis
auch verstanden? :-)
Hoffe, dass ich helfen konnte.
Ciao
Thorsten
Anzeige
AW: Call alle_aus - Fehler?
Bert
das ist so nicht richtig, das Deaktivate- Ereignis tritt auch beim
Schließen einer Mappe ein.
Bert
AW: Call alle_aus - Fehler?
Rico
Hallo Thorsten,
erst einmal vielen Dank für Deine schnelle Antwort und die ausführliche Erklärung.
Das Prinzip der beiden Codes habe ich nun verstanden.
Aber: Wo setze ich denn nun den Code

Private Sub Workbook_BeforeClose(Cancel As Boolean)
call alle_ein
End Sub

ein? Wenn ich ihn mit in dem Modul "Diese Arbeitsmappe" reinsetze, hat er keine Auswirkung.
Muss ich dafür noch mal ein neues Modul nehmen?
Ich danke Dir schon mal... :-) *kopfkratz*
Gruß
Rico
Anzeige
AW: Call alle_aus - Fehler?
Bert
Du musst natürlich wissen, wann wiederhergestellt werden soll. Nur
wenn Excel geschlossen wird? Wenn eine neue Mappe geöffnet oder mit Neu
erzeugt wird? Nur, wenn deine Mappe geschlossen wird?
Bert
AW: Call alle_aus - Fehler?
03.04.2004 13:53:33
Oberschlumpf
Hi
Tja...*auchamkoppkratz* :-)
Da hatte Bert wohl Recht.
und....
...meine Erklärung ist teilweise....FALSCH :-((
Das "Deactivate"-Ereignis tritt AUCH bim Schließen einer Datei ein.
Ich habe mich von meinen Überlegungen, OHNE diese vor Bekanntgabe zu testen, leider verleiten lassen....shit :-)
Nun zu Deiner Frage.
Du hast mit "DieseArbeitsmappe" das richtige Modul gewählt.
Und da Dein Eintrag hier auch nichts bringt, kann die Ursache eigentlich nur noch die folgende sein.
In Deinem VBA-Code muss irgendwo diese Zeile stehen:
Application.EnableEvents = False
Dieser Befehl bewirkt, dass nach Ausführung desselben keine Ereignisse, ob nun Deactivate, BeforeClose, Change oder SelectionChange mehr überwacht werden.
Der Grund für den Einsatz des beschriebenen Befehls kann vielfältig sein.
Auf jeden Fall muss aber an der richtigen Stelle diese Befehlszeile folgen.
Application.EnableEvents = True
Damit wird die Überwachung der verschieden Ereignisse, und somit das Ausführen der sich darin befindlichen Makros wieder eingeschaltet.
Du solltest jetzt erst mal die Überwachung wieder einschalten.
Dies erreichst Du so:
1. Klick im VBA-Editor auf "Ansicht/Direktfenster"
2. Gib in dieses Fenster "Application.EnableEvents = True" ein und drück auf Enter. Nun ist die Überwachung wieder aktiviert, und die Makros werden ausgeführt
3. Suche in Deinen Makros nach "Application.EnableEvents = False" und füge an der richtigen Stelle "Application.EnableEvents = True" ein. Tust Du das nicht, wird sich Dein Problem wohl nicht lösen.
Na ja, WO denn nun DIE Stelle ist, an der Du "Application.EnableEvents = True" einfügen musst, kann ich Dir natürlich leider nicht sagen :-)
Und....falls ich mit DIESER "Lösung" auch wieder falsch liege, lasse ich den Thread wohl besser erste mal geöffnet :-)
Ciao
Thorsten
Anzeige
AW: Call alle_aus - Fehler?
Bert
Das ist kein Fehler. Beim Deaktivieren werden nur alle Symbol/Menüleisten
eingeblendet. Wenn du den Rest auch wiederherstellen willst, dann muss das
im Code angegeben werden.
"wenn ich nun die Tabelle (demnach auch das ganze Programm) schließe"
Wieso das denn? Es wird doch nicht Excel geschlossen, wenn du eine Mappe
schließt, umgekehrt wäre es richtig.
Bert
AW: Call alle_aus - Fehler?
Rico
Hallo Bert,
Wenn ich die Tabelle mit diesem VBA-Code öffne, minimiert sich ja die gesamte Excel-Application, und es bleibt nur oben der blaue Streifen mit dem "Minimieren, Maximieren und Schliessen"-Zeichen.
Angenommen, ich bin mit dem Tool fertig, und schließe es oben rechts, dann schließe ich auch die gesamte Excel-Application.
Bezugnehmend auf Deine Frage: Der Code soll beim Schließen des Programms seine Wirkung zeigen, so dass, wenn ich Excel das nächste mal wieder öffne, alles beim alten ist. Maximale Größe, Arbeitsmappen-Register und und und.... :-)
Vielen Dank schon mal.
Gruß
Rico
Anzeige
AW: Call alle_aus - Fehler?
Bert
Lies mal noch meine andere Antwort.
Wenn zwischenzeitlich eine andere Mappe geöffnet weird, soll also
alles so bleiben, wie es ist? Erst wenn Excel beendet wird, soll
der Originalzustand wiederhergestellt werden?
Bert
AW: Call alle_aus - Fehler?
Rico
Wenn zwischenzeitlich eine andere Mappe geöffnet wird, soll diese im Originalzustand aufegehn.
Wenn Excel komplett geschlossen wird, soll der Originalzustand wiederhergestellt werden.
Nur diese eine Mappe soll mit den Spezifikationen aufgehen. :-)
Gruß
Rico
AW: Call alle_aus - Fehler?
Bert
Ich hab mir mal die Antwort von K.Rola durchgelesen. Sie hat dich schon
darauf hingewiesen, dass die Lösung nicht komplett ist, kann sie auch
mit den von dir gegebenen Infos nicht sein.
Es geht ja schonmal damit los, dass erstmal der Zustand von Excel
beim Öffnen deiner Mappe festgestellt werden müsste, damit beim
Schließen der Originalzustand hergestellt werden kann. Und dann
ist das halt mit 3 Zeilen Code nicht mehr getan, wenn du verstehst,
was ich meine.
Bert
Anzeige
AW: Call alle_aus - Fehler?
Rico
Hi Bert,
sicherlich verstehe ich, was Du meinst. Da ich von VBA wirklich nur einen ganz geringen Teil verstehe, konnte ich auch nicht ahnen, dass es nun sooo kompliziert wird. Wobei das Beispiel von K.Rola gezeigt hatte, dass es doch funktioniert - da Boris mir gleich geschrieben hatte, das es nur mit API-Funktionen geht.
Ich werde mal Deinen Code ausprobieren (ich nehme an, das er mit in das Modul "DieseArbeitsmappe" reinkommt). Ansonsten danke ich Dir trotzdem, dass Du Dir die Mühe gemacht hast. Sowas findet man nämlich nicht oft in Foren, das auch mit konstruktiven Antworten geboten wird. :-)
Gruß
Rico
Anzeige
AW: Call alle_aus - Fehler?
Bert
Ich denke, das die Bereitschaft zu helfen, hier im Forum eher die Regel ist.
Die Qualität einer Antwort kann aber immer nur so sein, wie die der
Frage. Oft werden die Aufgaben einfach zu ungenau beschrieben.
Bert
AW: Call alle_aus - Fehler?
Bert
So werden alle beim Öffnen gemachten Einstellung zurückgesetzt:

Private Sub Workbook_Deactivate()
With Application
.WindowState = xlMaximized
.DisplayStatusBar = True
.DisplayFormulaBar = True
.DisplayScrollBars = True
End With
Call alle_ein
End Sub

Der Zustand von Excel beim Start wird aber nicht analysiert.
Bert
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige