Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.04.2024 20:05:21
28.04.2024 18:33:31
28.04.2024 18:25:12
28.04.2024 14:18:05
Anzeige
Archiv - Navigation
1932to1936
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

Speicher ohne Rückfrage

Speicher ohne Rückfrage
19.06.2023 12:22:29
reiner

Hallo Leute,

https://www.herber.de/bbs/user/159629.xlsm

bei der schreibgeschützten Beispieldatei geht es darum, die Datei
1. Ohne Speichern zu beenden
2. Speichern mit dem aktuellen Tagesdatum sofern die letzte Speicherung mindestens einen Tag vorher erfolgte; letztes Speicherdatum ist Bestandteil des Dateinamens und zusätzlich in Zelle "Y1" hinterlegt. Der vorhandene Schreibschutz wird zum Speichervorgang deaktiviert und nach dem Speichern erneut aktiviert.
3. Speichern, auch wenn die Datei bereits kurz vorher mit aktuellem Tagesdatum -am gleichen Tag- schon einmal gespeichert wurde, wenn z. B. eine nachträgliche Korrektur fälig wurde. Der vorhandene Schreibschutz wird zum Speichervorgang deaktiviert und nach dem Speichern erneut aktiviert.

Diese 3 Möglichkeiten funktionieren auch einwandfrei.

Es geht mir jetzt noch um ein Detail bei Möglichkeit "3".
In Zeile 37 des VBA-Editors wird das Dialogfeld "Speichern unter...." geöffnet und der vorhandene Dateiname vorgeschlagen. Bei Betätigung der Schaltfläche "Speichern" erscheint das Meldungsfenster "Speichern unter bestätigen" mit dem Hinweis, das der gewünschte Dateiname bereits vorhanden ist. "Möchten Sie sie ersetzen?" Bei Betätigung der Schaltfläche "Ja" wird die Datei unter dem genannten Dateinamen ohne weitere Rückfrage gespeichert und -wie gewünscht- geschlossen.

Meine Frage an das Forum lautet: Kann das Meldungsfenster "Speichern unter bestätigen" verhindert werden, sodass der Speichervorgang direkt eingeleitet wird.

mfG
reiner


10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Speicher ohne Rückfrage
19.06.2023 16:49:29
reiner
ich ziehe die Frage zurück, da ich selbst eine Lösung erarbeitet habe


AW: Speicher ohne Rückfrage
19.06.2023 16:52:05
Piet
Hallo

es gibt diesen Befehl, setze ihn vor dem Speichern mal auf False - Application.AlertBeforeOverwriting = False
Vor dem Schliessen der Datei aber bitte wieder auf True setzen!! - Application.AlertBeforeOverwriting =True

mfg Piet


AW: Speicher ohne Rückfrage
19.06.2023 17:28:41
reiner
Hallo Piet,

ich habe die Speicherabfrage mit einer Sendkeys-Anweisung unterbunden

Alternativ funktioniert es bei mir mit
Application.AlertBeforeOverwriting = False
leider nicht


Anzeige
AW: Speicher ohne Rückfrage
19.06.2023 18:12:22
Pappawinni
Application.DisplayAlerts = False
könnte da helfen.
Application.AlertBeforeOverwriting =True
bezieht sich IMHO auf Copy/Paste falls im Zielbereich Daten stehen.


AW: Danke für die Rückmeldung oWt
19.06.2023 18:05:26
Piet
...


AW: Speicher ohne Rückfrage
19.06.2023 18:18:33
Daniel
Reiner hat zwar schon eine Lösung gefunden (leider sagt er uns nicht welche), aber ich zumindest würde in so einem Fall auf die eingebauten Dialoge verzichten und nur - falls erforderlich - den Dateinnamen und Speicherort mit GetSaveAsFilename vom Anwender eingeben lassen und dann den gesamten Speichern-unter-Prozess selber programmieren.

das GetSaveAsFileName sieht für den Anwender genauso aus die der SaveAs-Dialog, aber man bekommt nur den Dateinamen und -Pfad in eine Stringvariable geschrieben, mehr passiert nicht. Dh mit diesem String kann man dann weiter arbeiten, ist zwar etwas programmieraufwand, aber man hat die Kontrolle darüber, was passiert und welche weiteren Abfragen der Anwender bekommt.

Gruß Daniel


Anzeige
AW: Speicher ohne Rückfrage
19.06.2023 18:33:43
reiner
Hallo an Daniel, Pappawinni und Piet,

die Lösungsansätze von Pappawinni und Piet haben leider bei mir nicht den erhofften Erfolg gebracht.
Wie in meiner Rückmeldung vom 19.06.2023 17:28:41 an Piet, habe ich eine Lösungsmöglichkeit mit der Sendkeys-Anweisung gefunden. Ob es sinnvoll ist mit Sendkeys-Anweisungen zu arbeiten vermeg ich nicht zu beurteilen. Zumindest funktioniert das Speichern am gleichen Tag mit Umgehung der beschriebenen Rückfragen.

vielen Dank für eure Unterstützung
reiner


AW: Speicher ohne Rückfrage
19.06.2023 22:58:49
Yal
Hallo Reiner,

dein Code beinhaltet einige nutzlose Sachen (kein Stress, es ist normal am Anfang). Öffne das Lokalfenster (Ansicht, Lokalfenster), und lasse den Code in Schrittmodus (F8) laufen. So wirst Du den Zustand der Variablen nach jeden Schritt. Einige werden mehrfach belegt oder umsonst belegt.

Vermeide die Sprungmarken. Insbesonders innerhalb einer If-Statement.
Achte unbedingt auf ein sauberes Einrücken. Sonst siehst Du vor lauter Bäume keinen Wald.

Hier ein Vorschlag. Ich bin aber nicht ganz sicher, dass ich das gesamte Konstrukt verstanden habe.

Private Sub cmdBeenden_Click()
Dim Speicherdatum As Date
Dim Speichername As String
Dim sPfad As String
 
'Kombination: speichern = ja und schreibgeschutzt nicht erlaubt. Muss man dafür Excel komplett schliessen (Application.Quit)?
    If MsgBox("SPEICHERN, schreibgeschützt??", vbQuestion + vbYesNo + vbDefaultButton2, "Message Box Titel") = vbYes And ActiveWorkbook.ReadOnly Then
        Application.DisplayAlerts = False
        Application.Quit
    End If
    
    Speicherdatum = DateValue(ActiveWorkbook.BuiltinDocumentProperties("last save time"))
    
    If CDate(Sheets("Tabelle1").Range("Y1").Value) = Speicherdatum Then
        With ThisWorkbook
            sPfad = .FullName
            SetAttr PathName:=.FullName, Attributes:=vbNormal
            .Saved = True
            If .ReadOnly Then .ChangeFileAccess Mode:=xlReadWrite 
            Application.Dialogs(xlDialogSaveAs).Show Left(.FullName, Len(.FullName) - 13) & Format(Speicherdatum, "YYYYMMDD") & ".xlsm"
        End With
        Speicherdatum = Left(ActiveWorkbook.BuiltinDocumentProperties("last save time"), 10)
    Else
        ThisWorkbook.SaveAs Filename:="d:\Excel\Allgemein\Dateiname" & Format(Speicherdatum, "YYYYMMDD") & ".xlsm"
    End If
    
    ActiveSheet.Unprotect
    Speicherdatum = ParseDate(Left(Right(ThisWorkbook.Name, 13), 10))
    Sheets("Tabelle1").Range("Y1").Value = CStr(Speicherdatum)
    ActiveSheet.Protect
    Application.DisplayAlerts = False
    ThisWorkbook.Save
'wozu das?
    With CreateObject("Scripting.FileSystemObject").GetFile(ActiveWorkbook.FullName)
        .Attributes = .Attributes + 1
    End With
    
    Application.DisplayAlerts = True
    Application.Quit
End Sub

Public Function ParseDate(ByVal DatumYYYYMMDD As String) As Date
    ParseDate = DateSerial(Left(DatumYYYYMMDD, 4), Mid(DatumYYYYMMDD, 5, 2), Right(DatumYYYYMMDD, 2))
End Function
VG
Yal


Anzeige
AW: Speicher ohne Rückfrage
20.06.2023 12:26:16
reiner
hallo Yal,

du schreibst, "mein Code beinhaltet einige nutzlose Sachen". Aus deiner Sicht hast du vielleicht recht. Der von mir benutzte Code basiert teilweise auf Vorschlägen aus diesem Forum; ich würde diese Unterstützer nicht unbedingt als VBA-Anfänger betrachten. Ich habe schon öfters erlebt dass man auf unterschiedlichen VBA-Wegen eine Lösung erarbeiten kann.

ich habe deinen Vorschlag getestet. Dabei fiel mir auf, das es in Zeile 7 anstatt vbyes "vbNo" heißen muss, wenn die Datei Abfrage mit "Ja" (Speichern) beantwortet wird.

If MsgBox("SPEICHERN, schreibgeschützt??", vbQuestion + vbYesNo + vbDefaultButton2, "Message Box Titel") = vbYes And ActiveWorkbook.ReadOnly Then

If MsgBox("SPEICHERN, schreibgeschützt??", vbQuestion + vbYesNo + vbDefaultButton2, "Message Box Titel") = vbNo And ActiveWorkbook.ReadOnly Then

