Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1484to1488
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
Speichern unter via VBA
07.04.2016 09:38:56
Christian
Guten Morgen liebe Forumgemeinde!
Ich möchte beim Speichern den Pfad und auch Dateinamen sowie Dateityp vorbelegen - dies habe ich bereits mit u.a. Coding realisiert:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim varRetVal As Variant, strInitFileName As String, Datname As String
Dim Pfad As String
Pfad = Environ("Userprofile") & "\Documents\"
Datname = " FB BE - 311-1" & " " & Sheets("Zusammenfassung (BL2)").Range("D1").Text & " " &  _
Sheets("Deckblatt (BL1)").Range("F12").Text & " " & Sheets("Deckblatt (BL1)").Range("F7").Text & ".xlsm"
varRetVal = Application.GetSaveAsFilename( _
InitialFileName:=Pfad & Datname, _
FileFilter:="Microsoft Excel-Dateien (*.xlsm), *.xlsm", _
Title:="Datei speichern unter... ")
If varRetVal = False Then Exit Sub
ActiveWorkbook.SaveAs varRetVal
End Sub
Aber irgendwie funktioniert das nicht, weil nach dem vorbelegten Speichern der Dialog nochmal gerufen wird - ich möchte, dass der Standarddialog nur kommt, wenn ich bei dem vorbelegtem Speichern abbreche...
Bitte um Eure Unterstützung - Danke!
Lg

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Speichern unter via VBA
07.04.2016 10:41:38
Steve
Hallo Chris,
das Problem ist, dass du beim Speichern bist und den Dialog aufrufst, aber das eigentliche Speichern (wo Excel seinen Dialog aufrufen will) nicht abbrichst. Zudem ruft das SpeichernUnter von dir wieder das BevoreSave-Event auf und damit noch einen Dialog und noch einen usw. bis Excel sich verabschiedet (zumindest bei mir).
Fazit: Erstes Speichern abbrechen und deinen Dialog rufen, zweites Speichern (dein Dialog) zulassen.
Das Speichern abbrechen funktioniert via Cancel = True, jedoch musst du eingrenzen wann es das macht und wann nicht, sonst wirst du nie speichern können. Daher eine auf öffentliche boolsche Variable nehmen (Standard False) und deinen Speichern Dialog 'samt Cancel nur ausführen lassen wenn diese Falsch ist. Variable vor dem Dialogaufruf auf alle Fälle auf Wahr setzen, da das zweite BeforeSave sofort beginnt sobald du speicherst und erst danach das erste zuende geführt wird.
Damit deine Variable nicht auf Wahr bleibt musst du sie im AfterSave-Event wieder auf den Ausgangswert zurücksetzen. Du kannst die Stop-Befehle ja zum Probieren wieder entkommentieren um die Abfolge auszuprobieren.
lg Steve
Dim bSecondTime As Boolean
Private Sub Workbook_AfterSave(ByVal Success As Boolean)
'Stop
bSecondTime = False
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim varRetVal As Variant, strInitFileName As String, Datname As String
Dim Pfad As String
Pfad = Environ("Userprofile") & "\Documents\"
'Stop
If bSecondTime = False Then
bSecondTime = True
Cancel = True
Datname = " FB BE - 311-1" & " " & Sheets("Zusammenfassung (BL2)").Range("D1").Text & " " &  _
_
Sheets("Deckblatt (BL1)").Range("F12").Text & " " & Sheets("Deckblatt (BL1)").Range("F7").Text & _
".xlsm"
varRetVal = Application.GetSaveAsFilename( _
InitialFileName:=Pfad & Datname, _
FileFilter:="Microsoft Excel-Dateien (*.xlsm), *.xlsm", _
Title:="Datei speichern unter... ")
If varRetVal = False Then Exit Sub
ActiveWorkbook.SaveAs varRetVal, FileFormat:=52
End If
End Sub

Anzeige
AW: Speichern unter via VBA
07.04.2016 12:04:42
Christian
Hey Steve,
das funktioniert schon mal sehr gut - besten Dank!!!
Was muss ich ändern, damit das wie folgt funktioniert:
Beim Drücken vom "Speichern unter" soll zuerst mein vorbelegter Dialog kommen;
wenn ich speichere, dann ist nachher Schluss; falls ich abbreche, soll der Standard-Speichern-Dialog kommen.
Derzeit kommt zuerst mein vorbelegter Dialog - wenn ich jedoch dann abbreche, kommt nur noch der Standard-Dialog, egal wie oft ich "Speichern unter" drücke...
Ich hoffe Du verstehst was ich meine...
Danke!
Lg

AW: Speichern unter via VBA
07.04.2016 13:44:20
Steve
Hallo Chris,
dazu musst du mir wahrscheinlich erstmal ein bisschen was zum Hintergrund der Geschichte erklären, denn so richtig verstehe ich nicht was du damit bezwecken willst. Was ist das Ziel des ganzen, eventuell können wir das vereinfachen. Mittlerweile habe ich nämlich den Verdacht dass du auf was anderes hinaus willst als ich mir gedacht habe, sodass das ganze Konstrukt sich mehr und mehr aufbläht.
Dass du deinen eigenen Aufruf mit eingestellten Ordner und Namen haben möchtest ist nicht gerade unüblich. Jedoch kann man den Ordner auch angeben indem man einfach das Verzeichnis mit ChDir(Pfad) wechselt. Den vorgegebenen Namen erreicht man indem man der Vorlage einen vernünftigen gibt wo nur noch z.B. ein Datum angehängt werden muss. Dann erspart man sich den ganzen Aufwand mit Cancel und mehreren Durchläufen.
Oder aber du packst dir einen Button in deine Mappe mit der du deinen eigenen SpeichernUnter-Aufruf erzeugst und lässt dafür den exceleigenen in Ruhe. Mit dem selbgebastelten kannst du dann wieder alles frei vorgeben wir gehabt.
lg Steve

Anzeige
AW: Speichern unter via VBA
07.04.2016 14:52:19
Christian
Hi Steve,
erstmal danke, dass Du Dir für mein Problem Zeit nimmst!
Ich möchte vorher den vorbelegten Dialog, da ja das File nach den Vorgaben (Pfad + Name + Dateityp "xlsm") gespeichert werden soll.
Beim Abbruch dieses Dialogs soll der Standarddialog kommen, da ich ansonsten keine Möglichkeit mehr hätte, meine Optimierungen in der Vorlage - also .xltm - zu speichern.
Weißt was ich meine?
Glg,
Chrisi

AW: Speichern unter via VBA
07.04.2016 14:58:54
Christian
Auch hier nochmal der Link zum File:
https://www.herber.de/bbs/user/104824.xlsm
Besten Dank im Voraus!
Glg,
Chrisi

Anzeige
AW: Speichern unter via VBA
07.04.2016 15:10:33
Steve
Hallo Christian,
ok, verstanden. Dann habe ich einen anderen Vorschlag für dich:
Option Explicit
Dim bSecondTime As Boolean
Private Sub Workbook_AfterSave(ByVal Success As Boolean)
'Stop
bSecondTime = False
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim varRetVal As Variant, strInitFileName As String, Datname As String
Dim Pfad As String
Pfad = Environ("Userprofile") & "\Documents\"
'Stop
If SaveAsUI Then
If bSecondTime = False Then
bSecondTime = True
Cancel = True
Datname = " FB BE - 311-1" & " " & Sheets("Zusammenfassung (BL2)").Range("D1").Text _
& " " & Sheets("Deckblatt (BL1)").Range("F12").Text _
& " " & Sheets("Deckblatt (BL1)").Range("F7").Text & ".xlsm"
varRetVal = Application.GetSaveAsFilename( _
InitialFileName:=Pfad & Datname, _
FileFilter:="Microsoft Excel-Dateien (*.xlsm), *.xlsm", _
Title:="Datei speichern unter... ")
If varRetVal = False Then Exit Sub
ActiveWorkbook.SaveAs varRetVal, FileFormat:=52
End If
End If
End Sub
Der Teil "überschreibt" den Standard-Dialog permanent. Solltest bei deiner Vorlage Strg+S drücken oder in der am Ende gespeicherten Datei erneut SpeichernUnter über das Register Datei aufrufen spielt dabei keine Rolle. Er erkennt den Unterschied zws. normalem Speichern und dem SpeichernUnter-Dialog an dem Parameter SaveAsUI. Normales Speichern nach Abspeichern der Vorlage unter neuem Namen löst also keinen SpeichernUnter-Dialog mehr aus.
Das ganze findet in einem Ereignis (Event) statt, welches beim Speichern ausgelöst wird. Jetzt habe ich aber die Möglichkeit Events zu deaktivieren und somit dir die Chance zu geben deine Mappe wieder als .xltm zu speichern über den alten Dialog:
Sub NeuerSpeicherDialogEinAus()
With Application
.EnableEvents = Not .EnableEvents
MsgBox "Neuer Dialog Ein = " & .EnableEvents
End With
End Sub
Wenn Excel komplett geschlossen wird sind die Events auf alle Fälle wieder aktiv. Er speichert das also nicht mit. Ein normaler Nutzer wird auch nie auf die Idee kommen zu schauen welche Makros du hinterlegt hast, wenn sie Makros benutzen dann nur wenn du einen Button auf das Blatt gepackt hast. Damit bist du also relativ sicher gegen Unfug auch ohne das Makro zu verstecken.
lg Steve

Anzeige
AW: Speichern unter via VBA
07.04.2016 15:37:45
Christian
Hey Steve,
das ging ja schnell - das erste Coding habe ich ja unter "Diese Arbeitsmappe" eingefügt - wo kommt das neue Coding "Sub NeuerSpeicherDialogEinAus" hin? Modul1 oder im Anschluss des ersten Codings?
Ich habe schon beides probiert, aber an dem Verhalten hat sich nichts geändert - d.h. einmal den vorbelegten Dialog abgebrochen, kommt immer der Standarddialog...
Danke.
Lg

AW: Speichern unter via VBA
08.04.2016 06:29:39
Christian
Guten Morgen Steve,
so ich hab es nun verstanden, jedoch kommt der vorbelegte Dialog nach wie vor nur 1 mal - wenn man abbricht, kommt nur mehr der Standarddialog und das möchte ich ja nicht - deine Idee war ein Schalter den ich als Entwickler zum Speichern aktiviere - oder?
Vielleicht kannst Dir das nochmal ansehen - Danke!
Glg,
Chrisi

Anzeige
AW: Speichern unter via VBA
08.04.2016 06:29:48
Christian
Guten Morgen Steve,
so ich hab es nun verstanden, jedoch kommt der vorbelegte Dialog nach wie vor nur 1 mal - wenn man abbricht, kommt nur mehr der Standarddialog und das möchte ich ja nicht - deine Idee war ein Schalter den ich als Entwickler zum Speichern aktiviere - oder?
Vielleicht kannst Dir das nochmal ansehen - Danke!
Glg,
Chrisi

AW: Speichern unter via VBA
08.04.2016 06:38:48
Christian
Guten Morgen Steve,
ich habe nun verstanden, dass das Zusatzcoding nur ein Schalter für den Entwickler sein soll - der vorbelegte Dialog kommt jedoch nach wie vor nur 1 mal (ausgehend von einem XLTM) - wenn ich abbreche, kommt nur mehr der Standarddialog egal wie oft ich dann "Speichern unter" drücke...
Vielleicht kannst Dir das Ganze nochmal ansehen (konnte leider nur ein xlsm anstatt hochladen):
https://www.herber.de/bbs/user/104835.xlsm
Danke!
Glg,
Chrisi

Anzeige
AW: Speichern unter via VBA
08.04.2016 07:39:53
Christian
Hi Steve,
ist erledigt - siehe fett markierter Teil im Coding:
Option Explicit
Dim bSecondTime As Boolean
Private Sub Workbook_AfterSave(ByVal Success As Boolean)
'Stop
bSecondTime = False
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim varRetVal As Variant, strInitFileName As String, Datname As String
Dim Pfad As String
Pfad = Environ("Userprofile") & "\Documents\"
'Stop
If SaveAsUI Then
If bSecondTime = False Then
bSecondTime = False
Cancel = True
Datname = " FB BE - 311-1" & " " & Sheets("Zusammenfassung (BL2)").Range("D1").Text  _
_
& " " & Sheets("Deckblatt (BL1)").Range("F12").Text _
& " " & Sheets("Deckblatt (BL1)").Range("F7").Text & ".xlsm"
varRetVal = Application.GetSaveAsFilename( _
InitialFileName:=Pfad & Datname, _
FileFilter:="Microsoft Excel-Dateien (*.xlsm), *.xlsm", _
Title:="Datei speichern unter... ")
If varRetVal = False Then Exit Sub
ActiveWorkbook.SaveAs varRetVal, FileFormat:=52
End If
End If
End Sub

Trotzdem Danke für deine Bemühungen - Du hast mir echt sehr geholfen!
Schönes WE!
Lg
Anzeige

303 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige