Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema Userform
BildScreenshot zu Userform Userform-Seite mit Beispielarbeitsmappe aufrufen

Workbook_beforeClose umgehen

Betrifft: Workbook_beforeClose umgehen von: Buerger
Geschrieben am: 21.01.2008 11:51:10

Hallo aus China :o)



ich verzweifle schon seit Tagen an einem VBA-Problem:



Ich habe einen VBA-Code, der eine Workbook_BeforeClose-Prozedur enthaelt. Nun moechte ich, dass nach dem Ansteuern einer bestimmten Prozedur X das aktive Excel-Dokument geschlossen wird:



actualfilename = Application.ActiveWorkbook.Name

Workbooks(actualfilename).Close



Das Problem: die Workbook_BeforeClose-Prozedur haengt sich hier immer auf, weil ich noch einen Wert in der zu schliessenden Datei speichern will.



Worksheets("milestones").Cells(4, 6).Value = Now



Dieser Wert muss aber nicht gespeichert werden, wenn ich die Prozedur X aufrufe.



1) Am besten waere es, wenn ich in der Prozedur X einen Befehl schreiben koennte, der das Ausfuehren der Workbook_BeforeClose-Prozedur verhindert. Kann mir jemand helfen?



2) Oder gibt es eine Alternative zum Close-Befehl, der die Workbook_BeforeClose-Prozedur vor dem Schliessen abarbeitet? (QUIT funktioniert leider nur fuer "Application").



Folgende Loesungen funktionieren nicht:



Loesung 1:

Application.quit

- Excel darf nicht geschlossen werden, weil ein anderes Dokument noch offen ist



Loesung 2:

if-then-Beziehung in der Workbook_BeforeClose-Prozedur (ich definiere in der Prozedur x, dass eine public-Variable=1 ist und setze den Inhalt der Workbook_BeforeClose-Prozedur in

if x=1 then

...

end if)

- funktioniert nicht, wahrscheinlich ist der Speicher schon geloescht. Alles zw. if und then wird immer abgearbeitet.



Besten Dank

Marco

  

Betrifft: AW: Workbook_beforeClose umgehen von: Hajo_Zi
Geschrieben am: 21.01.2008 11:58:56

Hallo Marco,

wenn mit weniger Leerzeilen gearbeitet wird ist der Beiitrag übersichtlicher.
Definiere eine Varable



































































If BoVariable Then Cancel = True

ich vermute es ist Dir jetzt auch aufgefallen das man es scjlecht lesen kann,, falls Du bis hierher gelaufen bist
.
GrußformelHomepage


  

Betrifft: AW: Workbook_beforeClose umgehen von: Buerger
Geschrieben am: 21.01.2008 12:23:12

Hallo Hajo,
danke fuer die schnelle Antwort. Sorry fuer die Leerzeichen, aber das war mein erster Forumseintrag :o)
Hab es versucht mit If BoVariable Then Cancel = True, aber es hat nicht funktioniert. BoVariable ist meine Variable (so nehm ich es an). Diese habe ich platzsparend als Byte deklariert (private bovariable as byte) und dann habe ich in meine Prozedur X folgendes geschrieben bovariable=1 und dann in der Workbook_BeforeClose-Prozedur If BoVariable=1 Then Cancel = True. Auch habe ich dies in die Prozedur X kopiert, als es nicht funktioniert hat. Was ist falsch?
Danke
Marco


  

Betrifft: AW: Workbook_beforeClose umgehen von: Hajo_Zi
Geschrieben am: 21.01.2008 12:45:04

Hallo Marco,

ich vermute als Private ist falsch. Dein Makro läuft bestimmt in einem Modul also als Public definieren. Boolean war korrekt.
mit dem setzen ist das koorekt ich hätte aber BoVariable =True geschrieben.

Gruß Hajo


  

Betrifft: AW: Workbook_beforeClose umgehen von: Buerger
Geschrieben am: 21.01.2008 16:18:58

Hallo Hajo,
danke fuer die schnelle Antwort. Hmm, irgendwie komm ich nicht weiter. Sorry, das mit dem Private war natuerlich Quatsch ... ein Schreibfehler.
Nur zum Verstaendnis: Umgeht dein If bovariable=true then cancel=true die Worksheet_BeforeClose-Prozedur oder fuehrt sie dazu, dass die Prozedur richtig abgearbeitet wird (weil cancel=true)? Und in welche Prozedur soll ich das schreiben (x oder Worksheet_BeforeClose)?
Wenn ich das in meine Prozedur x schreibe, macht es doch keinen Sinn, wenn ich erst schreibe
BoVariable=true
ActiveWorkbook.Close
if BoVariable=true then cancel=true

dann kann ich doch gleich schreiben cancel=true.
Danke!
Marco


  

Betrifft: AW: Workbook_beforeClose umgehen von: Hajo_Zi
Geschrieben am: 21.01.2008 16:20:58

Hallo Marco,

die Zeile hast Du schon als erste Zeile in BeforeClose eingefügt?

Gruß Hajo


  

Betrifft: AW: Workbook_beforeClose umgehen von: Buerger
Geschrieben am: 21.01.2008 16:30:03

Hallo Hajo,

das geht ja wie im Flug mit der Antwort! DANKE!
Das Makro stoppt in Zeile 4 und sagt, dass die Zellen gesperrt sind. Dieser Fehler tritt aber nicht regulaer auf, sondern nur wenn ich in Prozedur X schreibe:
ActualWorkbook.Close
Und ich habe es ja in Zeile 3 entsperrt ... warum also der Fehler?

Private Sub Workbook_BeforeClose(Cancel As Boolean)
If bovariable = True Then Cancel = True
Worksheets("milestones").Unprotect ("***")
Worksheets("milestones").Cells(4, 6).Value = Now
Worksheets("milestones").Protect ("***")
Application.Visible = False
Worksheets("Error").Visible = True
Worksheets("expenses").Visible = xlSheetVeryHidden
Worksheets("milestones").Visible = xlSheetVeryHidden
Worksheets("data").Visible = xlSheetHidden

ThisWorkbook.Save

End Sub




  

Betrifft: AW: Workbook_beforeClose umgehen von: Hajo_Zi
Geschrieben am: 21.01.2008 16:35:27

Hallo Marco,

die Zeile 4 hat aber nichts mit meinem Vorschlag zu tun?. Eine Datei sagt manchmal mehr als tausend Worte. Die Zeile 4 wird in meinem Fall nicht ausgeführt.

Gruß Hajo


  

Betrifft: AW: Workbook_beforeClose umgehen von: Buerger
Geschrieben am: 21.01.2008 16:46:02

Hallo Hajo,
noch ein Versuch:

zuerst habe ich definiert:
public bovariable as boolean

im Modul steht dann
...
bovariable = True
ActiveWorkbook.Save
ActiveWorkbook.Close
Workbooks.Open ("C:\xxx")
Workbooks(actualfilename).Close

End Select
End Sub


und dann in DieseArbeitsmappe steht der besagte Worksheet_BeforeClose-Befehl.

Marco


  

Betrifft: AW: Workbook_beforeClose umgehen von: Hajo_Zi
Geschrieben am: 21.01.2008 16:57:38

Hallo Marco,

die Variable ist aber nur im Modul definiert im Modul.
Ich habe es nochmal getestet schreibe für Cancel=True den Befehl Exit sub

Gruß Hajo


  

Betrifft: AW: Workbook_beforeClose umgehen von: Buerger
Geschrieben am: 21.01.2008 17:17:31

Hallo Hajo,
DANKE! Ich habe die Prozedur aus dem Modul in DieseArbeitsmappe kopiert und nun funktioniert es :o)
Beste Gruesse aus China und dir einen schoenen Abend. Bei uns ist es jetzt Mitternacht ...
Marco


  

Betrifft: AW: Workbook_beforeClose umgehen von: Buerger
Geschrieben am: 22.01.2008 05:36:14

Hallo,
zu frueh gefreut :o(
Meine Prozedur kann ich nicht in DieseArbeitsmappe kopieren. Ich habe das Makro nochmals getestet und es funktioniert nur im Modul.
Wie kann ich eine Variable aus einem Modul in DieseArbeitsmappe uebergeben?
So ein Code (wie Daniel ihn vorgeschlagen hat) waer ein Traum. Der muesste aber auch unter Excel2007 funktionieren ...
Danke!
Marco


  

Betrifft: AW: Workbook_beforeClose umgehen von: Hajo_Zi
Geschrieben am: 22.01.2008 09:41:40

Hallo Marco,

ich lehne es ab über das Internet auf fremde Rechner zu schauen. Darum sehe ich nicht wo Dein Code ist. Bei richtiger Stelle geht der Code auch. Ansonsten siehe Antwort auf Daniel sein Beitrag.

Gruß Hajo


  

Betrifft: AW: Workbook_beforeClose umgehen von: Buerger
Geschrieben am: 22.01.2008 10:29:59

Hallo Hajo,
das mit Saved=true hat nicht geholfen. Anbei mein Code ... Danke fuer deine Geduld :o)

Im Modul steht:

public BoVariable as Boolean (hab es auch in DieseArbeitsmappe probiert)
Sub AAA()
Dim pn As Integer
Dim actualfilename As String
...
actualfilename = Application.ActiveWorkbook.Name
ActiveWorkbook.Worksheets("data").Activate
pn = Worksheets("data").Cells(3, 9).Value
ActiveSheet.Columns("A:BT").Copy
Set fs = CreateObject("Scripting.FileSystemObject")
Select Case fs.FileExists("X:xxx")
Case False
....
Case True
BoVariable=true
Workbooks.Open ("X:\xxx")
ActiveWorkbook.Worksheets("data").Columns("A:BT").PasteSpecial xlPasteAll
ActiveWorkbook.Save
ActiveWorkbook.Close
Workbooks.Open ("X:\xxx")
Workbooks(actualfilename).Saved = True
Workbooks(actualfilename).Close
End Select
End Sub



In DieseArbeitsmappe steht:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
If BoVariable = True Then Exit Sub
Worksheets("milestones").Unprotect ("xxx")
Worksheets("milestones").Cells(4, 6).Value = Now
Worksheets("milestones").Protect ("xxx")
ThisWorkbook.Save
Application.Visible = False
Worksheets("Error").Visible = True
Worksheets("expenses").Visible = xlSheetVeryHidden
Worksheets("milestones").Visible = xlSheetVeryHidden
Worksheets("data").Visible = xlSheetHidden
ThisWorkbook.Save
Application.Visible = True
End Sub




  

Betrifft: AW: Workbook_beforeClose umgehen von: Hajo_Zi
Geschrieben am: 22.01.2008 10:54:45

Hallo Marco,

für mich ist die Diskussion beendet. Ich habe nun schon paar mal geschrieben das ich nicht über das Internet auf fremde Rechner schaue bzw. das ich Deine Datei nicht sehe. Du willst es aber nicht beseitigen.
Bei Deinem Level gehe ich davon aus das Du den Code an die richtige Stelle kopiert hast. Was aus Deinen Beiträgen aber nicht sein kann. Dann versuche mal selber das Problem zu lösen.

Gruß Hajo


  

Betrifft: AW: Workbook_beforeClose umgehen von: Daniel
Geschrieben am: 21.01.2008 22:46:56

Hi
kleiner Tipp:

wenn du eine Datei per Makro schließen willst, ohne das das Before_Close-Makro ausgeführt wird, geht das einfach so

Application.EnableEvents = False
Workbooks("DeineDatei.xls").Close
Application.EnableEvents = True



Gruß, Daniel


  

Betrifft: AW: Workbook_beforeClose umgehen von: Hajo_Zi
Geschrieben am: 21.01.2008 23:05:05

Hallo Daniel,

ich wurde gerade vor kuzrzem darauf hingewiesen das Application.EnableEvents = True nicht mehr ausgeführt wird. Ich habe es jetzt nun nur in 2007 getestet.


Gruß Hajo


  

Betrifft: AW: Workbook_beforeClose umgehen von: Daniel
Geschrieben am: 22.01.2008 00:06:25

Hi
danke für den Hinweis.
bedeutet das, das zukünftig alle Events über Abfrage einer Steuervariable im Code selbst deaktiviert werden müssen, so wie es in ExcelXP schon bei den Userform-Events ist?

das wäre aber ne ziemliche Umstellnung
da muss dann einiges an Code umgeschrieben werden.

Gruß, Daniel


  

Betrifft: AW: Workbook_beforeClose umgehen von: Hajo_Zi
Geschrieben am: 22.01.2008 09:39:33

Hallo Daniel,

es gibt auch die Möglichkit .Saved = True, dann wird BeforeClose auch nicht ausgeführt, da Datei nicht verändert. Das habe ich jetzt aber nicht getestet.

Gruß Hajo


  

Betrifft: AW: Workbook_beforeClose umgehen von: Daniel
Geschrieben am: 22.01.2008 20:19:09

Hi
verwechselst du hier nicht BeforeSave mit BeforeClose ?

Gruß, Daniel


  

Betrifft: AW: Workbook_beforeClose umgehen von: Hajo_Zi
Geschrieben am: 22.01.2008 22:23:06

Hallo Daniel,

das kann man auch in dem Makro schreiben.

Gruß Hajo


  

Betrifft: AW: Workbook_beforeClose umgehen von: Daniel
Geschrieben am: 23.01.2008 01:15:56

Hi
also ich bin mir ziemlich sicher, das BeforeClose auch dann ausgeführt wird, wenn .Saved = True ist.

Gruß, Daniel