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

letzte Zeichen im Dateinamen vergleichen

letzte Zeichen im Dateinamen vergleichen
18.03.2023 12:16:56
Thomas

Guten Tag miteinander...

Kann mir jemand zeigen wie ich den Code zusammensetze um folgendes damit zu erreichen?

Ich will beim neu speichern einer Arbeitsmappe im Verzeichnis zuerst die Dateien prüfen ob in einem schon bestehenden Dateiname die Letzten 11 Zeichen vorhanden sein könnten. Diese Information zum vergleichen die hole ich mir via Variable in der zu speichernden Tabelle, einer Zelle ab.

Für ein Lösungsansatz wäre ich dankbar.

Freundliche Grüsse
Thomas

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: letzte Zeichen im Dateinamen vergleichen
18.03.2023 13:50:56
Mathias
Hallo Thomas,

du kannst in das im Workbook.BeforeSave Event machen. (https://learn.microsoft.com/en-us/office/vba/api/excel.workbook.beforesave)
Und mit der Right-Funktion kannst du dir die letzten Zeichen eines Strings geben lassen. (https://learn.microsoft.com/de-de/office/vba/language/reference/user-interface-help/right-function)

Liebe Grüße
Mathias


AW: letzte Zeichen im Dateinamen vergleichen
19.03.2023 01:27:40
Mathias
Hallo Thomas,

Anhand deines ersten Posts habe ich mal ein kleines Makro zusammen geschrieben, dass hoffentlich das macht, was du möchtest:
Option Explicit

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)           'Der Code wird ausgeführt, bevor die Arbeitsmappe gespeichert wird.
    If SaveAsUI = True Then                                                             'Der Code läuft nur wenn das "Speichern unter..." Fenster öffnen würde. Also nicht, wenn man eine vorhandene Arbeitsmappe nur abspeichert.
        Dim strName, strFullName, strPath, strFiles, strNamePart As String              'Deklarierung der Variablen, die im Code verwendet werden.
        
        strName = Left(ActiveWorkbook.Name, InStrRev(ActiveWorkbook.Name, ".") - 1)     'Der Name der Arbeitsmappe ohne Extension
        
Restart:                                                                                'An diesen Punkt wird gesprungen, wenn ein Fehler aufgetreten ist.
If Err.Number > 0 Then                                                                 'Wird ausgeführt, falls ein VBA-Fehler aufgetreten ist.
    MsgBox Err.Description, vbExclamation, "Microsoft Excel"                            'Anzeige der Beschreibung des Fehlers
    
    Err.Clear                                                                           'Reset der Fehlerbehandlung
    On Error GoTo 0                                                                     'Reset der Fehlerbehandlung
End If



        strFullName = Application.GetSaveAsFilename(strName, "Excel-Arbeitsmappe (*.xlsx), *.xlsx,Excel-Arbeitsmappe mit Makros (*.xlsm), *.xlsm")                                                      'Hier wird das "Speichern unter..." Fenster geöffnet. (Man kann als xlsx oder xlsm speichern)
        
        If VarType(strFullName) = 8 Then                                                                                                                                                                'Falls das "Speichern unter..." Fenster geschlossen wird, wird nichts gemacht.
            If MsgBox("Die folgenden Features können in Arbeitsmappen ohne Makros nicht gespeichert werden:" & vbNewLine & vbNewLine & Chr(149) & " VB Projekt" & vbNewLine & vbNewLine & _
            "Zum Speichern einer Datei mit diesen Features klicken Sie auf 'Nein'. Wählen Sie dann einen Dateityp mit aktivierten Makros in der Liste 'Dateityp' aus." & vbNewLine & vbNewLine & _
            "Klicken Sie auf 'Ja', um die Datei als Arbeitsmappe ohne Makros zu speichern.", vbInformation + vbYesNo, "Microsoft Excel") = 7 Then GoTo Restart                                          'Der Hinweis wenn mein eine Arbeitsmappe mit Makro als xlsx speichern will.
            
            strPath = Left(strFullName, InStrRev(strFullName, "\"))                                                                                                                                     'Hier wird der Pfad vom Ordner extrahiert. (wo die Datei gespeichert werden soll)
            strNamePart = GetNamePart(strFullName)
            strName = GetName(strFullName)
            
            strFiles = Dir(strFullName)                                                                                                                                                                 'Hier wird geprüft, ob die Datei bereits existiert.
            If strFiles = "" Then                                                                                                                                                                       'Dieser Code wird ausgeführt, wenn die Datei noch nicht existiert.
                strFiles = Dir(strPath)
                While strFiles > ""                                                                                                                                                                    'Hier wird durch alle Dateien im Ordner geschleift.
                    If strNamePart = GetNamePart(strFiles) Then                                                                                                                                         'Hier wird geprüft, ob die Dokumentennummer bereits existiert.
                        MsgBox "Diese Dokumentennummer existiert bereits. Bitte wählen Sie eine andere Dokumentennummer aus.", vbExclamation, "Dokumentennummer bereits vorhanden!"                     'Meldung, dass die Dokumentennummer bereits existiert.
                        GoTo Restart                                                                                                                                                                    'Springt zurück um einen neuen Dateinamen auszuwählen.
                    End If
                    strFiles = Dir                                                                                                                                                                      'Gehört zur Schleife
                Wend                                                                                                                                                                                    'Gehört zur Schleife
                On Error GoTo Restart                                                                                                                                                                   'Wenn ein VBA-Fehler kommt, soll eine Meldung erscheinen und nochmal gestartet werden.
                SaveWorkbook (strFullName)
            Else
                If MsgBox(strName & "." & GetExtension(strFullName) & " ist bereits vorhanden." & vbNewLine & "Möchten Sie sie ersetzen?", _
                vbExclamation + vbYesNo + vbDefaultButton2, "Speichern unter bestätigen") = 7 Then GoTo Restart                                                                                         'Meldung falls die Datei bereits existiert.
                On Error GoTo Restart                                                                                                                                                                   'Wenn ein VBA-Fehler kommt, soll eine Meldung erscheinen und nochmal gestartet werden.
                SaveWorkbook (strFullName)
            End If
        End If
        Cancel = True                                                                                                                                                                                   'Unterdrückt das eigentliche "Speichern unter..." Fenster.
    End If
End Sub

Private Sub SaveWorkbook(ByVal strFileName As String)                                                                                                                                                   'Diese Methode speichert die Datei ab.
    Application.DisplayAlerts = False                                                                                                                                                                   'Unterdrückt die normalen Speicher Meldungen, da diese im Code behandelt werden.
    Select Case GetExtension(strFileName)
    Case "xlsx"
        ActiveWorkbook.SaveAs fileName:=strFileName, FileFormat:=51, ConflictResolution:=2
    Case "xlsm"
        ActiveWorkbook.SaveAs fileName:=strFileName, FileFormat:=52, ConflictResolution:=2
    End Select
    Application.DisplayAlerts = True
End Sub

Private Function GetName(ByVal strFullName As String) As String                                                                                                                                         'Gibt den ausgewählten Dateinamen ohne Extension zurück.
    strFullName = Right(strFullName, Len(strFullName) - InStrRev(strFullName, "\"))
    GetName = Left(strFullName, InStrRev(strFullName, ".") - 1)
End Function

Private Function GetNamePart(ByVal strFullName As String) As String                                                                                                                                     'Gibt die Dokumentennummer zurück.
    GetNamePart = Right(Left(strFullName, InStrRev(strFullName, ".") - 1), 11)
End Function

Private Function GetExtension(ByVal strFullName As String) As String                                                                                                                                    'Gibt die FileExtension zurück.
    GetExtension = Right(strFullName, Len(strFullName) - InStrRev(strFullName, "."))
End Function
Dies fügst du im VBA Editor in "DieseArbeitsmappe" ein.

Der Code läuft nur, wenn die Arbeitsmappe mit dem "Speichern unter..." Fenster gespeichert werden soll. Also nicht, wenn du einfach nur auf "Save" drückst um Änderungen zu speichern.
Du kannst nur noch im xlsx oder im xlsm Format speichern. Natürlich kannst du das bei Bedarf noch erweitern.
Der Code schaut jetzt auf keine Zelle. Das müsstets du selbst mit rein programmieren.
Es öffnet sich ein "Speichern unter..." Fenster wo du wie gewohnt auswählen musst wo und mit welchem Namen die Arbeitsmappe gespeichert werden soll.
Die Arbeitsmappe wird vom Code gespeichert. Das eigentliche "speichern unter..." von Excel selbst wird nicht mehr ausgeführt.
Es wird dann in dem Ordner, wo die Arbeitsmappe gespeichert werden soll, geprüft, ob die Dokumentennummer bereits vorhanden ist.
Die Dokumentennummer wird aus dem angegebenen Namen extrahiert.

Ich hoffe, dass das annähernd so ist, wie du es haben wolltest und das du es schaffst dort die Variable aus deiner Zelle einzubringen.
Gerne versuch ich dir weiter zu helfen, falls du noch Probleme hast.

Liebe Grüße
Mathias


Anzeige
AW: letzte Zeichen im Dateinamen vergleichen
19.03.2023 09:41:01
Thomas
Guten Morgen Mathias,
das ist ja jetzt geradezu exakt!
Das lässt keine Wünsche offen, ausser das ich mir dann noch die Bezüge von meinen Daten einbauen muss. Das sollte aber gehen.

Das ist schon Wahnsinn, ich habe ja eigentlich schon länger ein Makro das ich selber zusammengebaut habe. Nur das Problem dabei und das habe ich eben erst gestern bemerkt, wenn ich heute eine Datei abspeichere, dann ist gut. Wenn ich dann heute gleich noch weitere Dateien abspeichere dann ist immer noch gut. Aber wenn ich Morgen eine Datei abspeichere kommt das Problem auf, dass wegen dem Datum in der Datei ja immer jeden Tag ändert, dadurch auch nie eine gleiche Datei erkannt werden kann. Darum kam ich dann auf die Idee man könnte einfach nur die Dokumentennummer prüfen. Das hat aber zu einigen Herausforderungen geführt, die noch immer nicht gelöst sind.

Ich werde vorübergehend das Datum im Dateiname herausschiessen weil dann funktioniert es optimal.
Dein Skript speichere ich mal ab und wenn ich dann Zeit habe baue ich mir das zurecht denn ich habe noch andere Arbeitsmappen die auch ein Prüfung durchlaufen müssen beim Abspeichern. Mal sehen ob ich da schaffe.

Ich sage besten Dank das war sehr Nett und Aufmerksam.
s grüsst
Thomas


Anzeige
AW: letzte Zeichen im Dateinamen vergleichen
19.03.2023 12:02:23
Mathias
Hallo Thomas,

das klingt als würde dein Makro auch schon wunderbar funktionieren.
Wenn dein einziges Problem ist die Dokumentennummer zu extrahieren dann schaue dir die Funktion "GetNamePart" an.
Diese extrahiert aus dem FullName die Dokumentennummer.
FullName ist der Pfad wo die Datei abgelegt ist + der Dateiname + die Extension.
Die Funktion würde genausogut funktionieren, wenn du nur den Namen mit Extension oder den Namen ohne Extension (wenn dieser keinen Punkt beinhalten) übergibst.
Ich habe dort zwei String Manipulationen ineinander verschachtelt.
erst wird die Extension inklusive des Punkts entfernt und dann wird alles andere als die letzten 11 Stellen (Die Dokumentennummer) entfernt.
Wenn du das bei deiner vorhanden Prüfung mit einbaust, dann wird das geänderte Datum kein Problem mehr darstellen.
Die String Manipulation können wir natürlich auch nach deinen Bedürfnissen anpassen.
Hier nochmal die String Manipulation einzeln (also nicht ineinander verschachtelt):
NameWithoutExtension = Left(strName, InStrRev(strName, ".") - 1) 'entfernt die Dateiextension inkl. dem Punkt (es ist egal, ob der Dateiname dabei inklusive oder exklusive des Pfades ist)
Dokumentennummer = Right(NameWithoutExtension, 11) 'entfernt alles außer die letzten 11 Zeichen (also es bleibt nur die Dokumentennummer) (hier ist es auch egal, ob der Dteiname dabei inklusive oder exklusive des Pfades ist)
Liebe Grüße
Mathias


Anzeige
AW: letzte Zeichen im Dateinamen vergleichen
18.03.2023 15:06:06
Beverly
Hi Thomas,

ist der Teil links der 11 Zeichen im Dateinamen auch bekannt?

Bis später
Karin



AW: letzte Zeichen im Dateinamen vergleichen
18.03.2023 16:36:35
Thomas
Hallo Karin,
also die 11 Zeichen die werden in einen Dateinamen geformt also diese 11 Zeichen sind nur ein teil eines dateinamens. und bevor es zur speicherung kommt sollten im verzeichenis wo die dateien abgelegt werden zuerst geprüft werden ob es schon eine abgelegte datei wo diese 11 zeichen entahlten mit gleicher kombination gibt.

Es grüsst
Thomas


AW: letzte Zeichen im Dateinamen vergleichen
18.03.2023 16:51:32
Beverly
Hi Thomas,

DAS ist mir schon klar, meine Frage jedoch war eine andere: wie sieht es mit dem Teil im Dateinamen LINKS von den 11 Zeichen aus, die variabel sind (aber bekannt weil sie in der Zelle stehen) - ist dieser Teil immer derselbe oder nicht?

Bis später
Karin



Anzeige
AW: letzte Zeichen im Dateinamen vergleichen
18.03.2023 17:02:42
Thomas
Ach Karin, tut mir leid, ich habe dich vorher wohl falsch verstanden.
Der Teil ist immer der selbe ja.

Der Aufbau des Dateinamens ist so: SiNa_18.03.2023_MiMo Anlage LZ_20230306000.xlsx

Und jetzt sieht man was geprüft werden soll. Das ist die 11 stellige Dokument Nummer. Wenn diese schon vorhanden sein sollte, dann darf die neue Datei nicht mit der selben Nummer gespeichert werden.

Danke für deine Bemühung

Es grüsst
Thomas


AW: letzte Zeichen im Dateinamen vergleichen
18.03.2023 17:14:54
Beverly
Hi Thomas,

ich nehme an, der Teil "SiNa_18.03.2023_MiMo Anlage LZ_" links von der 11 stelligen Zahl ist zumindest im Datum immer variabel?

    If Dir(ThisWorkbook.Path & "\*" & Range("A1") & ".xlsx") > "" Then
        MsgBox "Datei vorhanden"
    Else
        MsgBox "Datei nicht vorhanden"
    End If

Dabei wird alles, was im Dateinamen links der Zahl aus A1 steht, sozusagen variabel gesetzt. Als Speicherpfad wird der Pfad der Mappe mit dem Code angenommen.

Bis später
Karin



Anzeige
AW: letzte Zeichen im Dateinamen vergleichen
18.03.2023 18:20:37
Thomas
Hallo Karin,
ja jeder Textschnipsel ist variabel.
Dort wo du ThisWorkbook.path hast will ich eine Variable einsetzen weil ich der Pfad wo anders über die Variable abgreifen kann. Die Datei wird nicht in dem Ordner gespeichert wo die Vorlage abgelegt ist. Muss man hier noch etwas berücksichtigen wenn man eine variable einsetzen will, sowie auch die zelle wo die 11 stellige zahl verweist, will ich mit variable machen.

Besten Dank schon mal
Thomas


AW: letzte Zeichen im Dateinamen vergleichen
18.03.2023 19:31:26
Beverly
Hi Thomas,

ich sehe zwar nicht ganz den Sinn darin (besonders für den Zellbezug mit der Zahl), aber das geht ganz einfach: anstelle ThisWorkbook.Path setzt du deine String-Variable für den Pfad und anstelle Range("A1") setzt du deine Variable für die Zahl. Beide Variablen musst du vorher natürlich belegen.

Bis später
Karin


Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige