XL 2010 exif photo situées dans des sous-dossiers

Sheldor

XLDnaute Occasionnel
bonjour à tous,
désolé par avance si j'ai mal cherché... je souhaite récupérer des données exif d'image situées dans des sous-dossiers.
J'ai trouvé du code pour le faire dans un dossier mais pas dans des sous dossiers

j'ai des centaines de sous dossiers et je ne peux pas les faire un par un...

voilà où j'en suis en pj

grand merci par avance

nico
 

Pièces jointes

  • XLD_dir_photo.xlsm
    32.1 KB · Affichages: 29

Staple1600

XLDnaute Barbatruc
Re

C'est vrai qu'on ait pas rendu si il faut traiter 150 000 photos
(issu du lien déposé dans mon premier message dans ce fil)
VB:
Sub o()
Dim Img As ImageFile
    Dim P As Property
    Dim S As String
    'Création conteneur pour l'image à manipuler
    Set Img = CreateObject("WIA.imageFile")
    'Chargement de l'image dans le conteneur
    Img.LoadFile ("C:\Users\Staple\Pictures\test.png")
    'Boucle sur la collection de propriétés
    For Each P In Img.Properties
        S = P.Name & "(" & P.PropertyID & ") = "
        If P.IsVector Then
            S = S & " - vector data not emitted - "
            
            ElseIf P.Type = RationalImagePropertyType Then
            S = S & P.Value.Numerator & "/" & P.Value.Denominator
            
            ElseIf P.Type = StringImagePropertyType Then
            S = S & """" & P.Value & """"
            
            Else
            S = S & P.Value
        End If
        Debug.Print S
    Next
End Sub
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

La patte est dans le lien ;)(et elle date de 2006)

Et ci-dessous, c'est ma patte (gauche) ;)
VB:
Sub TestOk()
Dim Img As ImageFile
Dim P As Property, S As String, I&
'Création conteneur pour l'image à manipuler
Set Img = CreateObject("WIA.imageFile")
'Chargement de l'image dans le conteneur
Img.LoadFile ("C:\Users\STAPLE\Pictures\CIMG1600.JPG")
'Boucle sur la collection de propriétés
[A1] = "EXIF": I = 2
On Error Resume Next
For Each P In Img.Properties
Cells(I, 1) = "(" & I - 1 & ") " & P.Name & "(" & P.PropertyID & ") = " & P.Value
I = I + 1
Next
Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End Sub
 

Sheldor

