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 :

Modifier un fichier texte et édition tags mp3 id3 v2


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 4
    Par défaut Modifier un fichier texte et édition tags mp3 id3 v2
    Bonjour à tous,
    Le peu d'expérience que j'ai en vba ne me permet pas de résoudre ce problème...

    J'ai fait un fichier excel, qui me fait l'inventaire d'un dossier (pas trop dur).

    Mais l'objectif final est de faire l'inventaire ET le ménage dans mon dossier de musique : aujourd'hui, mon fichier fait donc bien l'inventaire (application.filesearch), et si je le souhaite ouvre les fichiers mp3 (open for binary access) pour y dénicher les tags mp3 (artiste, titre etc...)

    Ensuite, la structure des tags id3 v1 étant fixe (128 caractères à la fin, je sais les modifier sans problème (put #FF, longueur - 128, nouveau_tag).

    Mon problème est dans le cas des tags id3 v2, qui ont une structure variable et en début de fichier.

    En clair, ce que je veux faire mais n'arrive pas c'est :

    -ouvrir le fichier en texte (ça c ok)
    -repérer une chaine dans ce fichier (ça je devrais y arriver)

    -remplacer cette chaine par une autre, de longueur différente (la je bloque, car je sais écrire à un endroit précis du fichier, mai si la longueur est différente, soit il restera des caractères, soit je vais "manger" les caractères suivants. Il me faut donc remplacer l'ancienne chaine par l'autre, en gardant tout ce qu'il y autour... et hors de question d'enregistrer le contenu du fichier dans une variable, replace puis réecrire, dans ce cas mon pc plante systématiquement...

    Merci d'avance, si quelqu'un peut m'aider ça serait vraiment sympa !!!

  2. #2
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    Waw,

    totalement suicidaire à mon sens ce genre de manipulation qui consiste à modifier en dur et sans garde-fou un fichier qui à une structure bien définie que le code ignore sauvagement.
    De là à faire se retourner Mozart dans sa tombe, il n'y a qu'un pas.

    N'existe-t-il pas une "foultitude" d'outils freeware pour modifier les tag ID3 v2 de fichiers MP3 ?

  3. #3
    Futur Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 4
    Par défaut
    Bien sur que ce genre d'outils existe, mais j'ai choisi de faire le mien pour plusieurs raisons :
    - tout d'abord, cela m'évite d'avoir à installer un logiciel de plus sur ma machine
    - mon fichier est fonctionnel presque partout instantanément (pas d'installation, excel dispos presque partout)
    - modifier les tags par excel est très pratique, édition de cellule à la chaine ou non, copier-coller etc...
    - et un peu pour le challenge aussi j'avoue...

    question suicide... d'abord hors de question de me lancer dans une modif de masse de toute ma base de fichiers sans avoir tout vérifié... et puis si ça marche pas ben tant pis !!! pour l'instant la modif brute des id3 v1 se passe sans problèmes, je pensais que la v2 passerai oci sans pb... un peu otpimiste j'avoue !!

  4. #4
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    Bien sur que ce genre d'outils existe, mais j'ai choisi de faire le mien pour plusieurs raisons :
    - tout d'abord, cela m'évite d'avoir à installer un logiciel de plus sur ma machine
    - mon fichier est fonctionnel presque partout instantanément (pas d'installation, excel dispos presque partout)
    - modifier les tags par excel est très pratique, édition de cellule à la chaine ou non, copier-coller etc...
    - et un peu pour le challenge aussi j'avoue...
    Argumentation tout à ton honneur.
    C'est vrai que le côté challenge est tentant...
    J'étais comme cela, avant, mais plus trop le temps.

    Pour pallier ceci
    -remplacer cette chaine par une autre, de longueur différente (la je bloque, car je sais écrire à un endroit précis du fichier, mai si la longueur est différente, soit il restera des caractères, soit je vais "manger" les caractères suivants. Il me faut donc remplacer l'ancienne chaine par l'autre, en gardant tout ce qu'il y autour... et hors de question d'enregistrer le contenu du fichier dans une variable, replace puis réecrire, dans ce cas mon pc plante systématiquement...
    il y a ce genre de solution. qui lit une fichier texte en input, remplace ce qu'il y a lieu à l'intérieur par autrechose (de longueur différente), écrit le résultat dans un nouveau fichier et remplace l'ancien par le nouveau.
    Gare à la casse.... et n'oublie pas le backup avant (en 15 exemplaires).

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    Sub Patch_SQL()
    Dim Where_clause    As String
    Dim Field_clause    As String
    Dim LaLigne         As String, tablo As Variant
    Dim Where_pos       As Long
    Dim End_Where       As Long
    Dim beg_ligne       As String
    Dim End_ligne       As String
    Dim Input_file      As String
    Dim Output_File     As String
    Dim Path_dqy        As String
    Dim i               As Integer
    Dim Stat_select     As Boolean
     
    For i = 1 To 3
        Select Case i
          Case 1
            Path_dqy = ThisWorkbook.Path & "\Current Month"
            Input_file = Path_dqy & "\Selective Sorties Mois 0.dqy"
            Output_File = Path_dqy & "\temp_Cur.txt"
            Field_clause = "LST_SORM1C"
            Stat_select = Build_Where_Clause(Field_clause, Where_clause)
            If Not Stat_select Then
                MsgBox "No Selection active. Update impossible", vbCritical
                Exit Sub
            End If
          Case 2
            Path_dqy = ThisWorkbook.Path & "\Previous Month"
            Input_file = Path_dqy & "\Selective Sorties Mois -1.dqy"
            Output_File = Path_dqy & "\temp_prev.txt"
            Field_clause = "LST_SORM1P"
            Stat_select = Build_Where_Clause(Field_clause, Where_clause)
          Case 3
            Path_dqy = ThisWorkbook.Path & "\YTD"
            Input_file = Path_dqy & "\Selective Sorties YTD.dqy"
            Output_File = Path_dqy & "\temp_ytd.txt"
            Field_clause = "LST_SORM1Y"
            Stat_select = Build_Where_Clause(Field_clause, Where_clause)
        End Select
        Open Input_file For Input As #1
        Open Output_File For Output As #2
        Do While Not EOF(1)
            Line Input #1, LaLigne
            Where_pos = InStr(1, LaLigne, "WHERE", vbTextCompare)
            If Where_pos > 0 Then
               End_Where = InStr(Where_pos, LaLigne, "ORDER", vbTextCompare) - 2
               If End_Where > 0 Then
                  beg_ligne = Left(LaLigne, Where_pos - 1)
                  End_ligne = Right(LaLigne, Len(LaLigne) - End_Where)
                  LaLigne = beg_ligne & Where_clause & End_ligne
               End If
            End If
            Debug.Print LaLigne
            Print #2, LaLigne
        Loop
        Close #1
        Close #2
        Kill Input_file
        Name Output_File As Input_file
    Next i
     
    MsgBox "ok"
    End Sub
    bonne chance et pitié pour les musiciens.

  5. #5
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Par défaut
    bonsoir


    J'espère que cet exemple pourra t'aider :
    Extraire les tags mp3 id3v2 (adaptation d'un code VB6 en VBA)


    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    Option Explicit
     
    'Source VB6
    'http://www.freevbcode.com/ShowCode.asp?ID=2646
    '
    'adapté en VBA-Excel le 16.05.2007
    '
     
    Public i As Integer
    Public strEmptyString As String
    Public B As Byte
    Public s As String
     
    Public Version As Byte
     
     
    Sub Test()
        Dim NomFichier As String
        Dim TailleFichier As Long
        Dim NumFich As Integer
        Dim PositionEntete As Long
        Dim Tag2 As String
        Dim R As Double
     
        NomFichier = "C:\dossier\maMusique.mp3"
     
     
        NumFich = FreeFile
     
        Open NomFichier For Binary As #NumFich
        TailleFichier = LOF(NumFich)
     
            Get #NumFich, 1, B
     
            'If B <> 255 Then '(255: début ID3v2)
                'If B <> 73 Then Exit Sub
            'End If
     
            PositionEntete = 1
            Get #NumFich, 2, B
            If (B < 250 Or B > 251) Then
                'We have an ID3v2 tag
                If B = 68 Then
                    Get #NumFich, 3, B
                    If B = 51 Then
                        Get #NumFich, 4, Version
                        Get #NumFich, 7, B
                        R = B * 20917152
                        Get #NumFich, 8, B
                        R = R + (B * 16384)
                        Get #NumFich, 9, B
                        R = R + (B * 128)
                        Get #NumFich, 10, B
                        R = R + B
     
                        If R > TailleFichier Or R > 2147483647 Then Exit Sub
     
                        Tag2 = Space$(R)
                        Get #NumFich, 11, Tag2
                        PositionEntete = R + 11
                    End If
                End If
            Else
                'Pas de tag ID3v2
            End If
     
     
            GetID3v2Tag1 Tag2 'Pass the Id3v2 TagId to the GetID3v2Tag1 function
     
     
    End Sub


    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    Private Function GetID3v2Tag1(Tag2 As String) As Boolean
     
    'On Error GoTo errorhandler
     
       Dim TitleField As String
       Dim ArtistField As String
       Dim AlbumField As String
       Dim YearField As String
       Dim GenreField As String
       Dim FieldSize As Long
       Dim SizeOffset As Long
       Dim FieldOffset As Long
       Dim TrackNbr As String
       Dim SituationField As String
     
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Determine if the ID3v2 tag is ID3v2.2 or ID3v2.3
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
     
    'Notes: I haven't tested reading an MP3 file that has a ID3v2.2 tag
     
        Select Case Version
     
            Case 2 'ID3v2.2
            'Set the fieldnames for version 2.0
                TitleField = "TT2"
                ArtistField = "TOA"
                AlbumField = "TAL"
                YearField = "TYE"
                GenreField = "TCO"
                FieldOffset = 7
                SizeOffset = 5
                TrackNbr = "TRCK"
     
            Case 3 'ID3v2.3
            'Set the fieldnames for version 3.0
                TitleField = "TIT2"
                ArtistField = "TPE1"
                AlbumField = "TALB"
                YearField = "TYER"
                GenreField = "TCON"
                TrackNbr = "TRCK"
     
                FieldOffset = 11
                SizeOffset = 7
            Case Else
            'We don't have a valid ID3v2 tag, so bail
                Exit Function
     
        End Select
     
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Extract track title
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
     
           i = InStr(Tag2, TitleField)
           If i > 0 Then
              'read the title
              FieldSize = Asc(Mid$(Tag2, i + SizeOffset)) - 1
              If Version = 3 Then
                 'check for compressed or encrypted field
                 B = Asc(Mid$(Tag2, i + 9))
                 If (B And 128) = True Or (B And 64) = True Then GoTo ReadAlbum
              End If
              Debug.Print Mid$(Tag2, i + FieldOffset, FieldSize)
           End If
     
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Extract album title
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ReadAlbum:
        i = InStr(Tag2, AlbumField)
        If i > 0 Then
           FieldSize = Asc(Mid$(Tag2, i + SizeOffset)) - 1
           If Version = 3 Then
              'check for compressed or encrypted field
              B = Asc(Mid$(Tag2, i + 9))
              If (B And 128) = 128 Or (B And 64) = 64 Then GoTo ReadArtist
           End If
           Debug.Print Mid$(Tag2, i + FieldOffset, FieldSize)
     
        End If
     
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Extract artist name
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ReadArtist:
       i = InStr(Tag2, ArtistField)
       If i > 0 Then
          FieldSize = Asc(Mid$(Tag2, i + SizeOffset)) - 1
          If Version = 3 Then
             'check for compressed or encrypted field
             B = Asc(Mid$(Tag2, i + 9))
             If (B And 128) = 128 Or (B And 64) = 64 Then GoTo ReadYear
          End If
          Debug.Print Mid$(Tag2, i + FieldOffset, FieldSize)
       End If
     
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Extract year title
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ReadYear:
       i = InStr(Tag2, YearField)
       If i > 0 Then
          FieldSize = Asc(Mid$(Tag2, i + SizeOffset)) - 1
          If Version = 3 Then
             'check for compressed or encrypted field
             B = Asc(Mid$(Tag2, i + 9))
             If (B And 128) = 128 Or (B And 64) = 64 Then GoTo ReadGenre
          End If
          Debug.Print Mid$(Tag2, i + FieldOffset, FieldSize)
       End If
     
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Extract genre
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ReadGenre:
       i = InStr(Tag2, GenreField)
       If i > 0 Then
          FieldSize = Asc(Mid$(Tag2, i + SizeOffset)) - 1
     
          If Version = 3 Then
             'check for compressed or encrypted field
             B = Asc(Mid$(Tag2, i + 9))
             If (B And 128) = 128 Or (B And 64) = 64 Then GoTo ReadTrackNbr
          End If
     
          s = Mid$(Tag2, i + FieldOffset, FieldSize)
          If Left$(s, 1) = "(" Then
            Debug.Print Val(Mid$(s, 2, 2))
            'cboGenre2.ListIndex = Val(txtGenre.Text) + 1
     
          Else
             'i = InStr(gsGenres, s & Space$(22 - Len(s)))
             Debug.Print i
     
             'cboGenre2.ListIndex = i
             If i > 0 Then
                Debug.Print Int(i / 22)
             End If
          End If
       End If
     
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Extract track number
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ReadTrackNbr:
       i = InStr(Tag2, TrackNbr)
       If i > 0 Then
          FieldSize = Asc(Mid$(Tag2, i + SizeOffset)) - 1
          If Version = 3 Then
             'check for compressed or encrypted field
             B = Asc(Mid$(Tag2, i + 9))
             If (B And 128) = 128 Or (B And 64) = 64 Then GoTo Done
          End If
          Debug.Print Mid$(Tag2, i + FieldOffset, FieldSize)
       End If
     
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' We're done looking for ID3v2 info
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Done:
     
       Exit Function
     
    'errorhandler:
       'Err.Clear
       'Resume Next
    End Function


    bonne soirée
    michel

  6. #6
    Futur Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 4
    Par défaut
    Bonjour à tous,

    Merci silkyroad pour ce code, même si le mien marche pas mal, il est beaucoup moins... propre je dirais !! en effet, je copie les xx premiers caractères du fichier dans une variable string, puis je recherche dedans mes tags.

    Je vais laisser cela comme ça, en revanche ton code m'aura au moins permis de modifier le mien pour traiter les différentes versions du id3 v2.

    Godzestla merci également, même si je n'ai pas trop eu le temps de tester ton code ni surtout d'essayer de le comprendre...

    En revanche, si quelqu'un sait ou je pourrais trouver une doc sur la structure des fichiers mp3 avec tag, ça pourrait m'aider fortement, parce que j'ai testé en modifiant manuellement les id3v2 directement dans le fichier, et comme prévisible, mes fichiers deviennent illisibles, donc inutile dans ce cas de chercher à modifier ainsi le fichier, comme ton code le fait probablement très bien.

    Merci d'avance à tous

Discussions similaires

  1. [VBA-E] modifier un fichier texte avant import
    Par hka75 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 04/04/2007, 21h13
  2. modifier un fichier texte
    Par gennydude99 dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 20/10/2006, 22h54
  3. [vb.net] Modifier un fichier texte
    Par olbi dans le forum Windows Forms
    Réponses: 2
    Dernier message: 06/10/2006, 15h31
  4. Réponses: 3
    Dernier message: 06/10/2006, 14h21
  5. comment utiliser Notepad pour modifier un fichier texte?
    Par moon13_698 dans le forum Autres Logiciels
    Réponses: 7
    Dernier message: 06/05/2006, 15h41

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