• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

Problemen met objFolder.GetDetailsOf(strFileName, 12)

  • Onderwerp starter Onderwerp starter keb
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

keb

Gebruiker
Lid geworden
20 feb 2011
Berichten
155
Hallo allemaal,

Toelichting:
Ik heb een Excel subroutine gemaakt die gegevens van opgeslagen foto's in een Excelblad plaatst (directory, bestandsnaam, "date taken" evt. "date modified"). Zelf vul ik het Excel-blad aan met plaats van opname, beschrijving, trefwoorden etc.

Subroutine:
Ik gebruik de instructie objFolder.GetDetailsOf(strFileName, 12) om "date take" op te halen.

Heel bijzonder dat de output ogenschijnlijk een TEKST lijkt op te leveren, ik had een datum-format verwacht.
- In Excel omzetten met Datevalue werkt niet.
- Cdate(objFolder.GetDetailsOf(strFileName, 12)) in de subroutine leidt tot een conflict.

Vraag:
Hoe verkrijg ik de datum van een foto (in datumformaat)?


Code:
Sub Scan()
'
' Scan Macro
'Zet Exif-informatie van fotobestanden in een lijst
'Bron: Helpmij.nl forum, 20191016

Dim strDirectorynaam(200) As Variant

Dim hulp, jaar, maand, dag
Dim newsheet
Dim startPath
Dim fs As Object  'fs = filesytem

'Specific declaration of pickung up EXIF-info
Dim fPath As Variant
Dim objShell As Object
Dim objFolder As Object
Dim strFileName As Object

'This creates an instance of the MS Scripting Runtime FileSystemObject class
Set fs = CreateObject("Scripting.FileSystemObject")
    
'On Error GoTo Errorhandler

'1. Maak nieuwe lege Aanvullende Fotolijst
Set newsheet = ThisWorkbook.Sheets.Add(After:=Sheets(Worksheets.Count))
MsgBox Str(Worksheets.Count)
newsheet.Name = "Aanvulling" + Str(Worksheets.Count)   'Probeer hiermee onafhankelijk van taal te worden (Blad2 of sheet2)"
'Vul de titelrij
Cells(1, 1) = "Volume"
Cells(1, 2) = "Directory"
Cells(1, 3) = "Bestandsnaam"
Cells(1, 4) = "Datum"
Cells(1, 5) = "Categorie"
Cells(1, 6) = "Land"
Cells(1, 7) = "Plaats"
Cells(1, 8) = "Beschrijving"
Cells(1, 9) = "Wijzigingsdatum"

'Zet de header vast
Range("B2").Select
ActiveWindow.FreezePanes = True
Selection.AutoFilter
'===============================================================================================

'2. Vraag eerst alle directorys op en plaats de gegevens in een matrix
rij = 0
'Op het tabblad  "Scan driectory" zet je in cell "B5" de naam van de map waarin subdirectories met foto's staan
startPath = Sheets("Scan directory").Range("B5")   ' Set the path.

'MsgBox startPath, vbYesNo

mydir = Dir(startPath, vbDirectory)   ' Retrieve the first entry.
Do While mydir <> ""   ' Start the loop.
    ' Ignore the current directory and the encompassing directory.
    If mydir <> "." And mydir <> ".." Then
        ' Use bitwise comparison to make sure MyName is a directory.
        If (GetAttr(startPath & mydir) And vbDirectory) = vbDirectory Then
        rij = rij + 1
        strDirectorynaam(rij) = mydir
        'MsgBox mydir               'Werkt goed
        End If
        End If
    mydir = Dir    ' Get next entry.
    Loop
'===============================================================================================

'3. Paats de EXIF-info in een werkblad

Set objShell = CreateObject("Shell.Application")
'Set objFolder = objShell.Namespace(startPath & trDirecotry)

n = 1
row = 2
'Doorloop alle alle directories
Do While strDirectorynaam(n) <> ""
    fPath = CVar(startPath & strDirectorynaam(n))
    'MsgBox fPath
    
    Set objFolder = objShell.Namespace(fPath)
    'Set objFolder = objShell.Namespace("D:\Nieuw\_Inbewerking\2019_AnnaPaulowna")
    'MsgBox objFolder
           
    'Loop through all Items (files) in folders
    For Each strFileName In objFolder.Items
        'MsgBox strFileName   'Gaat goed
        For i = 0 To 39
        Debug.Print objFolder.GetDetailsOf(strFileName, i) & "<br />" & vbCrLf
        
        Next
        'Look only for image files
        If InStr(objFolder.GetDetailsOf(strFileName, 2), "image") Then
            Cells(row, 2) = strDirectorynaam(n)                       'Directorynaam
            Cells(row, 3) = objFolder.GetDetailsOf(strFileName, 0)    'Bestandsnaam
            '"Date taken" blijkt niet altijd beschikbaar,
            If CStr(objFolder.GetDetailsOf(strFileName, 12)) <> "" Then
                Cells(row, 4) = (objFolder.GetDetailsOf(strFileName, 12))     'Date taken
                Else
                'MsgBox row & "lege date taken"
                Cells(row, 4) = CDate(objFolder.GetDetailsOf(strFileName, 3))    'Date modified
                End If
                
'            Cells(1, 10) = "Date Modified"
'            Cells(1, 11) = "Date Created"
'            Cells(1, 12) = "Date Taken"
'            Cells(row, 10) = CDate(objFolder.GetDetailsOf(strFileName, 3))    'Date modified
'            Cells(row, 11) = CDate(objFolder.GetDetailsOf(strFileName, 4))    'Date created
'            Cells(row, 12) = objFolder.GetDetailsOf(strFileName, 12)    'Date taken

            row = row + 1
            End If
        
        Next   'Next file
        
        n = n + 1   'Ga naar de volgende directory
        Loop        'Next directory

'Maak de lijst netjes op
Range("A1:J1").Font.Bold = True
Range("A1:J1").HorizontalAlignment = xlRight
Columns("D:D").NumberFormat = "dd-mm-yyyy hh:mm"
'Sluit het bestand af
Columns("A:J").EntireColumn.AutoFit

End Sub
 

Beste snb, uw antwoord was erg snel, maar uw code is in essentie gelijk aan mijn methode. U gebuikt code 25, ik gebruik code 12!

Ik ben op zoek naar een methode die de opnamedatum van een foto presenteert in DATUMFORMAAT (uw oplossing lijkt net als bij mij een tekststring met de datum en tijd ( "‎20-‎9-‎2022 ‏‎16:30") te genereren.
 
Zo'n string kan je eenvoudig naar datum en tijd formaat converteren met CDate.
 
Die heb ik dan over het hoofd gezien?
Wat is het conflict waar je het over hebt?
 
Die heb ik dan over het hoofd gezien?
Wat is het conflict waar je het over hebt?

Bij "CDate(objFolder.getdetailsof(strFileName, 12))" krijg ik "Foutmelding 13, Typen komen niet met elkaar overeen". (Date taken"

"CDate(objFolder.getdetailsof(strFileName, 3)) " wordt WEL geaccepteerd. (Date modified)
 
Die heb ik dan over het hoofd gezien?
Wat is het conflict waar je het over hebt?

Bij "CDate(objFolder.getdetailsof(strFileName, 12))" krijg ik "Foutmelding 13, Typen komen niet met elkaar overeen". (Date taken"

"CDate(objFolder.getdetailsof(strFileName, 3)) " wordt WEL geaccepteerd. (Date modified)
 
Bestand met macro bijgevoegd

Voor degene die zich wil verdiepen in het ophalen van "Date taken".
Ik wil in kolom D de datum in het datum-formaat hebben.

Gebruiksaanwijzing:
1) Wijzig cel B5: zet hierin de overkoepelende map met foto's
2) Klik op de knop

Er wordt een nieuwe map "Aanvulling xx" aangemaakt met Directory, Bestandsnaam en Datum.
De rest van het blad vul ik handmatig in.

Het probleem zit in kolom D.
 

Bijlagen

Kennelijk is dat dat geen correcte string om naar een datum/tijd te converteren.
Heb je al eens gekeken wat dit toont?
Code:
MsgBox objFolder.getdetailsof(strFileName, 12)
 
Kennelijk is dat dat geen correcte string om naar een datum/tijd te converteren.
Heb je al eens gekeken wat dit toont?
Code:
MsgBox objFolder.getdetailsof(strFileName, 12)

In mijn bericht staat dat ik wel "iets van een tekst" als outputkrijg, maar zich in Excel niet laat bewerken.
 
De parameter is pere windowsversie verschillen.
Hier levert cdate het gewenste resultaat

Code:
Sub M_snb()
    With CreateObject("shell.application").Namespace("G:\OF\")
       y = Year(CDate(.getdetailsof(.Items.Item("appel.jpg"), 3)))
    End With
End Sub
 
Uitkomsten GetDetailsOf niet te vertrouwen

Ik heb de gegevens van GetDetailsOf stuk voor stuk opgevraagd.

De opnamedatum van de foto is 12 augustus 2015 om 8:29 uur; ik weet zeker dat de opname niet bewerkt is. Mogelijk een keer verplaatst.

Het blijkt dat de gegevens van GetDetailsOF niet te vertrouwen zijn:
- Date modified zou gelijk moeten zijn aan de opnamedatum, maar maand en dag zijn verwisseld (regel 3)
- Idem bij Date Created (regel 4)
- De resultaten van objFolder.getdetailsof(strFileName, 3) en objFolder.getdetailsof(strFileName, 5) zijn in VBA te bewerken met CDate
- Het resultaat van objFolder.getdetailsof(strFileName, 12) lijkt niet te bewerken (regel 12)

Als ik de properties van de foto in Windows10 opvraag, is het opmerkelijk Date created en Date modified gewisseld zijn.


Kortom: ik stop er mee.Output.JPG
 
Amerikanen begrijpen niets van standaardisatie, zoal ISO,

Code:
Sub M_snb()
  With CreateObject("shell.application").Namespace("G:\OF\")
    c00=CDate(.getdetailsof(.Items.Item("appel.jpg"), 3))
    y = dateserial(Year(c00),day(c00),month(c00))
  End With
End Sub
 
Alle refelectanten bedankt voor jullie suggesties, maar het probleem met strTemp = objFolder.getdetailsof(strFileName, 12) zat veel dieper!
Ik vermoed dat het een ontwerpfout in de functie is.

strTemp = objFolder.getdetailsof(strFileName, 12) levert ogenschijnlijk "12-8-2015 8:28" op, maar
MsgBox strTemp 'Result ?12-?8-?2015 ??8:28
Er worden dus vraagtekens in de string ingelast.

Vraagtekens vervang ik door een spatie, en dan werkt CDate wel.

Code:
Sub Convert_to_datum()

Dim strTemp

strTemp = Cells(2, 4).Value
MsgBox strTemp          'Result ?12-?8-?2015 ??8:28

For i = 1 To Len(strTemp)
            Select Case Asc(Mid(strTemp, i, 1))
                Case 32, 48 To 58, 45   '32 space, 45 -, 48-57 figures, 58 :
                    ' Leave ordinary characters alone
                Case Else
                    Mid(strTemp, i, 1) = " "
            End Select
        Next i
MsgBox strTemp

Cells(2, 8) = CDate(strTemp)

End Sub
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan