Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1144to1148
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
Inhaltsverzeichnis

activeWb.SaveAs funzt nicht wg. Workbook_BeforeSav

activeWb.SaveAs funzt nicht wg. Workbook_BeforeSav
norman
Hi alle,
ich haben eine XLA-Datei geschrieben, die bei jedem Start von Excel aktiv ist. In dieser XLA-Datei wird
Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
genutzt, um in einem zentralen DB-System einen Eintrag vorzunehmen und die Datei dann in der BeforeSave-Methode auch mit den bekannten Mitteln zu speichern. Ich führe also in BeforeSave das eigentliche Save aus und cancele dann BeforeSave, damit nicht noch mal gespeichert wird. Ist ja kein Hexcenwerk, wurde hier auch schon mehrfach beschrieben.
Funktioniert auch alles bestens für Standard-User, die ganz normal die Menüpunkte Datei / Speichern oder Datei / Speichern unter nutzen.
Aaaaaaber jetzt kommts: Ein User hat ein eigenes Makro geschrieben, in dem er ActiveWorkbook.SaveAs "C:\Test.xls" nutzt.
Interessanter Weise springt mein Workbook_BeforeSave ganz normal an und speichert die Datei, aber leider nicht unter C:\Test.xls, sondern unter dem aktuellen Dateinamen, und das ist nun ganz und gar nicht das was ich will. Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) übergibt ja leider keinen Dateinamen, sodass ich nur mit FullPath arbeiten kann. Da steht aber noch "der alte" Name drin. Wie komme ich jetzt an den neuen Dateiname C:\Test.xls?
Hat jemand eine Idee für dieses vertrackte Problem?
Viele Grüße und vielen Dank!
Norman
AW: activeWb.SaveAs funzt nicht wg. Workbook_BeforeSav
13.03.2010 21:59:44
Luschi
Hallo Norman,
die Übergabevariable 'SaveAsUI' verrät Dir doch, ob der SpeichernUnter-Befehl von der Benutzer-
oberfläche (True) oder per Vba (False) ausgelöst wurde.

If SaveAsUI Then 'normaler Standarduser
'das AddIn speichert
Else
'nicht per AddIn speichern, dann wirkt der Speichernbefehl des Makro-Users
End If
Cancel = SaveAsUI
Gruß von Luschi
aus klein-Paris
PS: Den Ort, wohin der MakroUser speichern will, wirst Du im AddIn wohl nicht ermitteln können.
AW: activeWb.SaveAs funzt nicht wg. Workbook_BeforeSav
14.03.2010 08:43:32
norman
Hi Luschi,
hm, komischer Weise ist SaveAsUI false, wenn man in VBA ActiveWorkbook.SaveAs nutzt, d.h. dass das so nicht klappt. Mit Deiner Idee hätte ich gut leben können, da man dann trotzdem die meisten Saves erwischt, aber ohne dass SaveAsUI true wird klappts nicht.
Bin für weitere Ideen dankbar.
Viele Grüße
Norman
Anzeige
vielleicht so, mit Application.OnTime
14.03.2010 10:02:09
Tino
Hallo,
ich weis zwar nicht was genau in Deinem Addin ablaufen soll,
aber vielleicht hilft Dir dies weiter.
Nicht ausgiebig getestet.
kommt als Code in DieseArbeitsmappe
Option Explicit 
Dim oKlasseExcel As Klasse1 
 
Private Sub Workbook_BeforeClose(Cancel As Boolean) 
   Set oKlasseExcel = Nothing 
End Sub 
 
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 
Application.EnableEvents = False 
    Cancel = True 
    ThisWorkbook.Save 
Application.EnableEvents = True 
End Sub 
 
Private Sub Workbook_Open() 
    Set oKlasseExcel = New Klasse1 
    Set oKlasseExcel.ExcelWatch = Application 
End Sub 
 
 
kommt als Code in Modul1
Option Explicit 
 
Sub SaveAsMe_() 
    MsgBox ActiveWorkbook.FullName 
End Sub 
kommt als Code in Klasse1
Option Explicit 
 
Public WithEvents ExcelWatch As Application 
 
Private Sub ExcelWatch_WorkbookBeforeSave(ByVal Wb As Workbook, ByVal SaveAsUI As Boolean, Cancel As Boolean) 
Application.OnTime Now + TimeSerial(0, 0, 1), "SaveAsMe_" 
End Sub 
Gruß Tino
Anzeige
AW: activeWb.SaveAs funzt nicht wg. Workbook_BeforeSav
15.03.2010 11:17:29
Luschi
Hallo Norman,
in dem Übergabeparameter 'SaveAsUI' bedeutet UI = UserInterface - d.h., wenn der User per Excel-Menü/Kontextmenü die Befehlsfolge 'Datei-SpeicherUnter' ausgelöst hat, dann hat diese Variable den Wert 'True'.
Bei ActiveWorkbook.SaveAs oder Thisworkbook.SaveAs hat diese Variable den Wert 'False' - und daran kannst Du doch feststellen ob, der Standard-User oder der Makro-User am wirken ist.
Gruß von Luschi
aus klein-Paris
AW: activeWb.SaveAs funzt nicht wg. Workbook_BeforeSav
15.03.2010 23:43:12
norman
Hallo ihr beiden, vielen Dank für Eure Hilfe!
Tino, ich denke mit Deinem Ansatz komme ich weiter, ich weiß aber noch nicht, was passiert, wenn die Excel Datei geschlossen wird und der Timer noch läuft, dann könnte das schief gehen. Ist echt zum Mäuse melken... Was ich natürlich probieren könnte ist, dass die Instanz im BeforeClose nicht auf nothing gesetzt wird, sondern im OnClose der neue Name (müsste ja da schon vorliegen) und einfach ein Flag in der Klasse, das anzeigt, dass die Excel-Datei weg ist. Dann müsste ich über einen weiteren Time ne GarbageCollection machen. ApplicationOnTimer gibts glaube ich nur ein mal, aber auch das könnte man steuern... Hm, ist auf alle Fälle was drin!
Luschi, SaveAsUI ist auch false, wenn der User einfach nur speichern drückt, das heißt ich bin nicht im Makro... Das klappt also nicht.
Viele Grüße
Norman
Anzeige
man könnte es so machen.
16.03.2010 08:53:42
Tino
Hallo,
ein weiteres Problem ist aber wenn die ganze Instanz geschlossen wird
regiert ExcelWatch_WorkbookBeforeSave nicht mehr.
Dafür habe ich noch keine Lösung gefunden. :-(
kommt als Code in DieseArbeitsmappe
Option Explicit 
Dim oKlasseExcel As Klasse1 
 
Private Sub Workbook_BeforeClose(Cancel As Boolean) 
  On Error Resume Next 
  Application.OnTime oTimer_, "SaveAsMe_", , False 
  Set oKlasseExcel = Nothing 
End Sub 
  
Private Sub Workbook_Open() 
    Set oKlasseExcel = New Klasse1 
    Set oKlasseExcel.ExcelWatch = Application 
End Sub 
 
kommt als Code in Modul1
Option Explicit 
Public oTimer_ As Date 
 
Sub SaveAsMe_() 
    MsgBox ActiveWorkbook.FullName 
End Sub 
kommt als Code in Klasse1
Option Explicit 
 
Public WithEvents ExcelWatch As Application 
 
Private Sub ExcelWatch_WorkbookBeforeSave(ByVal Wb As Workbook, ByVal SaveAsUI As Boolean, Cancel As Boolean) 
If Wb.FullName = ThisWorkbook.FullName Then Exit Sub 
If Not SaveAsUI Then 
    Call SaveAsMe_
Else 
    oTimer_ = Now + TimeSerial(0, 0, 1) 
    Application.OnTime oTimer_, "SaveAsMe_" 
End If 
End Sub 
Gruß Tino
Anzeige

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige