Clever-Excel-Forum

Normale Version: Speichern als per UserForm / Letztes Blatt nicht drucken
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3 4 5 6 7 8
Hallöchen,

Zitat: wenn er ein SaveAs auf sich selbst ausführen soll.

So was macht man ja auch nicht ... Weder mit SaveAs noch mit SaveCopyAs. Damit das nicht passiert kannst Du vorher die Namen der offenen Dateien mit dem gewünschten Namen vergleichen (oder etwas um die Ecke mit dem Makro was die Dateien auf offen prüft, prüfen) und ggf. eine Meldung ausgeben, dass sich der User was anderes einfallen lassen soll. Oder Du nimmst in dem Fall als alte Naive ein einfaches Save, wenn es denn passt.
ja, wenn sich der Name nicht ändert geh ich auch auf Save, eben um den Laufzeitfehler zu vermeiden, aber wenn sich der Name ändert soll er ja speichern und nur die Datei mit dem neuen Namen behalten, das zickt allerdings noch rum weil er egal wie ich es anstelle immer auf "Zugriff verweigert" kommt, weil die Datei (was sie mir sagt wenn ich sie manuell im Ordner löschen will) noch mit irgendeinem Programm geöffnet wäre (was ja nur Excel sein kann, da das Problem verschwindet sobald ich Excel einmal vollständig beende)...

Im Moment ist das hier meine Lösung für den Laufzeitfehler, und noch Platz um die angeblich geöffnete aber nicht offene Datei per Befehl zu schließen:
Code:
Private Sub UserForm_Initialize()
    Dim wbkold As String
    wbkold = ThisWorkbook.Name
    wbkname = ActiveSheet.Range("C12").Value & ActiveSheet.Range("I12").Value & ActiveSheet.Range("O12").Value & ActiveSheet.Range("U12").Value & ActiveSheet.Range("AA12").Value & ActiveSheet.Range("AG12").Value & ActiveSheet.Range("AM12").Value & ActiveSheet.Range("AS12").Value & ActiveSheet.Range("AY12").Value & ActiveSheet.Range("BE12").Value
    save_path.Value = Sheets("Blatt 1").Range("DC12").Value
    save_name.Value = "Schaltprogramm " & wbkname & " " & Sheets("Blatt 1").Range("C29").Value & " " & Sheets("Blatt 1").Range("C31").Value
    saved = False
   
End Sub

Code:
Function speicherDatei(ByVal wkb As Workbook, ByVal strDateiname As String) As Boolean
If save_name.Value = "" Then
    MsgBox "Die Datei wird nicht gespeichert, da Sie [Abbrechen] gedrückt oder nichts eingegeben haben.", , "Abbruch"
    Exit Function
Else
    If save_path.Value = "" Then
        MsgBox "Die Datei wird nicht gespeichert, da Sie [Abbrechen] gedrückt oder nichts eingegeben haben.", , "Abbruch"
        Exit Function
    Else
        If Right(save_path.Value, 1) <> "\" Then save_path.Value = save_path.Value & "\"
        End If
        If Dir(save_path.Value & "*" & wbkname & "*", vbDirectory) = wbkold Then
        With wkb
        With .Sheets("Blatt 1")
            .Unprotect
            .Range("DB12").ClearContents
            .Range("DC12").Value = save_path.Value
            .Protect DrawingObjects:=True, Contents:=True, Scenarios:=False
        End With
            If wbkold <> ThisWorkbook.Name Then
                .SaveCopyAs save_path.Value & strDateiname
               
                Kill (save_path.Value & wbkold)
            Else: .Save
            End If
        End With
            speicherDatei = True
            MsgBox "Die Datei wurde unter " & save_path.Value & strDateiname & " gespeichert.", , "OK"
        Else
        With wkb
        With .Sheets("Blatt 1")
            If Dir(save_path.Value & "*" & wbkname & "*", vbDirectory) <> "" Then
                If Dir(save_path.Value & "*" & wbkname & "*", vbDirectory) <> save_name.Value & ".xls" Then
                    If Dir(save_path.Value & "*" & wbkname & "*", vbDirectory) <> save_name.Value & ".xlsm" Then
                        ListArr = Dir(save_path.Value & "*" & wbkname & "*", vbDirectory)
                        datei_exist.Show
                        exist = True
                        Do While exist = True
                            DoEvents
                        Loop
                        If .Range("DB12").Value = "1" Then
                            .Unprotect
                            .Range("DB12").ClearContents
                            .Protect DrawingObjects:=True, Contents:=True, Scenarios:=False
                            speicherDatei = False
                            savedone = True
                            Unload Me
                            Exit Function
                        End If
                    End If
                End If
            End If
            .Unprotect
            .Range("DB12").ClearContents
            .Range("DC12").Value = save_path.Value
            .Protect DrawingObjects:=True, Contents:=True, Scenarios:=False
        End With
            If wbkold <> ThisWorkbook.Name Then
                .SaveCopyAs save_path.Value & strDateiname
               
                Kill (save_path.Value & wbkold)
            Else: .Save
            End If
        End With
            speicherDatei = True
            MsgBox "Die Datei wurde unter " & save_path.Value & strDateiname & " gespeichert.", , "OK"
    End If
End If

End Function
da wo mitten im Code die Leerzeilen sind, da will ich die Datei altem Namen beenden und löschen, will es jetzt mit SaveCopyAs versuchen, die Kopie öffnen, das Original schließen und löschen, aber ich glaube das wird so nicht funktionieren da der Code ja in der alten Datei läuft... wird also wieder SaveAs.
Ob das so funktioniert...?
Code:
            If wbkold <> strDateiname Then
                .SaveAs save_path.Value & strDateiname
                Workbooks(wbkold).Close SaveChanges:=False
                Kill (save_path.Value & wbkold)
            Else: .Save
Also, wbkold bildet sich beim Initialisieren der Userform aus ThisWorkbook.Name, strDateiname ist der "neue" Name unter dem die Datei gespeichert werden soll.
Was save_path.Value beinhaltet erklärt sich von selbst (der Pfad unter dem die Datei gespeichert werden soll).
ich werde vllt noch eine Kleinigkeit einbauen, zur Sicherheit, das nicht die Vorlage gelöscht werden kann, aber ansonsten sollte das doch so funktionieren... Hoffe das ich durch das Wookbooks(wbkold).Close den Fehler "Zugriff verweigert" loswerde... Oder sollte ich da noch etwas dazu nehmen?

Ok, funktioniert nicht, bei Workbooks(wbkold).Close kommt die Fehlermeldung "Index außerhalb des gültigen Bereichs"...
Das funktioniert also nicht...
Hat jemand eine andere Idee?
Hallo,

Code:
            If wbkold <> strDateiname Then
                .SaveAs save_path.Value & strDateiname
                Kill save_path.Value & wbkold
            Else
                .Close SaveChanges:=False
            End If

Gruß Uwe
ok, zum besseren Verständnis:
Ich will das Dokument das ich bearbeite mit dem Speichern nicht schließen, also fällt .Close aus, was den anderen Part angeht, wenn der so funktionieren würde, dann hätte ich den ja auch noch so, aber da beschwert er sich ja mit "Zugriff verweigert" weil die Datei angeblich noch geöffnet ist (bis ich Excel einmal komplett beendet habe, was allerdings eigentlich nicht mein plan ist, da das ja den Code stoppt) und das versuche ich hier gerade irgendwie zu umgehen...

26865

Vielleicht hilft ein Versuch mit der ChangeFileAccess-Merhode?
Könnte ich versuchen, danke, befürchte aber das es an der Stelle dasselbe Problem ist wie bei meinem Versuch mit Workbook.Close um das wbkold zu schließen, das es nicht geht weil es nicht offen ist...
Problem rührt denke ich daher, das ich ja mit dem wbkold starte, dementsprechend dort auch mit dem Makro starte, dann irgendwo in der Mitte das Ding unter neuem Namen speichere... eigentlich logisch das dann, solange Excel aktiv ist, das alte wbk noch "offen" ist, zumindest im Code, also schätze ich wird es für mein Problem keine Lösung geben die ohne das Beenden von Excel auskommt...

Heißt also das ich das wbkold nicht direkt beim speichern des neuen löschen kann, sondern behalten muss, erst beim nächsten speichern könnte er es über die Dir entdecken und auf dem Wege löschen...

26865

Also bei mir läuft alles, wie es soll. 

Dir helfen zu wollen ist ein einziges Verlustgeschäft und frustet über beide Ohren. 

Viel Erfolg noch.
Hallöchen,

warum beharrst Du denn darauf, die Datei zu schließen, wenn sie nicht offen ist? Irgendwie bist Du mit Deiner Logik immer noch nicht richtig in Deinem Projekt.

Entweder Du prüfst vor dem Schließen ob es in der Liste der offenen WorkBooks ist, oder Du tust was, wenn Du die Datei z.B. mit SavaAs aus der Liste der offenen Dateien wirfst. Schon da könntest Du wbkOld auf "" setzen und brauchst später nur mit If wbkOld <> "" Then ...
(10.09.2022, 08:20)schauan schrieb: [ -> ]warum beharrst Du denn darauf, die Datei zu schließen, wenn sie nicht offen ist? Irgendwie bist Du mit Deiner Logik immer noch nicht richtig in Deinem Projekt.
Das Problem ist, das sich Excel an der Stelle unlogisch verhält, in der Theorie sollte eine Datei die einen bestimmten Namen hat, wenn sie unter neuem Namen gespeichert wird, eine neue Datei sein und auch nur in dieser neuen Form, mit dem neuen Namen geöffnet sein... Oberflächlich stimmt das auch, aber solange Excel noch geöffnet ist (was bei einem ungestörten Ablauf des Codes welcher das SaveAs mit sich führt unumgänglich ist) dann ist auch noch eine Instanz der Datei mit dem alten Namen im Hintergrund geöffnet, kann dabei aber weder durch Code noch durch den Anwender anvisiert werden, also auch nicht geschlossen werden. Das bedeutet das jeglicher Versuch dieses Verhalten zu umgehen ohne Excel zu schließen, scheiten wird, ich also an der Stelle nicht weiter forschen und experimentieren muss sondern stattdessen lieber mit den nächsten Öffnen oder besser dem nächsten Speichern, die überflüssige alte Datei in der Datei_exist Liste aufführe und über diesen Weg lösche. Womit dieser Thread nun endlich zu einem Ende gekommen ist... Nachdem man sich ja nun schon in mehreren Threads darüber beschwert ...

Danke nochmal an alle die geholfen haben.
Seiten: 1 2 3 4 5 6 7 8