Bezüglich des folgenden Speichern-Dialogs verweise ich auf die Problembeschreibung in meiner Anfrage vom 19.06.2023 16:49:29

Dort heißt es:

Es geht mir jetzt noch um ein Detail bei Möglichkeit "3".
In Zeile 37 des VBA-Editors wird das Dialogfeld "Speichern unter...." geöffnet und der vorhandene Dateiname vorgeschlagen. Bei Betätigung der Schaltfläche "Speichern" erscheint das Meldungsfenster "Speichern unter bestätigen" mit dem Hinweis, das der gewünschte Dateiname bereits vorhanden ist. "Möchten Sie sie ersetzen?" Bei Betätigung der Schaltfläche "Ja" wird die Datei unter dem genannten Dateinamen ohne weitere Rückfrage gespeichert und -wie gewünscht- geschlossen.
Meine Frage an das Forum lautet: Kann das Meldungsfenster "Speichern unter bestätigen" verhindert werden, sodass der Speichervorgang direkt eingeleitet wird.

Ich kann leider nicht erkennen, dass du dieses Problem berücksichtigt hast.

Ist die Ermittlung des Speicherdatums mit "ParseDate" sinnvoll, zunal dein Code nicht funktioniert?

'wozu das?
    With CreateObject("Scripting.FileSystemObject").GetFile(ActiveWorkbook.FullName)
        .Attributes = .Attributes + 1
    End With
Damit wird dei Datei abschließend mit dem Attribut "Schreibschutz" versehen

Leider hilft mir dein Beitrag überhaupt nicht weiter, zumal ich am 19.06.2023 16:49:29 bereits die Frage zurückgezogen habe, weil ich inzwischen selbst eine funktionierende lösung erarbeitet hatte.
Trotzdem Danke für deine Mühe
reiner


Anzeige
AW: Speicher ohne Rückfrage
21.06.2023 19:28:22
Yal
Hallo Reiner,

Du kannst prüfen, ob die Datei existiert und wenn ja löschen, dann speichern:

Sub Datei_speichern(Dateiname As String)
Dim F As Object 'File-Objekt

    With CreateObject("Scripting.FileSystemObject")
        Set F = .GetFile(Dateiname)
        If Not F Is Nothing Then .DeleteFile Dateiname
    End With
    ThisWorkbook.SaveAs Dateiname
End Sub
oder kürzer:
Kill Dateiname
ThisWorkbook.SaveAs Dateiname
Das Setzen des ReadOnly kann auch so erreicht werden:
SetAttr Dateiname, vbReadOnly
Ist gleichwertig, aber bei Lesen sofort zu -wieder- verstehen.

Es ist nicht "ParseDate", das nicht funktioniert sondern das Datum wurde nicht in der Form YYYYMMDD übergeben:
Du hast einmal DD.MM.YYYY
      Jahr = Right(Date, 4)
      Monat = Mid(Date, 4, 2)
      Tag = Mid(Date, 1, 2)
und einmal YYYYMMDD
      Jahr = Left(Speicherdatum, 4)
      Monat = Mid(Speicherdatum, 5, 2)
      Tag = Mid(Speicherdatum, 7, 2)
Dementsprechend könntest Du versuchen eine "ParseDateDD_MM_YYYY" zu programmieren (das aktuelle ParseDate wäre dann "ParseDateYYYYMMDD")
Sub test()
    MsgBox ParseDate("20230621")
    MsgBox ParseDate("20230631") 'existiert nicht, wird trotzdem als 01.07.2023 interpretiert
End Sub

Public Function ParseDate(ByVal DatumYYYYMMDD As String) As Date
    ParseDate = DateSerial(Left(DatumYYYYMMDD, 4), Mid(DatumYYYYMMDD, 5, 2), Right(DatumYYYYMMDD, 2))
End Function
Ein universelle ParseDate könnte so aussehen:
Sub test()
    MsgBox ParseDate("20230621", "YYYYMMDD")
    MsgBox ParseDate("36.13.21", "DD.MM.YY")
End Sub

Public Function ParseDate(ByVal Datum As String, Muster As String) As Date
Dim i
Dim D, M, Y
    For i = 1 To Len(Muster)
        Select Case UCase(Mid(Muster, i, 1))
        Case "Y": Y = Y & Mid(Datum, i, 1)
        Case "M": M = M & Mid(Datum, i, 1)
        Case "D": D = D & Mid(Datum, i, 1)
        End Select
    Next
    ParseDate = DateSerial(CInt(Y), CInt(M), CInt(D))
End Function
VG
Yal

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige