Abgleich der Einträge im Dictionary

  • Excel

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Sam85.

    Abgleich der Einträge im Dictionary

    Hallöchen,

    ich habe eine Frage. Wenn ich vergleichen will, ob die Einträge im Dictionary alle gleich sind. Wie kann ich das bewerkstelligen? (Es werden Dateien geprüft und dann deren Datum eingetragen. Und ich will nur wissen ob diese immer die gleichen sind und wenn nicht eine MsgBox erhalten). Leider bin ich gerade am Straucheln, wie ich es umsetze. Freue mich über Feedback.

    Visual Basic-Quellcode

    1. Public Function GetDictFiles() As Scripting.Dictionary
    2. Dim dict As New Scripting.Dictionary
    3. Dim fso, fo, fi, f As Object
    4. Dim i As Integer
    5. Dim di As String
    6. di = "c:/temp"
    7. i = 0
    8. Set fso = CreateObject("Scripting.FileSystemObject")
    9. Set fo = fso.GetFolder(di)
    10. Set fi = fo.Files
    11. For Each f In fi
    12. dict.Add i, Split(FileDateTime(di & "/" & f.name), " ")(0)
    13. i = i + 1
    14. Next f
    15. Set GetDictFiles = dict
    16. End Function

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Sam85“ ()

    So wie du das Dictionary verwendest (fortlaufender Key), könntest du auch eine Collection nehmen.
    Nutze den Key des Dictionary für den Dateinamen und Value für das Datum.
    Dann bekommst du bei Doppeleinträgen einen Fehler.

    Aber was du tatsächlich willst, solltest du vielleicht mal genauer erklären.
    Wie sehen deine Dateinamen aus?
    Was ist ​FileDateTime und woher bezieht es seinen Wert?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @petaod

    danke für die Rückmeldung. Im Grunde habe ich 4 Dateien in einem Verzeichnis und diese 4 sollten immer das gleiche Datum haben und wenn eine ein anderes hat, kann die Sub nicht ausgeführt werden.
    Die Sub wird über einen Button auf dem Sheet aufgerufen. Ich empfinde was ich da benutze nicht als optimal und dachte es gibt sicher eine bessere Herangehensweise. Freue mich über ein Feedback.


    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Public Sub Synchronisation()
    2. If CheckFileDate = False Then
    3. MsgBox "Bitte alle 4 Dateien für denselben Tag auslesen!", vbInformation
    4. Exit Sub
    5. Else
    6. MsgBox "Alle Dateien sind vom selben Tag. Es wird synchronisiert.", vbInformation
    7. Call RefreshSource
    8. Call RefreshPivot
    9. Call RefreshFormat
    10. Call RefreshFaq
    11. End If
    12. End Sub



    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Public Function GetDictFiles() As Scripting.Dictionary
    2. Dim dict As New Scripting.Dictionary
    3. Dim fso, fo, fi, f As Object
    4. Dim i As Integer
    5. Dim di As String
    6. di = "\\rosenkranz1\ablage\sani_auswertungen\cs"
    7. i = 0
    8. Set fso = CreateObject("Scripting.FileSystemObject")
    9. Set fo = fso.GetFolder(di)
    10. Set fi = fo.Files
    11. For Each f In fi
    12. dict.Add i, Split(FileDateTime(di & "/" & f.name), " ")(0)
    13. i = i + 1
    14. Next f
    15. Set GetDictFiles = dict
    16. End Function
    17. Public Function CheckFileDate() As Boolean
    18. Dim i As Integer
    19. Dim item As Variant
    20. Dim x As String
    21. i = 1
    22. For Each item In GetDictFiles.Items
    23. If x Like item Then i = i + 1
    24. x = item
    25. Next item
    26. If GetDictFiles.Count = i Then CheckFileDate = True
    27. End Function



    Sam85 schrieb:

    diese 4 sollten immer das gleiche Datum haben
    Welches Datum?
    CreationDate?
    Oder haben die Dateinamen einen Datumstempel?

    Edit:
    Das ganze Geraffel mit dem Dictionary brauchst du doch gar nicht.

    Visual Basic-Quellcode

    1. Function CheckFiledate(ByVal FolderName As String, Optional ByVal Filter As String = "*") As Boolean
    2. Dim FSO As New Scripting.FileSystemObject
    3. Dim Folder As Scripting.Folder, File As Scripting.File, Datum As Date, NumFiles as Integer
    4. Set Folder = FSO.GetFolder(FolderName)
    5. For Each File In Folder.Files
    6. If File.Name Like Filter Then
    7. If Datum = 0 Then Datum = Int(File.DateCreated) 'first file - init
    8. If Datum = Int(File.DateCreated) Then NumFiles = NumFiles + 1 Else Exit Function 'not same date - return False
    9. End If
    10. Next
    11. CheckFiledate = NumFiles > 0
    12. End Function

    Call:

    Visual Basic-Quellcode

    1. ​Sub Synchronisation()
    2. If CheckFileDate("\\rosenkranz1\ablage\sani_auswertungen\cs","*.csv") Then
    3. RefreshSource
    4. RefreshPivot
    5. RefreshFormat
    6. RefreshFaq
    7. Else
    8. MsgBox "Bitte alle 4 Dateien für denselben Tag auslesen!", vbInformation
    9. End If

    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „petaod“ ()

    @petaod

    Create oder LastModified Date sollte das FileDateTime ausgeben, wobei mir die Zeit egal ist. Kann das also File.DateCreated?
    Das Dictionary kann ich mir dann sparen, danke. Hatte das nur drin weil mir der geeignete Ansatz gefehlt hat. Probiere ich morgen gleich aus.