XLDnaute Occasionnel
merci beaucoup, en faisant la manip en deux temps (d'abord lister les fichiers, puis aller chercher les propriétés) j'arrive à m'en sortir, je vais faire tourner cette nuit je pense, c'est un poil long

je pensais pouvoir sortir une propriété qui m'intéresse mais elle n'est pas toujours au même "endroit" par exemple si je sors la 23ème (I =23) je n'obtiens pas toujours la même propriété, ça doit changer en fonction des appareils photos et/ou des versions des références EXIF peut être

merci beaucoup pour votre aide
bonne journée
nicolas
 

Sheldor

XLDnaute Occasionnel
merci Patricktoulon,

désolé je ne comprends pas assez le code pour arriver à l'utiliser,

j'ai modifié le chemin :
'Racine = "c:\*.txt"
Racine = "G:\_boulot\_5100 +++IMAGES +++++++++\041301 photo ID\*.txt"

je ne comprends pas à quoi sert ".txt"

mais ça bloque ici, chemin d'accès introuvable:

x = FreeFile: Open bat For Output As #x: Print #x, Commande: Close #x 'creation du bath
 

patricktoulon

XLDnaute Barbatruc
avec les "++++" et tout i cointi!!!!!!!!!!!????
ben faut pas t'étonner alors ;) 🤣 🤣 🤣 🤣

il faut doubler le guillemets quand il y a des espaces ou des caractères particuliers dans le nom du dossier
tiens teste ça
VB:
'*********************************************************************
'       fonction Dir fichier par l'intermediaire d'un fichier BATH
'DIR fichier en ligne de commande(récursif)
'auteur: Patricktoulon et Dudu2 sur exceldownlods
'date:06/02/2021
'mise a jour
'date:07/02/2021:ajout de la correction des fichier dont le nom porte des caracteres spéciaux
'date :07/02/2021:intégration d'une boucle de transposition pour palier a la limite de transpose vba
'
'**********************************************************************
Option Explicit
Sub testDIRcmd()
    [A1].CurrentRegion.Clear
    Dim Racine$, tim#, T
    Racine = "G:\_boulot\_5100 +++IMAGES +++++++++\041301 PHOTO id\*.jpg"
      tim = Timer
    T = ListFichierBath(Racine)
    If IsArray(T) Then
        [A1].Resize(UBound(T), 1).Value = T
        MsgBox CDec(Timer - tim) & " seconde(s) pour " & UBound(T) & " fichier ou dossiers(s)"
    Else: MsgBox "Pas de fichier avec cette extension "
    End If
End Sub


Function ListFichierBath(Racine$, Optional Recycles As Boolean = False)
    Dim laChaine$, x&, Fichier$, bat$, Commande$, tim#, tbl, tblV, I&, arr1, arr2, a&, doss

    arr1 = Array("a`", "a^", "a¨", "e`", "e^", "e¨", "i`", "i^", "i¨", "o`", "o^", "o¨", "u`", "u^", "u¨")      'array caracteres séparés
    arr2 = Array("à", "â", "ä", "è", "ê", "ë", "ì", "î", "ï", "ò", "ô", "ö", "ù", "û", "ü")      'array caracteres regroupés

    bat = "C:\Users\polux\Desktop\baton.cmd"    'chemin du bath
    Fichier = Environ("userprofile") & "\Desktop\list.txt"    ' chemin du fichier liste

    Commande = "chcp 1252  > nul" & vbCrLf & "dir """ & Racine & """ /S /B /A:-D >" & Fichier    ' code la commande

    x = FreeFile: Open bat For Output As #x: Print #x, Commande: Close #x    'creation du bath

    ShellAndwaitingEndProcess bat    'appel fonction shell améliorée pour exécuter le bath

    'lecture du fichier
    x = FreeFile: Open Fichier For Binary Access Read As #x: laChaine = String(LOF(x), " "): Get #x, , laChaine: Close #x

    'on fait le replace dans la chaine globale si defaut de caracteres present(plus rapide que le replace dans les ligne du tableau)
    For a = 0 To UBound(arr1)
        If InStr(1, laChaine, arr1(a)) Then laChaine = Replace(Replace(laChaine, arr1(a), arr2(a)), UCase(arr1(I)), UCase(arr2(I)))
    Next

    tbl = Split(laChaine, vbCrLf)    'coupe(array 1 dim)
    If Not Recycles Then
    For I = 0 To UBound(tbl)
       If tbl(I) Like "*$RECYCLE*" Then laChaine = Replace(laChaine, tbl(I) & vbCrLf, "")
    Next
    tbl = Split(laChaine, vbCrLf)    'coupe(array 1 dim)
    End If
    'convert array 1 dim to 2 dim(transpose)
    If laChaine <> vbNullString Then
        ReDim tblV(UBound(tbl), 1 To 1): For I = 0 To UBound(tbl): tblV(I, 1) = tbl(I): Next
        ListFichierBath = tblV
    End If
    Kill bat
    Kill Fichier
End Function


Function ShellAndwaitingEndProcess(ByVal CheminComplet As String) As Long
    Dim ProcessHandle&, ProcessId&
    ProcessId = Shell(CheminComplet, vbHide)
    ProcessHandle = ExecuteExcel4Macro("CALL(""Kernel32"",""OpenProcess"",""JJJJ"",""" & 2031616 & """,""" & 0 & """,""" & ProcessId & """)")
    ShellAndwaitingEndProcess = ExecuteExcel4Macro("CALL(""Kernel32"",""WaitForSingleObject"",""JJJJJ"",""" & ProcessHandle & """,""" & &HF0000 & """)")
End Function

n'oublie pas de changer l'adresse du bat
je dis ca au cas ou tu n'aurais pas compris
bat = Environ("userprofile") & "\Desktop\baton.cmd" 'chemin du bath
Fichier = Environ("userprofile") & "\Desktop\list.txt" ' chemin du fichier liste


;)
 
Dernière édition:

Sheldor

XLDnaute Occasionnel
merci

oui c'est peut être un peux trop exotique comme chemin...

est ce que "doubler les guillemets" correspond aux """ ici :
Commande = "chcp 1252 > nul" & vbCrLf & "dir """ & Racine & """ /S /B /A:-D >" & Fichier
?


j'obtiens le message "pas de fichier avec cette extension" j'ai essayé avec jpg en minuscule et majuscule sans succès, voir pj

il semble que "T" soit vide
 

Pièces jointes

  • Sans titre-1.jpg
    Sans titre-1.jpg
    258.3 KB · Affichages: 17

patricktoulon

XLDnaute Barbatruc
re
écoute, je viens de tester car j'ai un disque G et ça fonctionne très bien
change bien le lien du bat comme je l'ai dis
demo7.gif
 

Sheldor

XLDnaute Occasionnel
j'avais bien changé le chemin du bat

faut il créé un fichier baton.cmd avant ? et un fichier list.txt ?
est ce qu'il y a une histoire de référence de librairie à cocher ou est ce qu'excel 2010 n'est pas équipé pour...

désolé de mon ignorance, je comprendrais si on s'arrête là... ;)
 

Discussions similaires

Réponses
9
Affichages
506

Statistiques des forums

Discussions
315 109
Messages
2 116 324
Membres
112 717
dernier inscrit
doguet