946 Aufrufe
Gefragt in Tabellenkalkulation von
Hallo,

ich bin kurz vor dem Wahnsinn, weil mein VBA einfach nicht das macht, was ich will :-(
Im Sinne einer "sauberen" Programmierung möchte ich beim Öffnen meiner Datei die Eigenschaften "Bearbeitungsleiste", "Statuszeile", horizontaler und vertikaler Scrollbalken auslesen und beim Schließen der Datei wieder den Urzustand herstellen. Dies auch deshalb, weil ich innerhalb meiner Datei bei manchen Blättern diese Eigenschaften de- und bei anderen wieder aktiviere.

Mein Code sieht folgendermaßen aus ("DieseArbeitsmappe"):

Option Explicit

Dim bolStatusBar As Boolean
Dim bolFormulaBar As Boolean
Dim bolDisplayHorizontalScrollBar As Boolean
Dim bolDisplayVerticalScrollBar As Boolean
Dim bolStatusBarTemp As Boolean
Dim bolFormulaBarTemp As Boolean
Dim bolDisplayHorizontalScrollBarTemp As Boolean
Dim bolDisplayVerticalScrollBarTemp As Boolean
Dim strStatusBarTemp As String

Private Sub Workbook_Open()

Application.AskToUpdateLinks = False

With Application
.ScreenUpdating = False
bolStatusBar = .DisplayStatusBar
bolFormulaBar = .DisplayFormulaBar
End With

With ActiveWindow
bolDisplayHorizontalScrollBar = .DisplayHorizontalScrollBar
bolDisplayVerticalScrollBar = .DisplayVerticalScrollBar
End With

' Msgbox für mich zum Test #######################

MsgBox "bolStatusBar " & bolStatusBar & Chr(10) _
& "bolFormulaBar " & bolFormulaBar & Chr(10) _
& "bolDisplayHorizontalScrollBar " & bolDisplayHorizontalScrollBar & Chr(10) _
& "bolDisplayVerticalScrollBar " & bolDisplayVerticalScrollBar & Chr(10) _
& "bolStatusBarTemp " & bolStatusBarTemp & Chr(10) _
& "bolFormulaBarTemp " & bolFormulaBarTemp & Chr(10) _
& "bolDisplayHorizontalScrollBarTemp " & bolDisplayHorizontalScrollBarTemp & Chr(10) _
& "bolDisplayVerticalScrollBarTemp " & bolDisplayVerticalScrollBarTemp & Chr(10) _
& "strStatusBarTemp " & strStatusBarTemp

With Application
.DisplayStatusBar = True
End With

End Sub

################################################

Private Sub Workbook_BeforeClose(Cancel As Boolean)

With Application
.ScreenUpdating = False
.StatusBar = ""
.DisplayStatusBar = bolStatusBar
.DisplayFormulaBar = bolFormulaBar
End With

With ActiveWindow
.DisplayHorizontalScrollBar = bolDisplayHorizontalScrollBar
.DisplayVerticalScrollBar = bolDisplayVerticalScrollBar
End With

With Application
.ScreenUpdating = True
End With

End Sub

################################################

Private Sub Workbook_Activate()

With Application
.ScreenUpdating = False
.StatusBar = strStatusBarTemp
.DisplayStatusBar = bolStatusBarTemp
.DisplayFormulaBar = bolFormulaBarTemp
End With

With ActiveWindow
.DisplayHorizontalScrollBar = bolDisplayHorizontalScrollBarTemp
.DisplayVerticalScrollBar = bolDisplayVerticalScrollBarTemp
End With

With Application
.ScreenUpdating = True
End With

End Sub

################################################

Private Sub Workbook_Deactivate()

With Application
.ScreenUpdating = False
bolStatusBarTemp = .DisplayStatusBar
bolFormulaBarTemp = .DisplayFormulaBar
strStatusBarTemp = .StatusBar
.StatusBar = ""
.DisplayStatusBar = bolStatusBar
.DisplayFormulaBar = bolFormulaBar
End With

With ActiveWindow
bolDisplayHorizontalScrollBarTemp = .DisplayHorizontalScrollBar
bolDisplayVerticalScrollBarTemp = .DisplayVerticalScrollBar
.DisplayHorizontalScrollBar = bolDisplayHorizontalScrollBar
.DisplayVerticalScrollBar = bolDisplayVerticalScrollBar
End With

With Application
.ScreenUpdating = True
End With

End Sub

################################################

Außerdem habe ich EIN Tabellenblatt mit folgendem Code:

Option Explicit

Dim bolStatusBar As Boolean
Dim bolFormulaBar As Boolean
Dim bolDisplayHorizontalScrollBar As Boolean
Dim bolDisplayVerticalScrollBar As Boolean
Dim bolStatusBarTemp As Boolean
Dim bolFormulaBarTemp As Boolean
Dim bolDisplayHorizontalScrollBarTemp As Boolean
Dim bolDisplayVerticalScrollBarTemp As Boolean
Dim strStatusBarTemp As String

Private Sub Worksheet_Activate()

With Application
.ScreenUpdating = False
.DisplayFormulaBar = False
.DisplayStatusBar = False
End With

With ActiveWindow
.DisplayHorizontalScrollBar = False
.DisplayVerticalScrollBar = False
End With

With Application
.ScreenUpdating = True
End With

End Sub

################################################

Private Sub Worksheet_Deactivate()

With Application
.ScreenUpdating = False
End With

With ActiveWindow
.DisplayHorizontalScrollBar = True
.DisplayVerticalScrollBar = True
End With

With Application
.DisplayFormulaBar = True
.DisplayStatusBar = True
.ScreenUpdating = True
End With

End Sub

################################################

Warum funktioniert das denn nicht bzw. warum werden die Variablen, die ich am Anfang einlese immer wieder verändert (vermutlich ist das der Grund dafür ...).

Ständig habe ich unerwünschte Zustände - hauptsächlich bzgl. der Scrollbalken. Mal sind sie in anderen Dateien, zu denen ich wechsle, verschwunden, dann sind sie wieder in Tabellenblättern dieser Datei verschwunden.

Hoffentlich weiß jemand Rat. VIIIIELEN DANK auf jeden Fall schon mal.

Gruß
Jojo

2 Antworten

0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi,

folgendes Prinzip:

1. schreibe die Variablen als Public in ein allgemeines Modul
2. lies die eingestellten Eigenschaften beim Öffnen der Arbeitsmappe aus
3. stelle sie so ein wie du sie benötigst
4. setze die Eigenschaften beim Deaktivieren der Arbeitsmappe bzw. des Tabellenblattes sowie beim Schließen der Arbeitsmappe wieder zurück auf die Werte in den Variablen
5. beim Aktivieren der Arbeitsmappe bzw. des Tabellenblattes stellst du die Eigenschaften wieder so ein wie du sie benötigst.

Beispiel für das Einstellen der Berechnung auf Manuell:

Code im allgemeinen Modul
Option Explicit
Public lngBerechnung As Long

Code im Codemodul DieseArbeitsmappe
Option Explicit

Private Sub Workbook_Open()
lngBerechnung = Application.Calculation
Application.Calculation = xlCalculationManual
End Sub

Private Sub Workbook_Activate()
Application.Calculation = xlCalculationManual
End Sub

Private Sub Workbook_Deactivate()
Application.Calculation = lngBerechnung
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.Calculation = lngBerechnung
End Sub

und Code im betreffenden Tabellenblatt
Option Explicit

Private Sub Worksheet_Activate()
Application.Calculation = xlCalculationAutomatic
End Sub

Private Sub Worksheet_Deactivate()
Application.Calculation = xlCalculationManual
End Sub

Andere Möglichkeit - Variablen im Codemodul DieseArbeitsmappe dimensionieren und statt Code im Codemodul des Tabellenblattes das Workbook_SheetActivate und Workbook_SheetDeactivate Ereignis benutzen
Option Explicit
Dim lngBerechnung As Long

Private Sub Workbook_Open()
lngBerechnung = Application.Calculation
Application.Calculation = xlCalculationManual
End Sub

Private Sub Workbook_Activate()
Application.Calculation = xlCalculationManual
End Sub

Private Sub Workbook_Deactivate()
Application.Calculation = lngBerechnung
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.Calculation = lngBerechnung
End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
If Sh.Name = "Tabelle2" Then Application.Calculation = xlCalculationAutomatic
End Sub

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
Application.Calculation = xlCalculationManual
End Sub

Bis später,
Karin
0 Punkte
Beantwortet von
Hallo Karin,

wieder einmal hast du mich gerettet - VIELEN DANK!!!

Es lag also doch an der Deklaration - dachte ich mir irgendwie schon.

So ganz astrein bekommt man es allerdings wohl doch nicht hin, wenn man EIN Tabellenblatt hat, das keine der oben genannten Eigenschaften haben soll, während die anderen diese haben sollen. Denn beim Hin- und Her-Wechseln zwischen Dateien kommt es - abhängig davon, ob von dem EINEN Tabellenblatt oder von einem der anderen gewechselt wird - immer wieder zu "unerwarteten" Aktionen (bspw. ist plötzlich die FormularBar da - obwohl in das EINE Tabellenblatt zurückgesprungen wurde).

Aber wie gesagt: Es funktioniert schon so, wie ich es wollte.

Danke nochmal und noch einen schönen Tag, Gruß
Jojo
...