Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1616to1620
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

Speichern unter, fortlaufende Nr. mit Prüfung

Speichern unter, fortlaufende Nr. mit Prüfung
07.04.2018 00:21:20
McFly_HL
Hallo,
habe mich nach langer Zeit mal wieder an eine kleine Sache herangewagt und verstehe eine Sache nicht wirklich.
Wäre klasse wenn Ihr mir etwas helfen könntet.
Ich habe für einen Basar ein automatisiertes Kassensystem gebastelt und haut auch wunderbar hin.
Hier der relevante Teil zur Funktion des UserForms:

Private Sub UserForm_Initialize()
'Einträge für Schaltflächen
KassenForm.KundenIDBox.Value = ""
KassenForm.AnbieternrBox.Value = ""
KassenForm.ArtikelnrBox.Value = ""
KassenForm.PreisBox.Value = ""
End Sub
Private Sub CommandNextItem_Click()
'Artikel in Tabelle übernehmen und nächsten Artikel, Kunden-ID bleibt gleich!
Dim last As Integer
last = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row + 1
ActiveSheet.Cells(last, 1).Value = KassenForm.KundenIDBox
ActiveCell.Value = KassenForm.KundenIDBox * 1
'Das * 1 macht aus einem Text eine Zahl in Excel! Beispiel: Range("A1").Value = UserForm1. _
TextBox1 * 1
ActiveSheet.Cells(last, 2).Value = KassenForm.AnbieternrBox
ActiveSheet.Cells(last, 3).Value = KassenForm.ArtikelnrBox
ActiveSheet.Cells(last, 4).Value = CCur(KassenForm.PreisBox)     'CCur mit Euro-Angabe    _
CDate wäre für Datumsformat
last = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row + 1
KassenForm.AnbieternrBox.Value = ""
KassenForm.ArtikelnrBox.Value = ""
KassenForm.PreisBox.Value = ""
KassenForm.AnzahlArtikelBox.Value = Range("K2").Value * 1
KassenForm.SummeBox.Value = Format(CDbl(Range("E2")), "#,###.00 €")
Sum = Format(CDbl(Range("E2")), "#,###.00 €")
KassenForm.AnbieternrBox.SetFocus
Call speichern_unter_fortlaufend
End Sub
Da mein Laptop keine Batterie mehr hat und ich vermeiden möchte, im Falle eines Stromausfalls alle Daten zu verlieren, habe ich versucht ein Speichern unter Makro zu basteln, das hat leider nicht hingehauen.
ich habe mir daher eines in den Foren gesucht und angepasst.
Leider funktioniert es nicht so wie gedacht.
  • Bei jedem Drücken des Buttons: "CommandNextItem" (Datenübergabe in die Tabelle), soll die Excel-Datei unter einer fortlaufenden Nr. gespeichert werden, ohne dass das einer sieht.

  • Zur Zeit passiert folgendes: (Ich habe DisplayAlerts zum Testen erstmal rausgenommen)
  • 1. Drücken des Buttons,
    Es wird im entsprechenden Pfad eine Datei gespeichert die eine 1 angefügt hat.
    Das passt also.

  • 2. Drücken des Buttons,
    System fragt mich, da "DisplayAlerts True", ob die bereits vorhandene Datei mit der angehängten 1 überschrieben werden soll!?
    Das ist Mist...

  • Es soll wie folgt funktionieren:
  • Beim 2., 3., 4. usw. Drücken des Buttons,
    System erkennt falls die Datei bereits vorhanden und erhöht den Zähler automatisch solange weiter bis der Pfad leer ist

  • In etwa so:
    Do Until pfad = ""
    zähler = zähler + 1
    pfad = Dir()
    
    Aber das bekomme ich leider nicht hin :-(
    Hier die gefundene Version die ich versucht habe umzubauen.
    
    Sub speichern_unter_fortlaufend()
    Dim pfad As String
    Dim Filename As String
    'Filename:=Filename
    pfad = ThisWorkbook.Path
    Dim i As Long
    With Application.FileSearch
    .LookIn = pfad
    'Filename = Execute
    If .Execute > 0 Then i = .FoundFiles.Count
    i = i + 1
    'Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs Filename:=pfad & "\" & "Abrechnung2018_V1.7" & Format(i, "0") & ".xlsm",  _
    CreateBackup:=False
    'Application.DisplayAlerts = True
    End With
    End Sub
    
    Ich bedanke mich schonmal und freue mich auf jede Hilfe.
    LG Fly

    12
    Beiträge zum Forumthread
    Beiträge zu diesem Forumthread

    Betreff
    Datum
    Anwender
    Anzeige
    AW: Speichern unter, fortlaufende Nr. mit Prüfung
    07.04.2018 02:15:52
    Oberschlumpf
    Hallo
    hier, versuch mal:
    Sub speichern_unter_fortlaufend()
    Dim lstrFile As String, lstrSplit() As String
    lstrFile = ThisWorkbook.FullName
    lstrFile = Left(lstrFile, Len(lstrFile) - 5)
    lstrFile = Replace(lstrFile, "Abrechnung2018_V1.7", "")
    If Right(lstrFile, 1) = "\" Then
    lstrFile = lstrFile & "Abrechnung2018_V1.71.xlsm"
    Else
    lstrSplit = Split(lstrFile, "\")
    lstrFile = Left(lstrFile, Len(lstrFile) - Len(lstrSplit(UBound(lstrSplit))))
    lstrFile = lstrFile & "Abrechnung2018_V1.7" & CInt(lstrSplit(UBound(lstrSplit))) _
    + 1 & ".xlsm"
    End If
    ActiveWorkbook.SaveAs Filename:=lstrFile
    End Sub
    

    (Zeilen, die hier mit _ enden, sind von der Forumssoftware eingefpgte Zeilenumbrüche; bitte entfernen)
    Hilfts?
    Ciao
    Thorsten
    Anzeige
    es soll doch...
    08.04.2018 12:20:09
    Oberschlumpf
    Hi
    ...nach deiner Beschreibung so etwas herauskommen, oder?
    Userbild
    Mit der Datei "Abrechnung2018_V1.7.xlsm" beginnt alles.
    Und Dateien wie...
    Abrechnung2018_V1.71.xlsm
    Abrechnung2018_V1.72.xlsm
    Abrechnung2018_V1.73.xlsm
    ...usw...
    ...sind dann das Ergebnis, erreichbar mit meinem Code.
    Dann versuch es doch mal meinen Code^^
    Sollte auch hier das Problem auftreten mit "xlsm", bzw "xls", dann speicher...
    ...von deiner Originaldatei eine Kopie im "xls"-Format
    ...ersetz im Code jedes "xlsm" durch "xls"
    ...und probiere es
    Bin noch immer auf ne Antwort von dir gespannt.
    Ciao
    Thorsten
    Anzeige
    AW: es soll doch...
    09.04.2018 00:06:16
    McFly_HL
    Hey Thorsten,
    Ja genau so sollte es aussehen.
    Werde Morgen mal Deinen Code probieren.
    Bin auch gespannt, scheint aber tatsächlich an Excel 2003 zu liegen.
    Bei SaveAs funktionierte das tadellos, wechselte dann aber immer in die Zieldatei.
    Naja wäre ja nicht schlimm ^^
    Gruß Fly
    AW: Speichern unter, fortlaufende Nr. mit Prüfung
    07.04.2018 09:06:53
    fcs
    Hallo Fly,
    für die reine Angst vor einem einem Stromausfall müsstets du die Datei ja nicht jedes mal mit SaveAs unter einem anderen Namen speichern sondern es reicht, wenn die Datei nach jedem Eintrag ins Tabellenblatt "einfach" mit Save gespeichert wird.
    Wenn der Anwender (Datenerfasser) von dem Erstellen einer Kopie nichts (fast nichts) merken soll, dann solltest du mit SaveCopyAs arbeiten. Das hat den Vorteil, das der Name der gerade geöffneten Datei unverändert bleibt. Nach einem Stromausfall/versehentlichem Ziehen des Steckers musst du dann nur die letzte Sicherheitskopie unter dem Namen der Originaldatei speichern.
    Private mlngLfdNr As Long 'als modulweite Variable deklarieren
    Sub speichern_unter_fortlaufend()
    Dim pfad As String
    Dim sFilename As String
    Dim i As Long
    Dim sFormatNr As String
    sFormatNr = """_""0000" 'Format der laufenden Nr im Dateinamen
    pfad = ThisWorkbook.Path & "\Copy" 'Verzeichnis Sicherheitskopien
    If Dir(pfad, vbDirectory) = "" Then
    VBA.MkDir pfad
    mlngLfdNr = 0
    End If
    'Dateiname ohne laufende Nr.
    sFilename = ThisWorkbook.Name
    sFilename = Left(sFilename, InStrRev(sFilename, ".") - 1)
    If mlngLfdNr = 0 Then
    'nächste fortlaufende Nr. für Sicherheitskopie ermitteln
    i = 0
    Do
    i = i + 1
    If Dir(pfad & "\" & sFilename & Format(i, sFormatNr) & ".xlsm") = "" Then
    mlngLfdNr = i
    Exit Do
    End If
    Loop
    Else
    mlngLfdNr = mlngLfdNr + 1
    End If
    sFilename = pfad & "\" & sFilename & Format(mlngLfdNr, sFormatNr) & ".xlsm"
    ThisWorkbook.SaveCopyAs Filename:=sFilename
    End Sub
    
    Das Ganze wird einfacher, wenn du die Sicherheitskopie einfach mit einem Zeitstempel speicherst. z.B.
    Sub SicherheitsKopie()
    With ThisWorkbook
    .SaveCopyAs Filename:=.Path & "\" _
    & "Copy-" & Format(Now, "YYYY-MM-DD hh_mm_ss") & ThisWorkbook.Name
    End With
    End Sub
    
    Gruß
    Franz
    Anzeige
    AW: Speichern unter, fortlaufende Nr. mit Prüfung
    07.04.2018 11:15:42
    McFly_HL
    Vielen Dank für die schnellen Antworten,
    ich werde es heute Abend mal testen und melde mich dann wieder.
    Fly
    AW: Speichern unter, fortlaufende Nr. mit Prüfung
    07.04.2018 16:17:32
    McFly_HL
    Hallo Frank,
    ich habe erstmal Deine Lösung angeschaut, weil mir die Idee mit "SaveCopyAs" gefiehl.
    die andere Lösung werde ich mir später auch nochmal anschauen.
    Leider scheint es ein Problem bei der Speicherung der Datei zu geben, denn wenn ich versuche eine der Sicherheitskopien zu öffnen, folgt folgender Fehler.
    Userbild
    ich sehe da keinen Fehler, und .xlsm muss es ja sein weil es sich um eine Excel-Datei mit Makros handelt ...
    Woran könnte die Fehlermeldung liegen?
    Achja, die Lösung ist genau die die ich haben wollte ;-), manchmal macht es doch Sinn ausführlich zu schreiben.
    Gruß Fly
    Anzeige
    AW: Speichern unter, fortlaufende Nr. mit Prüfung
    07.04.2018 23:36:05
    fcs
    Hallo Fly,
    Woran könnte die Fehlermeldung liegen?
    ich kann wenig dazu sagen, da bei mir das Makro unter Excel 2010 einwandfrei funktioniert und ich die erstellten Dateien ohne Probleme öffnen kann.
    Wenn du tatsächlich mit Excel 2003 arbeitest, dann haben allerdings die Dateien normalerweise die Endung "xls" und nicht "xlsm".
    Meines Wissens kann xlsx/xlsm-Dateien mit einem Zusatztool (Viewer) unter Excel 2003 zwar ansehen, aber nicht im Originalformat bearbeiten/speichern.
    Gruß
    Franz
    Interessantes Phänomen
    08.04.2018 00:18:09
    McFly_HL
    Hi Frank,
    ja Du hast Recht, Excel 2003 öffnet die xlsm und xlsx Dateien mittels eines Datenkonverters.
    Ich verstehe nur eines nicht, warum kann ich die Originaldatei mit xlsm Endung öffnen und die Kopie welche mit SaveCopyAs erstellt wurde plötzlich nicht mehr ...
    Falls da keiner eine Erklärung haben sollte bzw. keine Lösung in Sicht ist, werde ich wohl doch die Lösung mit Speichern unter versuchen müssen, da wurde mir ja bereits ein Makro vorgeschlagen.
    Dickes sorry das ich da noch keine Zeit zu hatte mir das anzusehen. Werde mir das morgen Abend mal anschauen. Wenn das mit dieser Variante dann funktioniert, nehme ich halt diese Möglichkeit, auch wenn mir die Version mit SaveCipyAs besser gefällt, weil die originale Datei geöffnet bleibt
    Gute Nacht
    Fly
    Anzeige
    Falsches Format .xls muss aber .xlsm haben.
    08.04.2018 11:33:46
    McFly_HL
    Hallo nochmal,
    ich meine die Problematik erkannt zu haben.
    SaveCopyAs speichert die Datei als .xls.
    Da im Makro die .xls Kopie mit der .xlsm Endung versehen wird, kommt der Konverter von Excel 2003 durcheinander und kann die Kopie nicht ändern.
    Ich habe das getestet, indem ich eine der Kopien in eine .xls Datei umbenenne und schon ließ sie sich öffnen.
    Jetzt meine Fragen zum Thema:
  • Ich war immer der Meinung das Exceldateien mit enthaltenem Makro, .xlsm Dateien sein müssen.
    Warum funktioniert das Makro denn noch obwohl es jetzt eine xls. Datei ist?
    Liegt das daran das ich Excel 2003 nutze?
    Kann Excel 2010 und folgende die Datei dann öffnen oder muss es bei denen dann wieder eine xlsm sein?/li>
  • Kann man die Datei nicht gleich direkt als xlsm speichern?
    Ich habe im folgendem Forum einen Beitrag zu diesem Thema gefunden.
    https://www.mrexcel.com/forum/excel-questions/504233-vba-save-copy-cannot-open-file.html

  • Vielleicht könnte man das Dateiformat 52 = xlOpenXMLWorkbookMacroEnabled (Excel 2007 mit oder ohne Makros - XLSM) ja in das Makro einbringen, so dass der Dateikonverter das richtige Format vorliegen hat?
    Dann dürften sich die Dateien auch wieder öffnen lassen.

  • Vielen Dank und Gruß
    Fly
    You have to save a Workbook in the Same file format as you run the Save Procedure. Excel will not recognize the new WB as the same Type WB from where it was saved from..
    So the Save As Module sits in Personal.xlsm, so when I run the Macro it saves the workbook as a .xlsx but since Macro originally came from Personal.xlsm it confuses Excel and it thinks it should be a .xlsm file.
    So if I use the same macro in a module within the WB then it works fine. IF you run a macro from another location. It thinks its a .xlsm but saved as a .xlsx. So it says file format invalid.

    Die Antwort hierzu:
    Instead of doing a .SaveCopyAs to the new filename and continue with the original name active, try this: do a .SaveAs to the new filename specifying the file format, then do a .SaveAs back to your original filename. That will have the same final result.
    Here's how to specify the file format when doing a .SaveAs:
    ThisWorkbook.SaveAs ("C:\Users\MTS\Documents\Excel Backup Files\" & wbName), FileFormat:=xlOpenXMLWorkbook
    
    or:
    ThisWorkbook.SaveAs ("C:\Users\MTS\Documents\Excel Backup Files\" & wbName), FileFormat:=51
    
    That's assuming you're saving an XLSX file. For other types, use:-
    51 = xlOpenXMLWorkbook (Excel 2007 without macros - XLSX)
    52 = xlOpenXMLWorkbookMacroEnabled (Excel 2007 with or without macros - XLSM)
    50 = xlExcel12 (Excel 2007 Binary Workbook with or without macros - XLSB)
    56 = xlExcel8 (Excel 97-2003 - XLS)

    Anzeige
    AW: Falsches Format .xls muss aber .xlsm haben.
    08.04.2018 13:38:07
    fcs
    Hallo Fly,
    die Datei-Formate xlsx, xlsm, xlsb, xltx, xltm gibt es erst seit Excel 2007
    Wenn du in verschiedenen Excel-Versionen (2003 und 2007 und neuer) arbeiten willst/musst, dann ist es am besten, wenn du die Datei unter Excel 2007 oder neuer via speichern unter im Format "97-2003" speicherst.
    Evtl. funktioniert es auch wenn du die per Konverter in Excel 2003 geöffnete XLSM-Datei via "Speichern unter" als xls-Datei speicherst - hab da aber keine Erfahrung.
    Du solltest in der Datei keine Formartierungen oder andere Features verwenden, die nur in den neueren Versionen verfügbar sind - Excel meldet ggf. unter 2007 und neuer Verluste wenn du die Datei im älteren Format speicherst.
    SaveCopyAs speichert die Datei immer in dem Format in dem die Datei erstellt wurde bzw. dem Format, das die Excel-Verson verarbeiten kann. D.h. in den neueren Excel-Versionen bleibt es bei der XLS-Datei.
    Wenn man verschieden Dateiformate mit SaveCopys verarbeiten möchte, dann muss man beim erstellen des Dateinamen ggf. die Dateereiterung berücksichtigen.
    Deshalb bevorzuge ich hier eine Variante, die einfach Text vor den Original-Dateinamen setzt, weil es einfacher zu programmieren ist.
    Gruß
    Franz
    Anzeige
    AW: Falsches Format .xls muss aber .xlsm haben.
    09.04.2018 00:01:09
    McFly_HL
    Hallo Franz,
    ich wollte mich nochmal für die Hilfe bedanken.
    ich wollte noch fix eine Sache verdeutlichen.
    Die Originaldatei hat die Dateiendung .xlsm, da ich die ersten Makrozeilen auf einem Rechner mit Excel 2010 geschrieben habe, und die Version natürlich sagte, speichere Makros als xlsm ab.
    Also es sieht so aus, als wenn alle Versionen ab Excel 2007 das Dateiformat xlsm bei SaveCopyAs erkennt und dann auch die Zieldatei mit xlsm speichert.
    Beim Durchführen von SaveCopyAs mit Excel 2003 bei einer xlsm Datei, erkennt Excel 2003 das Format natürlich nicht und speichert die Zieldatei als xls Datei ab.
    Da in Deinem Makro der Dateiname mit .xlsm endete, resultierte daraus eine xls Datei mit xlsm Endung was Excel 2003 bzw. der Dateikonverter nicht verarbeiten kann.
    Ich habe die Endung im Makro daher auf XLS geändert und jetzt gehts.
    Beim Ausführen des Makros mit einer neueren Excel-Version würde es möglicher Weise zu einem ähnlichen Phänomen kommen, da die neueren Excelversionen eine xlsm Datei generieren, wird die mit dem Makro jetzt mit einer XLS Endung versehen.
    Ich bin mir nicht ganz sicher, aber könnte es sein, das bei neueren Excel-Versionen, das Ändern der Endung zum Löschen der Makros führt, weil XLS keine Makros beinhalten kann?
    Gruß Fly
    Anzeige
    AW: Falsches Format .xls muss aber .xlsm haben.
    09.04.2018 07:34:12
    fcs
    Hallo Fly,
    man kann die Excel-Version prüfen in der die Datei geöffnet ist und die Dateierweiterung für die Sicherungkopien entsprechend festlegen.
    Gruß
    Franz
    
    Private mlngLfdNr As Long 'als modulweite Variable deklarieren
    Sub speichern_unter_fortlaufend()
    Dim pfad As String
    Dim sFilename As String, sExt As String
    Dim i As Long
    Dim sFormatNr As String
    sFormatNr = """_""0000" 'Format der laufenden Nr im Dateinamen
    pfad = ThisWorkbook.Path & "\Copy" 'Verzeichnis Sicherheitskopien
    If Dir(pfad, vbDirectory) = "" Then
    VBA.MkDir pfad
    mlngLfdNr = 0
    End If
    'Dateiname ohne laufende Nr.
    sFilename = ThisWorkbook.Name
    Select Case Val(Left(Application.Version, 2))
    Case Is > 11 '2007 und neuer
    sExt = Mid(sFilename, InStrRev(sFilename, "."))
    Case Else
    sExt = ".xls"
    End Select
    sFilename = Left(sFilename, InStrRev(sFilename, ".") - 1)
    If mlngLfdNr = 0 Then
    'nächste fortlaufende Nr. für Sicherheitskopie ermitteln
    i = 0
    Do
    i = i + 1
    If Dir(pfad & "\" & sFilename & Format(i, sFormatNr) & sExt) = "" Then
    mlngLfdNr = i
    Exit Do
    End If
    Loop
    Else
    mlngLfdNr = mlngLfdNr + 1
    End If
    sFilename = pfad & "\" & sFilename & Format(mlngLfdNr, sFormatNr) & sExt
    ThisWorkbook.SaveCopyAs Filename:=sFilename
    End Sub
    

    Anzeige

    Links zu Excel-Dialogen

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige