Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
640to644
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
640to644
640to644
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

beforeClose/beforeSave Endlosschlaufe verhindern

beforeClose/beforeSave Endlosschlaufe verhindern
25.07.2005 11:41:18
Manhart
Hallo Zusammen
Erneut rufe ich um Hilfe für ein mir noch nicht lösbares Problem.
in einem alten Tread habe ich um Hilfe für das Problem gebeten, leider noch ohne Lösung. Da dieser Tread nun sehr weit im unteren Bereich ist versuche ich das Problem neu zu beschreiben, eventuell war die erste Variante sehr schlecht formuliert.
wenn die Datei geschlossen ider gespeichert wird, sollte vorerst eine Prüfung stattfinden, danach die Datei gespeichert oder gegebenenfalls geschlossen werden.
Hier mein Versuch (leider nicht lauffähig)
Im Modul "Diese Arbeitsmappe" habe ich den folgenden Script:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
If Not schliessen_ok Then Cancel = True
'hier wollte ich die Procedur aufrufen, geht aber nicht
'SecureSave
'Cancel = True
End Sub


Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If Not schliessen_ok Then Cancel = True
'hier wollte ich wiederum die Procedur aufrufen, geht aber auch nicht
'SecureSave
'Cancel = True
End Sub

'in einem Normalen Modul den folgenden Code:
Option Explicit
Public schliessen_ok As Boolean
Public Sub SecureSave()
Dim Wsh, sh, qt As Object, BName As String
Dim Kennwort, KWort, FE
Dim x%
Dim Counter
Dim FilenameU14
Kennwort = "jajaja"
FilenameU14 = Sheets("Meldeblatt").Range("U14")
On Error GoTo Fehler
Application.EnableEvents = False
Counter = 0
'auf Querry Tabellen prüfen
For Each Wsh In ThisWorkbook.Worksheets
For Each qt In Wsh.QueryTables
Counter = Counter + 1
Next qt
Next Wsh
'auf Namensänderung prüfen
For x = 1 To 10
If ThisWorkbook.Name = "Vorlage Meldeblatt Event-Aktionen" & x & ".xls" Or _
ThisWorkbook.Name = "Vorlage Meldeblatt Event-Aktionen" & x Then
FE = "ja"
x = 10
End If
Next x
'auf zu viele Tabellenblätter prüfen
If ThisWorkbook.Sheets.Count > 2 Then
For Each sh In ThisWorkbook.Sheets
If sh.Name "Meldeblatt" And sh.Name "Querry" Then BName = "Treffer"
Next sh
If BName = "Treffer" Then
For Each sh In ThisWorkbook.Sheets
If sh.Name "Meldeblatt" And sh.Name "Querry" Then
Application.DisplayAlerts = False
sh.Delete
Application.DisplayAlerts = True
End If
Next sh
Else
MsgBox ("Die Datei enthält mehrere Blätter. " & _
"Es kann jedoch nur ein Blatt gespeichert werden. " & _
"Um die Datei speichern zu können, müssen Sie dem zu speichernden Blatt " & _
"den Namen " & Chr$(34) & "Meldeblatt" & Chr$(34) & " geben. Alle anderen Blätter " & _
"werden gelöscht. Kopieren Sie diese Blätter daher vor dem Speichern jeweils in " & _
"eine eigene Datei.")
End If
End If
If Counter > 0 Then
KWort = InputBox("VB-SCRIPT PROGRAMMING:" & Chr(10) & "DM-Planning-Team" & Chr(10) & Chr(10) & _
" Durch diese Aktion wird die Datenbankanbindung aus dem File entfernt, " & Chr(10) & _
" Aktivieren Sie diesen Schritt nur wenn die Erfassung , " & Chr(10) & _
" abgeschlossen ist und keine Änderungen mehr vorgenommen werden. " _
& Chr(10) & Chr(10) & "Geben Sie anschliessend bitte das Kennwort ein!")

If KWort Kennwort Then
MsgBox "Sie haben sich entschieden, das die Datei noch weiterbearbeitet wird." & Chr(10) & "Die Datei wird nun gespeichert!"
If FE = "ja" And (FilenameU14) 0 Then
Application.Dialogs(xlDialogSaveAs).Show (FilenameU14)
Else
Application.Dialogs(xlDialogSaveAs).Show (ThisWorkbook.Name)
End If
Application.EnableEvents = True
End
End If
'Sheets("Querry") QuerryTables Delete
Application.DisplayAlerts = False
With Sheets("Querry").Range("A1:M3")
.QueryTable.Delete
End With
With Sheets("Querry").Range("N1:O40")
.QueryTable.Delete
End With
With Sheets("Querry").Range("P1:T40")
.QueryTable.Delete
End With
Sheets("Meldeblatt").Select
Range("A1").Select
Application.DisplayAlerts = True
If FE = "ja" And (FilenameU14) 0 Then
Application.Dialogs(xlDialogSaveAs).Show (FilenameU14)
Else
Application.Dialogs(xlDialogSaveAs).Show (ThisWorkbook.Name)
End If
Else
If FE = "ja" And (FilenameU14) 0 Then
Application.Dialogs(xlDialogSaveAs).Show (FilenameU14)
Else
Application.Dialogs(xlDialogSaveAs).Show (ThisWorkbook.Name)
End If
schliessen_ok = True
Application.EnableEvents = True
End If
Fehler:
schliessen_ok = False
Application.EnableEvents = True
End Sub
Den Code hatte ich eigentlich zur besseren Darstellung für Euch Formatiert mit einrücken und Tabulator, aber es will einfach nicht im Forum so erscheinen Sorry.
Besten Dank all denen die mir dabei helfen wollen.
Gruss
Martin

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: beforeClose/beforeSave Endlosschlaufe verhinde
25.07.2005 12:31:02
Ramses
Hallo
du verwendest eine falsche Syntax

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Cancel = True
SecureSave
End Sub

Ausserdemn muss Cancel = True natürlich vor dem Aufruf der Prozedur kommen
Das funktioniert bei mir einwandfrei :-)
Gruss Rainer
AW: beforeClose/beforeSave Endlosschlaufe verhinde
25.07.2005 12:43:44
Manhart
Hallo Rainer
SecureSave soll nur dann ausgeführt werden wenn das Dokument noch nicht gespeichert wurde.
Aus diesem Grund wollte ich mit der Variable "speichern_ok" den Status nach erfolgtem SecureSave auuf Treu setzen. Aus diesem Grund frage ich am beginn von "beforeSave" und beforeClose" den Status von "speichern_ok" ab.
Vieleicht gibt es da einen einfacheren Weg.
Gruss
Martin
PS bei mir hat es immer eine Fehlermeldung gegeben wenn ich im beforeSave/beforeClose das "SecureSave" aufrufe: Variable oder xx erwartet anstelle eines Moduls.
Irgend etwas mache ich da falsch...
Anzeige
AW: beforeClose/beforeSave Endlosschlaufe verhinde
25.07.2005 13:19:31
Hajo_Zi
Hallo Martin,
ob die Datei gespeichet wurd bekommst Du mit ThisWorkbook.Saved raus.
Bitte keine Mail, Probleme sollten im Forum gelöst werden.
Microsoft MVP für Excel
Das Forum lebt auch von den Rückmeldungen.
Betriebssystem XP Home SP2 und Excel Version 2003 SP1.


AW: beforeClose/beforeSave Endlosschlaufe verhindern
25.07.2005 13:19:28
Berber
Hallo,
ein kurzer Hinweis ohne Garantie auf Erfolg
If Not schliessen_ok Then
SecureSave
Cancel = True
end if
Erst Prozedur aufrufen, dann Cancel.
Vermutlich wird der Code hinter Cancel=True nicht mehr ausgeführt.
Gruss
Berber
Anzeige
AW: beforeClose/beforeSave Endlosschlaufe verhindern
25.07.2005 13:50:49
Manhart
Danke viel tausen Mal.
Die Lösung war ein Mix aus der Antwort von Hajo_Zi und Berber.
Ebenfalls hatte ich das Modul Dummerweise wie die Prozedur getauft, desshalb habe ich die Fehlermeldung: "Variable oder Prozedur anstelle eines Moduls erwartet!" erhalten.
Jetzt klappt alles bestens habe folgendermassen umgesetzt. Danke Exelianer und trozdem noch eine Frage: muss ich die Application.EnableEvents = False/True in den Script einfügen? es läuft auch ohne aber wer weiss wenn Murphys Law eintritt?

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.EnableEvents = False
If ThisWorkbook.Saved = True Then
Cancel = True
ThisWorkbook.Close
Else
Cancel = True
SecureSave
ThisWorkbook.Close
End If
Application.EnableEvents = True
End Sub


Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Application.EnableEvents = False
If ThisWorkbook.Saved = True Then
Cancel = True
Else
Cancel = True
SecureSave
End If
Application.EnableEvents = True
End Sub

Anzeige
Danke für die Mithilfe
25.07.2005 16:22:30
Manhart


      
Hallo Zusammen
Danke für Eure Mithilfe , habe das Problem folgendermassen gelöst.
'In diese Arbeitsmappe eingefügt:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    
If ThisWorkbook.Saved = False Then
        SecureSave
    
End If
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    
If ThisWorkbook.Saved = True Then
        Cancel = 
True
    
Else
        Cancel = 
True
        SecureSave
    
End If
End Sub
'In einem Normalen Modul eingefügt:
Option Explicit
Public Sub SecureSave()
Dim Wsh, sh, qt As Object, BName As String
Dim Kennwort, KWort, FE
Dim x%
Dim Counter
Dim FilenameU14
    Kennwort = "jajaja"
    FilenameU14 = Sheets("Meldeblatt").Range("U14")
On Error GoTo Fehler
   Application.EnableEvents = 
False
Counter = 0
'auf Querry Tabellen prüfen
For Each Wsh In ThisWorkbook.Worksheets
          
For Each qt In Wsh.QueryTables
               Counter = Counter + 1
          
Next qt
        
Next Wsh
'auf Namensänderung prüfen
For x = 1 To 10
        
If ThisWorkbook.Name = "Vorlage Meldeblatt Event-Aktionen" & x & ".xls" Or _
        ThisWorkbook.Name = "Vorlage Meldeblatt Event-Aktionen" & x 
Then
            FE = "ja"
            x = 10
        
End If
Next x
'auf zu viele Tabellenblätter prüfen
If ThisWorkbook.Sheets.Count > 2 Then
   
For Each sh In ThisWorkbook.Sheets
      
If sh.Name <> "Meldeblatt" And sh.Name <> "Querry" Then BName = "Treffer"
   
Next sh
   
If BName = "Treffer" Then
      
For Each sh In ThisWorkbook.Sheets
         
If sh.Name <> "Meldeblatt" And sh.Name <> "Querry" Then
            Application.DisplayAlerts = 
False
            sh.Delete
            Application.DisplayAlerts = 
True
         
End If
      
Next sh
   
Else
      MsgBox ("Die Datei enthält mehrere Blätter. " & _
         "Es kann jedoch nur ein Blatt gespeichert werden. " & _
         "Um die Datei speichern zu können, müssen Sie dem zu speichernden Blatt " & _
         "den Namen " & Chr$(34) & "Meldeblatt" & Chr$(34) & " geben. Alle anderen Blätter " & _
         "werden gelöscht. Kopieren Sie diese Blätter daher vor dem Speichern jeweils in " & _
         "eine eigene Datei.")
   
End If
 
End If
If Counter > 0 Then
KWort = InputBox("VB-SCRIPT PROGRAMMING:" & Chr(10) & "DM-Planning-Team" & Chr(10) & Chr(10) & _
" Durch diese Aktion wird die Datenbankanbindung aus dem File entfernt, " & Chr(10) & _
" Aktivieren Sie diesen Schritt nur wenn die Erfassung , " & Chr(10) & _
" abgeschlossen ist und keine Änderungen mehr vorgenommen werden. " _
& Chr(10) & Chr(10) & "Geben Sie anschliessend bitte das Kennwort ein!")
If KWort <> Kennwort Then
    MsgBox "Sie haben sich entschieden, das die Datei noch weiterbearbeitet wird." & Chr(10) & "Die Datei wird nun gespeichert!"
      
If FE = "ja" And (FilenameU14) <> 0 Then
            Application.Dialogs(xlDialogSaveAs).Show (FilenameU14)
          
Else
            Application.Dialogs(xlDialogSaveAs).Show (ThisWorkbook.Name)
      
End If
  Application.EnableEvents = 
True
  
GoTo Fehler
End If
   
'Sheets("Querry").Select
    Application.DisplayAlerts = False
    
With Sheets("Querry").Range("A1:M3")
     .QueryTable.Delete
    
End With
    
With Sheets("Querry").Range("N1:O40")
     .QueryTable.Delete
    
End With
    
With Sheets("Querry").Range("P1:T40")
     .QueryTable.Delete
    
End With
    Sheets("Meldeblatt").Select
    Range("A1").Select
    Application.DisplayAlerts = 
True
    
If FE = "ja" And (FilenameU14) <> 0 Then
            Application.Dialogs(xlDialogSaveAs).Show (FilenameU14)
          
Else
            Application.Dialogs(xlDialogSaveAs).Show (ThisWorkbook.Name)
      
End If
    Application.EnableEvents = 
True
Else
    
If FE = "ja" And (FilenameU14) <> 0 Then
            Application.Dialogs(xlDialogSaveAs).Show (FilenameU14)
          
Else
            Application.Dialogs(xlDialogSaveAs).Show (ThisWorkbook.Name)
      
End If
End If
Fehler:
    Application.EnableEvents = 
True
End Sub
Bis auf ein neues
Martin 


Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige