Supportnet Computer
Planet of Tech

Supportnet / Forum / Tabellenkalkulation

Datei speichernunter /speichern / beenden





Frage

Hallo zusammen, ich habe eine Dateivorlage (.xlt), die eine Dateneingabemaske und einige CommandButtons beinhaltet. So gibt es einen "speichern unter"-Button, der einen Dateinamen erzeugt, der abhängig ist vom Inhalt der Eingabemaske. Sub Speichern_unter() ´ In E58 steht der Dateiname D_Name = Application.GetSaveAsFilename([E58]) If D_Name = False Then Exit Sub ActiveWorkbook.SaveAs D_Name End Sub Und dann gibt es einen Button zum Beenden der Datei. Option Explicit Declare Function ExitWindowsEx Lib "user32" _ (ByVal Flags As Long, ByVal Reserved As Long) As Long Sub Beenden() ActiveWorkbook.Close End Sub Jetzt habe ich folgendes Problem beim "Beenden": Hat die Datei bereits einen Namen bekommen (durch das "Speichern unter" Makro), soll die Datei nur gespeichert werden, wenn noch was verändert wurde (sonst soll sie beendet werden). Wenn die Datei noch keinen Namen hat, soll der Script "Speichern unter" ausgeführt werden. Wie lässt sich das bewerkstelligen?? Gruß René

Antwort 1 von coros

Hallo Rene,

nachfolgend die Makros, mit denen es funktionieren sollte, wie Du es Dir gedacht hast. Tausche die beiden Makros gegen Deinen vorhandenen aus.

Option Explicit

Sub Beenden()
If ThisWorkbook.Name <> Range("E58") & ".xls" Then
Speichern_unter
Exit Sub
End If
With ThisWorkbook
.Save
.Close
End With
End Sub

Sub Speichern_unter()
Dim D_Name As Variant
D_Name = Application.GetSaveAsFilename([E58], "Microsoft Excel-Arbeitsmappe (*.xls), *xls")
If D_Name = False Or D_Name = "" Then Exit Sub
ActiveWorkbook.SaveAs D_Name
End Sub


MfG,
Oliver\nDa hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 2 von Rene.N

Hallo Oliver,

danke für den Code. Das sieht gut aus!

Kannst du mir noch sagen ,was bei Application.GetSaveAsFilename([E58], "Microsoft Excel-Arbeitsmappe (*.xls), *xls")
der Bereich nach [E58] bewirkt?

Dann habe ich noch festgestellt, dass (wenn man bei "speichern_unter" im Speicherndialog vom BS auf Abbruch drückt) die Datei nicht gespeichert wird und geschlossen wird. Kann man die Beenden-Prozedur abbrechen, wenn beim "Speichern_unter" auch abgebrochen wird? (z.B. beim versehentlichen Drücken des Beenden-Buttons)

Gruß René

Antwort 3 von coros

Hallo Rene,

das hinter [58] bewirkt, dass die Voreinstellung der Dateiendung ".xls" lautet, damit die Datei sofort als Exceldatei abgespeichert werden kann. Ansonsten kann ja versehentlich mal vergessen werden, welche Endung die Datei erhalten soll.

Sorry, aber wenn man die Abbrechentaste betätigt, dann möchte man etwas abbrechen. In diesem Fall das Speichern. Was ist daran verkehrt? Man sollte dem Benutzer schon eine Möglichkeit geben, etwas abzubrechen und nicht zwangsweise irgend etwas ablaufen lassen. Schließlich fällt einem eventuell beim Speichern ein, dass man etwas vergessen hat und man möchte nochmal in die Datei zurück. Wie würdest Du das dann bewerkstelligen wollen?

MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 4 von Rene.N

Hallo Oliver,

also das mit dem Dateinamen ist klar.. (Bei mir steht über eine Formel dann in besagter Zelle "xxxxx.xls")

Das Abbrechen ist ja genau das Problem! Wenn ich denn abbrechen will, soll ja auch der "Beenden-Vorgang" abgebrochen werden. Jetzt wird aber noch der Teil

