IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Utilisation de exiftool dans VBA


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2021
    Messages : 10
    Par défaut Utilisation de exiftool dans VBA
    Bonjour,

    J'ai écrit une procédure sous Excel VBA afin de modifier le commentaire d'un fichier mp4. Pour cela, j'utilise l'utilitaire exiftool que j'appelle avec la commande Shell

    Sub Aff_Contenu()
    Dim exif_write As String
    Cells(Ligne, Cont).Value = Contenu.Value
    exif_write = "C:\Users\phili\Downloads\exiftool.exe C:\Users\phili\Videos\essai.mp4 -Comment^=" & Contenu.Value
    Shell (exif_write)
    End Sub

    Cette procédure fonctionne. Cependant, lorsque la valeur de Contenu.Value contient des espaces, seul le premier mot est pris en compte dans le commentaire du fichier mp4.
    exemple :
    Contenu.Value="visite de Paris" => seul, le mot visite apparait dans le commentaire
    Merci à toute personne pouvant m'indiquer d'où vient mon erreur
    Bonne soirée
    Cordialement
    Philbec44

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Salut, lorsque la valeur de Contenu.Value contient des espaces, le nom du fichier de commande que vous envoyez à l'utilitaire exiftool.exe est mal interprété. La commande shell considère les espaces comme des séparateurs d'arguments et divise donc la chaîne en plusieurs arguments. Pour éviter cela, vous devez entourer le nom du fichier et la valeur du commentaire entre guillemets.
    Modifiez votre ligne de code exif_write comme suit :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exif_write = """C:\Users\phili\Downloads\exiftool.exe"" ""C:\Users\phili\Videos\essai.mp4"" -Comment^=""" & Contenu.Value & """"

  3. #3
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2021
    Messages : 10
    Par défaut
    Citation Envoyé par Franc Voir le message
    Salut, lorsque la valeur de Contenu.Value contient des espaces, le nom du fichier de commande que vous envoyez à l'utilitaire exiftool.exe est mal interprété. La commande shell considère les espaces comme des séparateurs d'arguments et divise donc la chaîne en plusieurs arguments. Pour éviter cela, vous devez entourer le nom du fichier et la valeur du commentaire entre guillemets.
    Modifiez votre ligne de code exif_write comme suit :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exif_write = """C:\Users\phili\Downloads\exiftool.exe"" ""C:\Users\phili\Videos\essai.mp4"" -Comment^=""" & Contenu.Value & """"
    Bonjour Franc,
    Merci beaucoup pour votre aide. C'était effectivement la solution.
    Bonne journée
    Cordialement
    Philbec44

  4. #4
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2021
    Messages : 10
    Par défaut
    Bonsoir,
    Je vais encore demander de l'aide sur la gestion des "space" avec la fonction Shell
    J'ai déclaré le fichier vidéo mp4 dans un string
    Fichier_traité= "C:\Users\phili\Videos\essai.mp4" mais je n'arrive pas à passer ce string dans le string exif_write avec les bons " afin que la fonction Shell ne sorte pas une erreur et traite correctement le string Fichier_traité
    Merci d'avance pour votre aide
    Bonne soirée
    Cordialement
    Philbec44

  5. #5
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 237
    Par défaut
    Hello,
    j'ai créé une fonction qui ajoute des guillemets à des chaines :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function Dq(Chaine) As String
    Dq = """" & Chaine & """"
    End Function
    D'autre part Shell ne renvoie pas ce qui se passe pendant l'exécution de la commande. Avec l'objet COM WScript.Shell on peut récupérer ce qui se passe dans le canal standard et le canal d'erreur pendant l'exécution de la commande. Exemple de fonction qui réalise cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Public Function ShellRun(sCmd) As String
        Dim oShell As Object, oExec As Object, oOutput As Object, oError As Object
        Dim s As String, err As String, sLine As String
        Set oShell = CreateObject("WScript.Shell")
        Set oExec = oShell.Exec(sCmd)
        Set oOutput = oExec.StdOut
        Set oError = oExec.StdErr
        While Not oOutput.AtEndOfStream
            sLine = oOutput.ReadLine
            If sLine <> "" Then s = s & sLine & vbCrLf
        Wend
        While Not oError.AtEndOfStream
            sLine = oError.ReadLine
            If sLine <> "" Then err = err & sLine & vbCrLf
        Wend
        ShellRun = s + vbCrLf + " ---- " + vbCrLf + err
    End Function
    Il y a aussi un risque avec l'encodage des chaînes avec accents à mettre dans les commentaires (ansi ou utf8). Utiliser uni2utf pour convertir ansi en utf8.
    Exemple d'utilisation de toutes les fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Modif_MetaMp4()
    Dim fichier As String, contenu As String
    Dim exiftool_exe As String, exiftool_cmd As String
    Dim wsh As Object, res As String
    Set wsh = VBA.CreateObject("WScript.Shell")
    exiftool_exe = "d:\Logiciels\exiftool\exiftool.exe"
    fichier = "d:\temp\Vidéos\jurassic park.mp4"
    contenu = "Voix ambiguë d’un cœur qui, au zéphyr, préfère les jattes de kiwis."
    exif_write = Dq(exiftool_exe) & " " & Dq(fichier) & " -Comment^=" & Dq(Uni2Utf(contenu))
    res = ShellRun(exif_write)
    Debug.Print res
    End Sub
    Ami calmant, J.P

  6. #6
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2021
    Messages : 10
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    Hello,
    j'ai créé une fonction qui ajoute des guillemets à des chaines :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function Dq(Chaine) As String
    Dq = """" & Chaine & """"
    End Function
    D'autre part Shell ne renvoie pas ce qui se passe pendant l'exécution de la commande. Avec l'objet COM WScript.Shell on peut récupérer ce qui se passe dans le canal standard et le canal d'erreur pendant l'exécution de la commande. Exemple de fonction qui réalise cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Public Function ShellRun(sCmd) As String
        Dim oShell As Object, oExec As Object, oOutput As Object, oError As Object
        Dim s As String, err As String, sLine As String
        Set oShell = CreateObject("WScript.Shell")
        Set oExec = oShell.Exec(sCmd)
        Set oOutput = oExec.StdOut
        Set oError = oExec.StdErr
        While Not oOutput.AtEndOfStream
            sLine = oOutput.ReadLine
            If sLine <> "" Then s = s & sLine & vbCrLf
        Wend
        While Not oError.AtEndOfStream
            sLine = oError.ReadLine
            If sLine <> "" Then err = err & sLine & vbCrLf
        Wend
        ShellRun = s + vbCrLf + " ---- " + vbCrLf + err
    End Function
    Il y a aussi un risque avec l'encodage des chaînes avec accents à mettre dans les commentaires (ansi ou utf8). Utiliser uni2utf pour convertir ansi en utf8.
    Exemple d'utilisation de toutes les fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Modif_MetaMp4()
    Dim fichier As String, contenu As String
    Dim exiftool_exe As String, exiftool_cmd As String
    Dim wsh As Object, res As String
    Set wsh = VBA.CreateObject("WScript.Shell")
    exiftool_exe = "d:\Logiciels\exiftool\exiftool.exe"
    fichier = "d:\temp\Vidéos\jurassic park.mp4"
    contenu = "Voix ambiguë d’un cœur qui, au zéphyr, préfère les jattes de kiwis."
    exif_write = Dq(exiftool_exe) & " " & Dq(fichier) & " -Comment^=" & Dq(Uni2Utf(contenu))
    res = ShellRun(exif_write)
    Debug.Print res
    End Sub
    Ami calmant, J.P
    Bonjour,
    Merci beaucoup pour votre aide et les explications. Je vais implémenter ceci dans la journée et vous tiendrai au courant.
    Bonne journée
    Cordialement
    Philbec44

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/04/2017, 13h13
  2. [XL-2007] Utiliser un solveur dans vba
    Par pmp87 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 21/05/2013, 15h16
  3. [XL-2003] Utiliser fonction excel dans VBA
    Par bebel9313 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/07/2009, 05h55
  4. [E-02] : utilisation de matrice dans Vba
    Par Oupss dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 01/04/2009, 11h16
  5. Réponses: 5
    Dernier message: 27/05/2008, 18h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo