Datei per Makro im gleichen Verzeichnis speichern
#1
Question 
hi, ich möchte eine xlms-Datei speichern, welche den Namen der aktuellen Datei im Feld J1 im Blatt Betrag erhält:
Code:
Sub Erstellen()
ActiveWorkbook.SaveAs Filename:= _
"D:\Test1\" & Worksheets("Betrag").Range("J1").Value & ".xls", FileFormat:= _
xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _
, CreateBackup:=False
End Sub

Die Datei soll im gleichen Ordner gespeichert werden, wo sich die aktuelle Datei befindet. Aber nichtmal mit fester Pfadangabe funktioniert das. Wo steckt der Fehler?

lieben Dank

Julia :)
Top
#2
Hallo Julia

Teste mal so:

Sub Erstellen()

ActiveWorkbook.SaveAs Filename:= _
 ActiveWorkbook.Path & "\" & Worksheets("Betrag").Range("J1").Value & ".xls", FileFormat:= _
xlExcel8, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _
, CreateBackup:=False
End Sub
Gruß Atilla
Top
#3
Dankeschön atilla. Es funktioniert - aber nur fast. Ich habe auch schon die Endung auf xlsm geändert - ohne Erfolg. Wenn ich das Marko ausführe kommen abwechselnt 2 verschiedene Dinge. Entweder:
[url=
Dateiupload bitte im Forum! So geht es: Klick mich!
]
Egal, ob ich "Ja" oder "Nein" auswähle, die erstellte Datei kann ich nicht öffnen. Dann kommt immer folgendes:
[url=
Dateiupload bitte im Forum! So geht es: Klick mich!
]

Manchmal kommt auch das hier beim Ausführen des Makos(also statt der 1. Fehlermeldung):
[url=
Dateiupload bitte im Forum! So geht es: Klick mich!
]

Im Calc-Blatt befinden sich Wenn-Dann-Formeln, welche öfter als 7 Mal verschachtelt sind. Aber anders(z.B. per Sverweis) kann ich das nicht regeln. So hat jetzt letzenendes funktioniert:
Code:
Sub Erstellen()
ActiveWorkbook.SaveAs Filename:= _
ActiveWorkbook.Path & "\" & Worksheets("Betrag").Range("J1").Value & ".xlsm", FileFormat:=52, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _
, CreateBackup:=False
End Sub

Julia :)
Top
#4
Hallöchen,

es reicht nicht, die Dateiendung zu ändern --> Fehlerbild 2. Du musst die Datei mit "Speichern unter" im entsprechenden Format speichern bzw. im Code mit dem Format 52 (oder in Worten "xlOpenXMLWorkbookMacroEnabled"), wie Du es hier gepostet hast.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#5
jo, so funktioinert das. Ergänzend speichere ich zuvor die aktuelle Datei, da ich sie ebenfalls noch benötige. Danach blende ich ein Bild aus:
Code:
Sub Erstellen()
ActiveWorkbook.Save
ActiveSheet.Shapes("Picture 21").Visible = False
ActiveWorkbook.SaveAs Filename:= _
ActiveWorkbook.Path & "\" & Worksheets("Betrag").Range("J1").Value & ".xlsm", FileFormat:=52, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _
, CreateBackup:=False
End Sub

Eine Verändung ist am Makro jedoch noch notwendig. Ich habe jetzt weiter an der Datei gearbeitet und möchte von der Ausgangsdatei auf die gespeicherte Datei("SaveAs-Datei") zugreifen können:
Ich möchte, dass die Ausgangsdatei beim Erstellen der "SaveAs-Datei" nicht geschlossen wird. Sie soll gleichzeitig mit der gespeicherten Datei geöffnet bleiben. Das ist wichtig, damit die Pfade aktualisiert werden in der Ausgangsdatei. Sonst kann ich nicht von der Ausgangsdatei zu Feldern in der "SaeAs-Datei" verweisen(also diese in der Ausgansdatei darstellen), wenn die "SaveAs-Datei" nicht geöffnet ist.

Beim Öffnen der Ausgangsdatei(ohne dass die SaveAs-Datei) geöffnet ist, kommt dann auch diese Fehlermeldung:
[url=
Dateiupload bitte im Forum! So geht es: Klick mich!
]

Geht das?
Top
#6
Hallo Julia,

schau Dir mal die SaveCopyAs  Methode an. Also nicht unter neuem Namen abspeichern, sondern als Kopie mit neuem Namen speichern.
Dann ist die Ausgangsdatei die geöffnete.