With ThisWorkbook
.Save
.Close
End With

aus Sub Beenden() ausgeführt... Läßt sich das dann abfangen??

Gruß René

Antwort 5 von coros

Hallo Rene,

das in Deiner Zelle E58 die Endung .xls steht, hast Du nirgends geschrieben und das mit dem Hellsehen liegt hier keinem. Da muss man ein anderes Forum wählen. Beim nächsten mal gib so etwas mit an.

Wenn ich das Beenden Makro aufrufe und der Name der aktiven Datei anders als der Name in Zelle E58 wird das Dialogfenster "Speichern unter aufgerufen und das Makro "Beenden" abgebrochen. Das Beenden des Makros "Beenden" wird durch die Zeile

Exit Sub


hervorgerufen. Wenn ich im Dialogfenster "Speichern unter" dann auf Abbrechen klicke, wird alles beendet. Jedenfalls ist das bei den Makros so, die ich in AW1 gepostet habe. Kann es sein, dass Du die Makros nciht 1:1 übernommen hast, sondern nur Teile in einen bei Dir vorhandenen Code eingefügt hast und nicht die Prozedur beenden läßt, wenn das Dialogfenster aufgerufen wird?

Ansonsten müsstest Du schon mal Deinen gesamten Code hier posten, damit man schauen kann, wo der Fehler liegt.

MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 6 von Rene.N

Hallo Oliver,

sorry dass ich nicht erwähnt hatte, das die Endung schon mit erzeugt wird. Deshalb war das ja auch nur ´ne Frage, was der entsprechende Code bewirkt....

So, mein derzeitiger Code sieht so aus:

Option Explicit

Declare Function ExitWindowsEx Lib "user32" _
(ByVal Flags As Long, ByVal Reserved As Long) As Long

Sub Beenden()
Speichern
If Workbooks.Count > 1 Then ThisWorkbook.Close False Else Application.Quit
End Sub

Sub Speichern()
If ThisWorkbook.Saved = True Then Exit Sub
If InStr(1, ActiveWorkbook.Name, ".xls") Then
intCont = MsgBox("Speichern?", vbYesNoCancel, ActiveWorkbook.Name)
If intCont = vbCancel Then Exit Sub
If (intCont = vbYes) And (ThisWorkbook.Name = Range("E58")) Then ActiveWorkbook.Save
If (intCont = vbYes) And (ThisWorkbook.Name <> Range("E58")) Then
D_Name = Application.GetSaveAsFilename([E58])
If D_Name = False Or D_Name = "" Then Exit Sub
ActiveWorkbook.SaveAs D_Name
End If
Else
D_Name = Application.GetSaveAsFilename([E58])
If D_Name = False Or D_Name = "" Then Exit Sub
ActiveWorkbook.SaveAs D_Name
End If
End Sub

(Ich hoffe du steigst noch durch vor lauter if-Anweisungen...)
Das Einzige, was z.Z. halt noch nicht geht, ist der Cancel-Zweig. Dort steigt er ja aus dem Sub Speichern aus und macht beim Beenden weiter (beim Abbruch im "Speichern unter"-Dialogfeld auch). Ich hätte aber gern, dass nach diesen beiden Abbruch-Varianten auch das Beenden abbricht. Sonst soll das Workbook bzw. Excel geschlossen werden.

Gibt´s da ne Möglichkeit über ne Variable vielleicht, die mit übergeben wird?

Gruß René

Antwort 7 von coros

Hallo Rene,

schau Dir mein Beenden-Makro an und Schau Dir Deins an. Siehst Du einen Unterschied? Ich schon. Warum übernimmst Du nicht mein Beenden-Makro? Hat das einen Grund? Mit dem geht es nämlich.

MfG
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 8 von Rene.N

Hallo Oliver,

ja, ich sehe schon den Unterschied. Nur, wenn bei dir die Datei noch keinen XLS-Namen hat oder in meiner Eingabemaske was geändert wird, das sich die Zelle E58 deswegen ändert, kommt bei dir das Speichern_unter Makro und steigt dann aus. Da müsste ich ja dann zum Beenden (mit speichern unter 2x auf den Butten drücken um das Programm zu beenden... (1x für Speichern unter und 1x für beenden)

Gruß René

Antwort 9 von coros

Hallo Rene

Bei meinem Beenden-Makro wird die Datei immer gesppeichert. Wenn der Name der Datei anders ist als der in E58, wird das Makro Speichern_unter-Makro gestartet, ansonsten wird gespeichert und beendet. Das sich die Zelle E58 aus irgend welchen Gründen von selbst ändern kann, hast Du nirgends geschrieben. Du hast geschrieben, dass in E58 der Name der Datei steht. Ich gehe dann davon aus, dass dort immer ein Name steht. Ist dem nicht so, baue am Anfang des Beenden.Makros eine Abfrage ein, ob E58 einen Wert enthält. Wenn nicht, soll eine Bildschirmmeldung (MsgBox) erscheinen um den Benutzer darauf hinzuweisen und danach setze ein Exit Sub mit in die If-Abfrage, damit die Prozedur sofort beendet wird. Mein Beenden-Makro würde dann wie folgt aussehen.

Option Explicit

Sub Beenden()
If ThisWorkbook.Name <> Range("E58") & ".xls" And Range("E58") <> "" Then
Speichern_unter
Exit Sub
Else
MsgBox "Es wurde kein Speichername in Zelle E58 eingetragen. Bitte nachholen.", vbCritical, "Fehler..."
Exit Sub
End If
With ThisWorkbook
.Save
.Close
End With
End Sub


Wobei ich mich ehrlich gesagt frage, warum Du überhaubt das Speichern unter-Dialogfenster öffnest, wenn der Dateiname bereits in Zelle E58 steht. Ist für mich nicht ganz verständlich.

MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 10 von Rene.N

Hallo Oliver,

hm, so ganz stimmt deine Annahme nicht.
In Zelle E58 steht immer was drin. Das ist eine Verknüpfung zu den Auswahlfeldern in der Eingabemaske. Da gibt es keine leere Auswahlmöglichkeit. Anhand der getroffenen Auswahl erfolgt die Generierung des Dateinamens. Sollte aber der User bereits gespeichert haben (das geht explizit über einen weiteren Button) und nachträglich nochmal eine Auswahl geändert haben (absichtlich oder auch nicht...), dann muss ja beim Beenden das Ergebnis in eine andere Datei gespeichert werden!
Ich muss auch deshalb die "Speichern unter" Prozedur des Betriebssystems aufrufen, weil der User noch den Speicherpfad wählen muss. Der steht leider nicht fest...

Aber das war ja nicht so direkt das Problem. Ich wollte lediglich,
1. dass wenn die Cancel-Variante (Sub Speichern / MsgBox "Speichern?") gedrückt wird auch der Beenden-Vorgang mit abgebrochen wird
2. Wenn der Speichern_unter Bildschirm vom Betriebssystem kommt (bei ActiveWorkbook.SaveAs D_Name) und man da Abbruch wählt, auch die Beenden-Prozedur abgebrochen wird.

Bei 1. springt mein Makro aus dem Sub "Speichern" und macht mit dem Beenden weiter
Bei 2. wird z.Zt. ga nicht gespeichert und auch mit Beenden weitergemacht....

Deshalb dachte ich, man kann vielleicht den Speichern-Aufrufen eine Variable mitgeben, die sich durch den Abbruch ändert und man diese dann auswerten kann.
Ich weiss nur leider nicht wie diese Werte übergeben werden können bzw. ob beim Abbruch des Speicherbefehls überhaupt ein Ereignis protokolliert wird...

Vielleicht bringen ja die Ausführungen ein bischen mehr Licht in´s Dunkel ;-)

Gruß René

Antwort 11 von Rene.N

Hallo Oliver
hallo auch an die große restliche Excel-Gemeinde,

hast du oder noch jemand anderes eine Idee zu meinem Problen???

Gruß René

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: