Datei mit Name und Datum speichern

Dieser Thread ist Teil einer Diskussion zu einem Artikel:  Zum News-Artikel gehen

Ibaas

Aktives Mitglied
Hallo zusammen,

Ich habe eine Excel Datei erstellt in dem Betriebsstörungen usw. erfasst werden. Ich möchte nun, das wenn die Datei gespeichert wird, das Datum hinter demNamen der Datei steht. Ich habe auch halbwegs hinbekommen.

Code:
Sub MitZeitstempelSpeichern()
Dim Datumzeitstempel As String
Dim Jetzt As Date
Jetzt = Now()
Datumzeitstempel = "Schichtübergabe " & Year(Date) & Format(Month(Date), "-00-") & Format(Day(Date), "00")
ActiveWorkbook.SaveAs (ThisWorkbook.Path & "\" & Datumzeitstempel & ".xls")
MsgBox (ActiveWorkbook.Path)
End Sub

Allerdings habe ich ein Problem. Es funktioniert nur vom VBA Editor aus wenn ich F5 drücke und nicht wenn ich es normal speichern will. Also über STRG S oder wenn ich die Datei schließe. Ich bin totaler VBA Analphabet und bin über jede Hilfe sehr Dankbar.

Danke im voraus
Ibaas
 

nochEinAndreas

Stammgast
Hallo Ibaas und willkommen im Forum.

Für das was du möchtest, gibt es in Excel bzw. VBA die sog. Ereignisprozeduren. Das sind Makros, die automatisch loslaufen, wenn ein bestimmtes Ereignis eintritt. In deinem Fall ist das das Ereignis Workbook_BeforeSave.
Wie kommst du an diese Prozeduren ran?:
Öffne den VBA Editor, entweder über Entwicklertools - Visual Basic, oder mit Alt-F11.
Im linken oberen Fenster steht "VBAProject" und dahinter in Klammern der Name deiner Mappe.
Darunter steht "Diese Arbeitsmappe". Darauf machst du einen Doppelklick.
Über dem großen Fenster rechts gibt es 2 Dropdown-Felder.
Im linken wählst du "Workbook" aus, im rechten "BeforeSave".
Im großen Fenster hat sich jetzt automatisch eine leere Prozedur eingenistet:
Code:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

End Sub
Die müssen wir jetzt mit Leben füllen. Es sind eigentlich nur ein paar Kommandos. ich habe es aber mal ausführlich mit Kommentaren versehen, damit alles (hoffentlich) verständlich wird. Ersetzt die beiden bisherigen Codezeilen durch den Code unten. Dann kannst den VBA Editor schließen. Wenn du jetzt auf Speichern klickst, oder Strg-S benutzt, sollte der Makro laufen und die Datei mit dem Datumsnamen speichern.
Bei Fragen melde dich gerne.

Gruß und einen schönen Abend,
Andreas

Code:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    ' Falls 'Speichern unter' gewählt wurde,
    ' um die Datei bewusst unter anderem Namen zu speichern,
    ' Makro wieder verlassen
    If SaveAsUI Then Exit Sub
    
    ' Wenn nur 'Speichern' geklickt wurde, geht's hier weiter:
    
    ' Das "normale" Speichern durch Excel wird abgeschaltet.
    ' Das ist in dem Fall wichtig. Ansonsten versucht Excel
    ' nach dem 'Speichern unter' noch mal "normal" zu speichern.
    ' Dabei hängt es sich auf, weil es den alten Namen nicht mehr findet.
    Cancel = True
    
    ' Reaktion auf weitere Ereignisse wird abgeschaltet,
    ' damit der Makro beim folgenden Speichern
    ' nicht noch mal aufgerufen wird.
    Application.EnableEvents = False
    
    ' Wenn der Makro am selben Tag mehrmal aufgerufen wird,
    ' gibt es schon eine Datei mit dem Datumsnamen.
    ' Dann fragt Excel ob man überschreiben will.
    ' Wenn man dann 'Nein' oder 'Abbrechen' klickt,
    ' tritt ein Fehler auf, wenn der SaveAs Befehl ausgefüht werden soll.
    ' Dieser Fehler wird ingoriert.
    On Error Resume Next
    
    ' Wenn gespeichert werder soll, passiert das jetzt.
    ' Als Dateiname wird das aktuelle Datum im Format JJJJ-MM-TT genommen.
    ' Als Dateiformat wird xlsm benutzt, damit der Makro gespeichert werden kann.
    DieseArbeitsmappe.SaveAs DieseArbeitsmappe.Path & "\" & Format(Date, "yyyy-mm-dd") & ".xlsm"
    
    ' Jetzt wird das Ignorieren von Fehlern wieder abgeschaltet
    On Error GoTo 0
    
    ' Und ab hier wird wieder auf Ereignisse reagiert.
    Application.EnableEvents = True
    
    ' Hier wird's noch mal kompliziert:
    ' Offensichtlich 'vergisst' Excel nach dem Beenden des Makros,
    ' dass die Mappe gespeichert wurde.
    ' Beim Schließen der Mappe würde also nochmal gefragt, ob man speichern will.
    ' An alle, die jetzt meinen, 'DieseArbeitsmappe.Saved = True' würde helfen:
    ' Nein, tut es nicht. Ich hab's ausprobiert.
    ' Statt dessen muss man mit einer Psedo-Verzögerung von 0 sec. einen neuen
    ' aufrufen, in dem nur der 'DieseArbeitsmappe.Saved = True' Befehl steht.
    ' Ich habe diesen neuen Makro 'savedTrue' genannt (siehe unten).
    ' Mit dieser Krücke funktioniert es.
    Application.OnTime Now + TimeValue("00:00:00"), "DieseArbeitsmappe.savedTrue"
End Sub

Sub savedTrue()
    DieseArbeitsmappe.Saved = True
End Sub
 

Ibaas

Aktives Mitglied
Hallo Andreas,

nach einigem fummeln habe ich es hin bekommen. Ist auch wunderbar erklärt. Funktioniert so wie ich es mir gedacht habe. allerdings gibt es ein Problem das mir erst gestern Abend auf der Nachtschicht eingefallen ist. Wir arbeiten im Schichtdienst. Das heißt von 6.00 -14.00 von 14.00 - 22.00 von 22.00 - 6.00 Uhr. Früh- und Spätschicht sind kein Problem. Aber die Nachtschicht. Wenn ich nach 24.00 Uhr speichern will, wird die Datei mit dem neuen Datum gespeichert.

Lässt sich das Problem irgendwie vermeiden? Was mir in dem Zusammenhang noch aufgefallen ist, ist, wenn ich die unter neuem Namen gespeicherte Datei an einem anderen Tag öffne und dann wieder speichere wird die Datei mit dem neuen Datum gespeichert. Kann man das erneute speichern irgendwie verhindern oder noch besser, mit einem Vermerk versehen das die Datei schon bearbeitet wurde.

Der Hintergrund ist folgender.
Die Maschinenbediener füllen die "Schichtübergabe" aus. Bisher geschah die analog auf ein Blatt Papier. es ist in der Vergangenheit absichtlich oder unabsichtlich vorgekommen, das die Blätter verschwunden sind. Deshalb sind einige Kollegen her gegangen und haben die Blätter fotografiert. Das wurde von der Meisterei mit Missmut aufgenommen als man ihnen den Beweis zeigte das man die Schichtübergabe ausgefüllt hat. Jetzt auf elektronischem Wege ist es noch einfacher die Daten zu ändern.
Besonders bemerkbar macht es sich, wenn Auffälligkeiten während der Produktion von der Meisterei nicht weitergegeben werden.

Gruß und vielen Dank
Werner

PS: Ich wollte dir zum besseren Verständnis die Originaldatei anhängen doch leider ist dies nicht möglich
 

nochEinAndreas

Stammgast
Hallo Werner,

erst zu deinem PS:
Wenn du hier Excel-Dateien hochladen willst, mach (zumindest vom Namen her) ZIP-Dateien draus. Also, entweder echt mit einem ZIP-Programm packen, oder .xlsx in .zip umbenennen oder einfach .zip anhängen.
Übrigens: .xlsx- und .xlsm-Dateien sind in Wirklichkeit schon gezippte Dateien. Wenn du den Typ in .zip änderst, kannst du sie mit dem Windows Explorer oder einem ZIP-Programm öffnen. Es ist interessant, was da alles zu Tage kommt.

Nun zu deinen Fragen/Wünschen:

Das Problem mit der Nachtschicht: Eine Lösung könnte über die Speicher-Uhrzeit gehen. Ich vermute, dass die Nachtschicht-Datei irgendwann zwischen 6.00 und 8.00 gespeichert wird. Wenn dem so ist, könnte der Makro das feststellen und in diesem Fall das Vortags-Datum als Dateinamen setzen. Wäre das ein gangbarer Weg?

Verstehe ich das richtig?: Die Maschinenbediener bearbeiten die Excel-Datei und speichern sie dann mit dem Datumsnamen ab. Es soll dann verhindert werden, dass z.B. die Meisterei nachträglich Änderungen daran vornimmt.
Dann hilft es natürlich nicht, dass der Makro überprüft, ob es die Datei schon gibt und ein erneutes Speichern verhindert. Die Meisterei würde dann einfach unter neuem Namen speichern, die alte Datei löschen und die neue auf den alten Namen umbenennen.

Wie ist es denn bei euch mit Benutzer-Accounts und Zugriffsrechten geregelt? Hat da jeder Maschinenbediener und Meister seinen eigenen Account? Dann könnte man das ja vermutlich irgendwie über die Besitzrechte der Datei regeln. Da kenne ich mich aber zu wenig aus.

Natürlich kann man diese Spirale (Daten schützen - Schutz umgehen) mit den nötigen Hacker-Kenntnissen immer weiter treiben.
Die Frage ist, wie sehr vertraut man sich gegenseitig.
Eine (wenn auch schwache) Excel-interne Lösung könnte sein: Der Makro schreibt vor dem Speichern in eine Zelle (vielleicht auf ein geschütztes Blatt) den Namen des Benutzers.
Wird die Datei später geöffnet, überprüft der Makro ob der Benutzer, der sie öffnet derjenige ist, der in der Datei eingetragen ist. Wenn nicht öffnet der Makro die Datei schreibgeschützt. Aber auch das ist wie gesagt nur ein ganz schwacher Schutz.

Antworten erbeten...

Grüße, Andreas
 

Ibaas

Aktives Mitglied
Hallo Andreas,

zu dem Problem mit der Nachtschicht:
Ja das wäre ein gangbarer Weg. Bis spätestens 8 Uhr reicht vollkommen aus.

Zum Thema Maschinenbediener:
Ja das ist richtig. Zur Zeit hat der Maschinenbediener hat auf seinem Desktop einen Ordner in dem für jeden Tag eine Datei "Schichtübergabe" hinterlegt ist. Meine Idee ist, eine Verknüpfung auf dem Desktop hinterlegen mit dem Namen "Schichtübergabe" so wie sie im Anhang ist. Beim speichern dann den Namen mit Datum damit die Meisterei die Dateien lesen können. Wir arbeiten auch am Wochenende, deswegen das Datum und falls die Meisterei die Datei nicht zeitnah bearbeiten kann.

Die Zugriffsrechte sind hierarisch gestaffelt. Gespeichert werden sie auf einem zentralen Server. Da gebe ich dir recht, es wäre nur ein schwacher Schutz. Es ist auch selten vorgekommen das die analogen Blätter verschwunden sind. Vielleicht sollte man (mich eingeschlossen) der Meisterei ein bisschen mehr vertrauen entgegenbringen.

Was mir noch aufgefallen ist, in der Originaldatei Schichtübergabe sind die Macros nicht mehr vorhanden obwohl ich sie gespeichert habe. Da die Datei ja als Vorlage dient, muss sie doch drin sein. Oder habe ich da einen Gedankenfehler?

Gruß
Werner
 

Anhänge

  • Schichtübergabe.zip
    56,8 KB · Aufrufe: 2

nochEinAndreas

Stammgast
Gute Abend Werner,

hier nun die nächste Version der Schichtübergabe. Ich habe noch folgendes eingebaut:
  • Der Makro überprüft vor dem Speichern, ob der bisherige Dateiname schon einem Datum entspricht. Wenn ja wird "normal" gespeichert, d.h. es wird keine neue Datei mehr erzeugt.
  • Wenn die Datei zwischen 6 und 8 Uhr morgens gespeichert wird, ist es eine Nachtschicht-Datei. Dann erhält sie das Vortags-Datum.
  • Als Minimalschutz erhält die Datei nach dem Speichern einen Schreibschutz. Dieser kann natürlich über den Windows-Explorer mit Rechtsklick auf die Datei und "Eigenschaften" wieder abgeschaltet werden.
Wieso in deiner Schichtübergabe-Datei die Makros gefehlt haben: Keine Ahnung.

Gruß und schönen Abend,
Andreas
 

Anhänge

  • Schichtübergabe.zip
    68,4 KB · Aufrufe: 2

Ibaas

Aktives Mitglied
Hallo Andreas,

das speichern funktioniert wunderbar. Nur nicht wenn ich auf das X klicke. Dann will er die Datei unter dem Originalnamen speichern.

Gruß
Werner
 

nochEinAndreas

Stammgast
Hm,
eigentlich sollte er gar nicht speichern wollen, wenn du die Datei nur schließt. Ich schau's mir heute Abend noch mal an.

Gruß, Andreas
 

Ibaas

Aktives Mitglied
Doch es wäre sinnvoll wenn das speichern unter neuem Namen auch mit schließen der Datei geht.
 

nochEinAndreas

Stammgast
Was ist die Idee dahinter? Soll das ein Schutz sein, falls jemand vergisst, vor dem Schließen zu speichern?
Ich baue es gerne ein, es wäre mir aber wohler, wenn ich verstehen würde, wozu es dient.

Grüße, Andreas
 

Ibaas

Aktives Mitglied
Ja genau das ist der Grund. Und ich habe festgestellt, das die Kollegen lieber die Datei schießen und dann auf den Speichern Button klicken anstatt die Tastenkombination nehmen.
 

nochEinAndreas

Stammgast
OK, dann baue ich das ein. Ich würde das aber so machen: Wenn vor dem schließen schon gespeichert wurde (der Name enthält schon ein Datum) wird nicht noch mal gespeichert. Also im Prinzip genau so, wie es jetzt schon passiert, wenn du die Datei speicherst, schließt, neu öffnest und noch mal speichern willst. Damit wird verhindert, dass die Datei ein neues Datum erhält.

Gruß, Andreas
 

Ibaas

Aktives Mitglied
Was ist aber, wenn die Datei aus Versehen geschlossen wird und der Kollege von der Frühschicht aus Gewohnheit auf speichern drückt. Dann kann die Spätschicht und Nachtschicht nicht mehr speichern.
Es ist auch nicht möglich, das nur die Nachtschicht die Datei speichert. Nach unserem Schichtplan ist nicht immer eine Nachricht da. Auch eine Frühschicht ist nicht immer da, sonst könnte man sagen das die das macht.

Das ist alles nicht einfach. Bisher sind ungefähr 50 Mitarbeiter an 5 Anlagen beauftragt die Datei auszufüllen. Deshalb sollte das so einfach und sicher wie möglich gehalten werden

Gruß Werner
 

11291PCtipp

Stammgast
Für einen zuverlässigen Excel Dateien Betrieb scheint in diesem Fall eine Speicherung auf einer Server Freigabe nötig zu sein.
 

nochEinAndreas

Stammgast
Hallo Werner,

Das ist alles nicht einfach
Das scheint mir auch so.
Du müsstest jetzt noch mal ganz genau sagen:
  • Was soll beim Speichern passieren? Wann soll eine neue Datei angelegt werden? Wann soll die alte überschrieben werden? Wann soll gar nichts geschehen?
  • Was soll beim Schließen passieren? Wann soll eine neue Datei angelegt werden? Wann soll die alte überschrieben werden? Wann soll gar nichts geschehen?
  • Was gibt es sonst noch zu beachten?
Vorher macht es keinen Sinn, dass ich "irgendetwas" programmiere.

Danke und Gruß,
Andreas
 

Ibaas

Aktives Mitglied
Hallo Andreas,

erstmal muss ich mich bei dir für deine Mühen und deine Geduld bedanken. Mir war zunächst nicht bewusst, das dass lösen eines Problems gleich ein neues Problem nach sich zieht.

Nach nochmaliger Überlegung hab ich die Sache mit dem Sicherheitskonzept verworfen. Wie du schon sagtest, wenn die Meisterei etwas in der Datei ändern will gibt es immer einen Weg.

Mein Ziel ist es, es den Kollegen und mir so einfach und sicher wie möglich zu machen. Das bedeutet, aus dem Istzustand von 12 Ordnern mit über 360 Dateien eine Vorlage zu machen die immer zu Schichtbeginn aufgerufen werden kann. Diese Datei soll sich per Verknüpfung auf dem Desktop befinden. Ebenso soll sich ein Ordner "Schichtübergabe" auf dem Desktop befinden in dem die Dateien mit dem Namen und dem Datum gespeichert werden. Aus diesem Ordner kann sich die Meisterei dann die Datei aufrufen die sie braucht.

Nun zu den "Feinheiten":
Da wir ja im 3 Schichtsystem arbeiten darf sich das Datum der zu speichernde Datei am Folgetag nicht ändern. Was mir aufgefallen ist, ist wenn ich die Datei mit STRG+S speichere, erscheint der neue Name der Datei ganz oben über den Reitern. Kann man das vielleicht nutzen, um nach dem öffnen der Vorlage die Datei, sagen wir mal nach ein paar Sekunden automatisch speichert? Dann ist ja der neue Name bereits vorhanden und bei jedem weiteren speichern, egal ob über STRG+S oder wenn man die Datei schließt, würde sie ja mit dem neuen Namen überschrieben. Dadurch würde doch der Datumswechsel nicht mehr stören, oder? Das Makro bezieht das Datum doch aus dem System und nicht aus der Datei oder?

Zusammengefasst:
Die Datei "Schichtübergabe" ein paar Sekunden nach dem öffnen automatisch mit neuem Namen speichern.

Alles andere hat keinen Sinn.

Vielen Dank nochmal für deine Geduld.

Gruß Werner
 

nochEinAndreas

Stammgast
Hallo Werner,

ich denke, das ist ein guter Vorschlag. So kann ich es gut umsetzen. Ein paar Feinheiten muss ich aber noch wissen bzw. anmerken:
  • Du sagst, auf dem Desktop wird es eine Ordner "Schichtübergabe" geben in den die Datei gespeichert werden soll. Hat jeder Bearbeiter seinen eigenen Account? Wenn ja, gibt es ja auch mehrerer Desktops. Hat also jeder Bearbeiter seinen eigenen Unterordner "Schichtübergabe", oder gibt es eine Art Sammel-Account? Das müsste der Makro berücksichtigen.
  • Ich schlage vor, das Automatische Speichern nach dem öffnen nur dann zu machen, wenn die Datei unter dem Vorlagennamen geöffnet wurde, und nicht mit Datumsnamen. Z.B. wenn sie von der Meisterei geöffnet wird, soll sie ja nicht noch mal gespeichert werden.
  • Beim öffnen der Vorlage würde der Makro weiterhin prüfen, ob schon eine Datei mit dem aktuellen Datum vorhanden bzw. geöffnet ist. Ist das der Fall, würde nicht noch mal automatisch gespeichert. Das könnte z.B. sein, wenn der Bearbeiter aus Versehen die Vorlage 2x öffnet.
  • Ich würde zur Vorlagen-Datei ein Weiteres Blatt "Settings" hinzufügen. Dort kannst du (oder wer auch immer als "Admin" arbeitet) Einstellungen festlegen. Das könnten jetzt in der "ersten Phase" sein:
    • Der Ordner, in den gespeichert werden soll.
    • Die Zeit vom öffnen bis zum Speichern.
Du könntest das dann selber ändern, wenn nötig. Dieses Blatt könntest du auch ausblenden, damit sich niemand wundert.
Wäre das so genehm?

Gruß und schönes Wochenende,
Andreas
 

Ibaas

Aktives Mitglied
Hallo Andreas,

zu Punkt 1:
Es gibt pro Anlage einen PC. Der hängt am Server. Die Meister haben jeweils Zugriff auf die PCs. Die PCs untereinander sind nicht vernetzt. Jeder Mitarbeiter kann an den PC seiner Anlage gehen.
An den Anlagen kommt dann ein Ordner mit dem Namen der Anlage (Anlage 1, ..... 2, .... 3) usw. Also pro Anlage ein Ordner. Wie ich vor dem Datum einen Namen setzen kann hab ich schon rausgefunden.

zu Punkt 2:
Das hatte ich auch so gemeint. Entschuldige wenn das nicht so rüber gekommen ist.

Punkt 3:
Das hört sich vernünftig an.

Punkt 4:
Hört sich auch gut an, auch wenn ich im ersten Moment nichts damit anfangen kann. Werde mich aber reinarbeiten. Mit deinen super erklärungen dürfte das nicht so schwer sein.

Ja das wäre mir sehr recht.

Auch dir einen schönen Abend und ein schönes Wochenende. Werde um 22 Uhr auch Wochenende haben.

Gruß Werner
 

Ibaas

Aktives Mitglied
PS:
Hoffe ich habe alles verständlich erklärt. Ist nicht so einfach Dinge zu erklären die einem in Fleisch und Blut übergegangen sind
 

nochEinAndreas

Stammgast
Guten Morgen Werner,

nach deinen Antworten sind bei mir schon wieder weitere Fragen aufgetaucht:
  • Es gibt 3 PCs. Auf jedem Desktop gibt es einen Ordner für die Tagesdateien. Diese Ordner heißen "Anlage 1", "Anlage 2", Anlage 3", je nach PC Richtig? D.h.,
    • entweder müsste der Makro anhand des Rechnernamens den richtigen Ordnernamen finden, indem er speichern muss. Das ist sicherlich irgendwie möglich. Dazu müsstest du mir aber wohl mal die Namen der Rechner zukommen lassen und deren Zuordnung zu Anlage 1, 2 und 3.
    • Oder der Makro muss einfach ausprobieren, welcher Ordner vorhanden ist und diesen benutzen.
    • Oder du müsstest auf dem Blatt "Settings" den entsprechenden Ordnernamen eintragen, getrennt für jeden Makro auf jedem PC.
    • Oder du nennst den Ordner auf jedem PC gleich: "Schichtübergabe". Dann gibt es gar keine Probleme.
    • Oder du hast noch eine andere Idee, wie der Makro den richtigen Ordner finden soll.
  • Wie ist das mit den Bearbeitern. Melden die sich jeweils mit eigenen namentlichen Accounts an den Rechnern an? Dann hätte ja jeder Bearbeiter seinen eignen Desktop, auf dem ein Unterordner liegt. Oder gibt es für jeden Rechner eine Art Sammelaccount, "Anlage1" oder sowas, mit dem sich jeder anmeldet. Dann wird die Sache einfach, weil es nur einen Desktop gibt.
Wenn diese Fragen beantwortet sind, ist alles klar für's Makro-schreiben. Zu mindest so weit ich es bisher überblicken kann.

Gruß und schönen Sonntag,
Andreas
 
Oben