Folgender Code müsste dann reichen:
Code:
Sub Erstellen()
ActiveWorkbook.Save
ActiveSheet.Shapes("Picture 21").Visible = False
ActiveWorkbook.SaveCopyAs Filename:= _
ActiveWorkbook.Path & "\" & Worksheets("Betrag").Range("J1").Value & ".xlsm"
End Sub

Aber vorsicht, falls eine Datei mit gleichem Namen nicht geöffnet und am gleichen Ort ist, dann wird sie überschrieben. Ist praktiscch futch.
Gruß Atilla
Top
#7
Danke Exclamation - auch für den Hinweis mit dem Überschreiben. In meinem Fall macht das aber nichts.

Ich dachte erst, du hättest "FileFormat:=52" vergessen. Jedoch wird das bei SaveCopyAs nicht benötigt - bzw. ist gar nicht erlaubt. Jedoch eine Sache funktionierte nicht. Die beiden Workbooks müssen beide parallel geöffnet sein. Das ist wichtig, damit die Pfade aktualisiert werden in der Ausgangsdatei. Sonst kann ich nicht von der Ausgangsdatei zu Feldern in der "SaveCopyAs-Datei" verweisen(also diese in der Ausgansdatei darstellen), wenn die "SaveCopyAs-Datei" nicht geöffnet ist.

-Ich habe später eine Hauptdatei & ein paar Nebendateien(welche ich über SaveCopyAs erstelle).
-Im Grund ist dann nur die Hauptdatei geöffnet. Sie holt sich aber Daten aus Feldern der einzelnen SaveCopyAs-Dateien.
-Wenn jetzt die Hauptdatei und die SaveCopyAs-Dateien nie gleichzeitig geöffnet waren, findet die Hauptdatei den Pfad der SaveCopyAs-Dateien nicht. Und somit kann ich auch keine Zellinhalte verknüpfen. Wenn ich den Ordner mit den ganzen Dateien umbenenne, umkopiere oder auf USB-Stick an einem anderem PC nutze, werden die SaveCopyAs-Dateie aber trotzdem von der Hauptdatei erkannt. Aber auch dann nur, wenn die SaveCopyAs-Dateie vorher(vorm Kopieren, vorm Umbenennen des Ordners, etc.) zusammen mit der Hauptdatei geöffnet hatte.

So geht auch das jetzt:
Code:
Sub Erstellen()
ActiveWorkbook.Save
ActiveWorkbook.SaveCopyAs Filename:= _
ActiveWorkbook.Path & "\" & Worksheets("Betrag").Range("J1").Value & ".xlsm"
Workbooks.Open Filename:=ActiveWorkbook.Path & "\" & Worksheets("Betrag").Range("J1").Value & ".xlsm
ActiveSheet.Shapes("Picture 21").Visible = False
ActiveWorkbook.Save
ActiveWorkbook.Close savechanges:=False
End Sub

Nehmen wir mal an, man arbeitet auf einem langsamen USB-Stick & die Datei braucht länger zum speichern. Wird zwischen:
Code-Zeile: ActiveWorkbook.Path & "\" & Worksheets("Betrag").Range("J1").Value & ".xlsm" & Code-Zeile: Workbooks.Open Filename:=ActiveWorkbook.Path & "\" & Worksheets("Betrag").Range("J1").Value & ".xlsm
gewartet bis die Datei gespeichert ist?

Jetzt kann es sein, dass die SaveAs-Workbook(eine ältere Version) bereits geöffnet ist, vor Ausführung des Makros. Dann kann diese ja leider nicht überschrieben werden. Also soll ein Hinweis ausgegeben werden. So mein Versuch:
Code:
Sub Erstellen()
ActiveWorkbook.Save
For Each x In Workbooks
If x.Name = Worksheets("Betrag").Range("J1").Value & ".xlsm"
MsgBox "Datei ist schon geöffnet!"
GoTo weiter
End If
Next
ActiveWorkbook.SaveCopyAs Filename:= _
ActiveWorkbook.Path & "\" & Worksheets("Betrag").Range("J1").Value & ".xlsm"
Workbooks.Open Filename:=ActiveWorkbook.Path & "\" & Worksheets("Betrag").Range("J1").Value & ".xlsm
ActiveSheet.Shapes("Picture 21").Visible = False
ActiveWorkbook.Save
ActiveWorkbook.Close savechanges:=False
weiter:
End Sub

Jedoch funktioniert das nicht. Die MsGBox wird mir noch angezeigt, dann springt er zum Debugger und markiert mir:
Code:
ActiveWorkbook.SaveCopyAs Filename:= _
ActiveWorkbook.Path & "\" & Worksheets("Betrag").Range("J1").Value & ".xlsm"
Welches ja an sich funktioniert, wie man Makro vorher ja sehen kann. Er soll ja genau das auch nicht ausführen, sondern dann bei :weiter, weitermachen.

Julia :)
Top
#8
(18.02.2017, 13:31)o0Julia0o schrieb: Nehmen wir mal an, man arbeitet auf einem langsamen USB-Stick & die Datei braucht länger zum speichern. Wird zwischen:
Code-Zeile: ActiveWorkbook.Path & "\" & Worksheets("Betrag").Range("J1").Value & ".xlsm" & Code-Zeile: Workbooks.Open Filename:=ActiveWorkbook.Path & "\" & Worksheets("Betrag").Range("J1").Value & ".xlsm
gewartet bis die Datei gespeichert ist?

Jetzt kann es sein, dass die SaveAs-Workbook(eine ältere Version) bereits geöffnet ist, vor Ausführung des Makros. Dann kann diese ja leider nicht überschrieben werden. Also soll ein Hinweis ausgegeben werden. So mein Versuch:
Code:
Sub Erstellen()
ActiveWorkbook.Save
For Each x In Workbooks
If x.Name = Worksheets("Betrag").Range("J1").Value & ".xlsm"
MsgBox "Datei ist schon geöffnet!"
GoTo weiter
End If
Next
ActiveWorkbook.SaveCopyAs Filename:= _
ActiveWorkbook.Path & "\" & Worksheets("Betrag").Range("J1").Value & ".xlsm"
Workbooks.Open Filename:=ActiveWorkbook.Path & "\" & Worksheets("Betrag").Range("J1").Value & ".xlsm
ActiveSheet.Shapes("Picture 21").Visible = False
ActiveWorkbook.Save
ActiveWorkbook.Close savechanges:=False
weiter:
End Sub

Jedoch funktioniert das nicht. Die MsGBox wird mir noch angezeigt, dann springt er zum Debugger und markiert mir:
Code:
ActiveWorkbook.SaveCopyAs Filename:= _
ActiveWorkbook.Path & "\" & Worksheets("Betrag").Range("J1").Value & ".xlsm"
Welches ja an sich funktioniert, wie man Makro vorher ja sehen kann. Er soll ja genau das auch nicht ausführen, sondern dann bei :weiter, weitermachen.

Julia :)


Hallo julia,

Du schreibst, dass Dir die MsgBox angezeigt wird, ohne Dich der Lüge zu bezichtigen, dass dürfte nicht der Fall sein.
Denn im Code ist in dieser Zeile:
Code:
If x.Name = Worksheets("Betrag").Range("J1").Value & ".xlsm"

ein Fehler, es fehlt am Ende "Then". Di Zeile müsste doch bei Dir rot sein und der Code könnte gar nicht ausgeführt werden.

Nehmen wir an, Du fügst diese "Then noch ein, dann würde ich noch ein Exit For einbauen:

Code:
For Each x In Workbooks
 If x.Name = Worksheets("Betrag").Range("J1").Value & ".xlsm" Then
   MsgBox "Datei ist schon geöffnet!"
   GoTo weiter
   Exit For
 End If
Next


Diesmal alles ungetestet.
Gruß Atilla
[-] Folgende(r) 1 Nutzer sagt Danke an atilla für diesen Beitrag:
  • o0Julia0o
Top
#9
oh, jo. Ich hatte mehrere Dateien geöffnet und hatte dann einen anderen Versuch verwechselt :29:  .

Deine Ungetestete funktioniert wunderbar!

Wird zwischen:
Code:
Code-Zeile: ActiveWorkbook.Path & "\" & Worksheets("Betrag").Range("J1").Value & ".xlsm"
und:
Code:
Workbooks.Open Filename:=ActiveWorkbook.Path & "\" & Worksheets("Betrag").Range("J1").Value & ".xlsm
gewartet bis die Datei gespeichert ist? Bei mir klappt das immer, jedoch kann es ja mal ne nach System/-auslastung und Speichermedium länger dauern mit dem Speichervorgang.
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste