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 :

VBA - Modifier le délimiteur d'un fichier CSV


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Conseil en assistance à maîtrise d'ouvrage
    Inscrit en
    Juin 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Conseil en assistance à maîtrise d'ouvrage
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2021
    Messages : 2
    Par défaut VBA - Modifier le délimiteur d'un fichier CSV
    Bonjour,

    Ceci est ma première demande sur le forum, désolé par avance si je n'en respecte pas totalement les codes

    Contexte :

    J'ai développé une macro (adaptée à partir de l'enregistreur de macro et de bouts de code trouvés en ligne) qui permet d'ouvrir un CSV, d'y faire des modifications puis de l'enregistrer en écrasant le fichier CSV d'origine.

    Mon problème :
    Lors de l'enregistrement le délimiteur change, dans le fichier d'origine le délimiteur est "|" dans le fichier modifié le délimiteur est ",".

    Je souhaiterai intégrer dans mon code des lignes permettant de remplacer les "," par "|" pour qu'ensuite ma macro globale fonctionne correctement.

    Merci pour votre aide

    Alexandre

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Sans voir ton code ni savoir exactement le traitement que tu réalises, difficile de t'aider beaucoup sur ton problème particulier.

    Perso, afin de piloter au mieux la récupération et l'écriture dans un fichier texte, j'aime utiliser ADODEB.STREAM

    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
    Sub Test()
      Dim s As Object
      Dim t As String
      Dim data
      Dim R As String
      Dim i As Long
     
    ' Récupération du fichier
      Set s = CreateObject("ADODB.Stream")
      s.Charset = "utf-8"
      s.Open
      s.LoadFromFile ("c:\data\temp\phocéo.csv")
      t = s.readtext
      s.Close
     
    ' Transformation du texte
      t = UCase(t)
     
    ' Ecriture avec écrasement du fichier (second argument = 2)
      s.Open
      s.writetext t
      s.savetofile "c:\data\temp\phocéo.csv", 2
      s.Close
    End Sub
    En cochant la référence à la librairie ADO (perso, j'utilise la 2.8), tu auras l'aide à la saisie et la possibilité d'utiliser les constantes.

    L'idée est donc de créer la chaine complète qui constituera le contenu du fichier en y plaçant toi-même les séparateurs de colonnes, le | dans ton cas, et de ligne (vbCrLf, soit chr(13) & chr(10))
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Nouveau candidat au Club
    Homme Profil pro
    Conseil en assistance à maîtrise d'ouvrage
    Inscrit en
    Juin 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Conseil en assistance à maîtrise d'ouvrage
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2021
    Messages : 2
    Par défaut
    Bonjour Pierre,

    Merci pour ton retour.
    Voici mon code de modification du fichier CSV original:

    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
    Sub Retraitement_CSV_Dossiers()
     
        Dim pqDestinationCell As Range
        Dim cheminFi, nomFi, cheminComplet, dummy, ext, a, b As String
        Dim cn As WorkbookConnection, qry As WorkbookQuery
     
        On Error Resume Next
     
        For Each cn In ActiveWorkbook.Connections
            cn.Delete
        Next cn
     
        For Each qry In ActiveWorkbook.Queries
            qry.Delete
     
        Next qry
     
        cheminComplet = Application.GetOpenFilename
     
        If cheminComplet <> "faux" Then
            ' 1 l'extension
        dummy = cheminComplet
        While Right(dummy, 1) <> "."
            ext = Right(dummy, 1) & ext
            dummy = Left(dummy, Len(dummy) - 1)
        Wend
        dummy = Left(dummy, Len(dummy) - 1) 
        While Right(dummy, 1) <> "\"
            nomFi = Right(dummy, 1) & nomFi
            dummy = Left(dummy, Len(dummy) - 1)
        Wend
        ' le chemin
        cheminFi = dummy
        End If
     
         With ActiveSheet
     
        a = Left(nomFi, 8) & " " & "TOTO" & " " & Right(nomFi, 8)
        b = "_" & Left(nomFi, 8) & "_" & "TOTO" & "_" & Right(nomFi, 8)
     
        End With
     
            ActiveWorkbook.Queries.Add Name:=a, Formula:= _
                "let" & Chr(13) & "" & Chr(10) & "    Source = Csv.Document(File.Contents(""" & cheminComplet & """),[Delimiter=""|"", Columns=34, Encoding=1252, QuoteStyle=QuoteStyle.None])," & Chr(13) & "" & Chr(10) & "    #""En-têtes promus"" = Table.PromoteHeaders(Source, [PromoteAllScalars=true])" & _
                "," & Chr(13) & "" & Chr(10) & "#""Type modifié"" = Table.TransformColumnTypes(#""En-têtes promus"",{{""Donnée1"", type text}, {""Donnée2"", type text}, {""Donnée3"", type text}, {""Donnée4"", type text}, {""Donnée5"", type text}, {""Donnée6"", type text}, {""Donnée7"", type text}, {""Donnée8"", type datetime}, {""Donnée9"", type datetime}, {""Donnée10"", type text}, {""Do" & _
                "nnée11"", type text}, {""Donnée12"", type text}, {""Donnée13"", type text}, {""Donnée14"", type text}, {""Donnée15"", type text}, {""Donnée16"", type text}, {""Donnée17"", type text}, {""Donnée18"", type date}, {""Donnée19"", type text}, {""Donnée20"", type text}, {""Donnée21"", type text}, {""Donnée22"", type text}, {""Donnée23"", Int64.Type}, {""Do" & _
                "nnée24"", type text}, {""Donnée25"", type text}, {""Donnée26"", type text}, {""Donnée27"", type text}, {""Donnée28"", type text}, {""Donnée29"", type datetime}, {""Donnée30"", type text}, {""Donnée31"", type text}, {""Donnée32"", type text}, {""Donnée33"", type text}, {" & _
                """Donnée34"", type text}})," & Chr(13) & "" & Chr(10) & "  #""Colonnes supprimées"" = Table.RemoveColumns(#""Type modifié"",{""Donnée29"", ""Donnée28"", ""Donnée27"", ""Donnée26""})," & Chr(13) & "" & Chr(10) & "    #""Colonnes permutées"" = Table.ReorderColumns(#""Colonnes supprimées"",{""Donnée1"", ""Donnée2"", ""Donnée3"", ""Donnée4"", ""Donnée5"", """ & _
                "Donnée6"", ""Donnée7"", ""Donnée8"", ""Donnée9"", ""Donnée10"", ""Donnée11"", ""Donnée12"", ""Donnée13"", ""Donnée14"", ""Donnée15"", ""Donnée16"", ""Donnée17"", ""Donnée18"", ""Donnée19"", ""Donnée20"", ""Donnée21"", ""Donnée22"", ""Donnée23"", ""Donnée24"", ""Donnée25"", ""Donnée26"", ""Donnée27"", ""Don" & _
                "née28"", ""Donnée29"", ""Donnée30""})" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & "    #""Colonnes permutées"""
            ActiveWorkbook.Worksheets.Add
            With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
                "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=""" & a & """;Extended Properties=""""" _
                , Destination:=Range("$A$1")).QueryTable
                .CommandType = xlCmdSql
                .CommandText = Array("SELECT * FROM [" & a & "]")
                .RowNumbers = False
                .FillAdjacentFormulas = False
                .PreserveFormatting = True
                .RefreshOnFileOpen = False
                .BackgroundQuery = True
                .RefreshStyle = xlInsertDeleteCells
                .SavePassword = False
                .SaveData = True
                .AdjustColumnWidth = True
                .RefreshPeriod = 0
                .PreserveColumnInfo = True
                .ListObject.DisplayName = b
                .Refresh BackgroundQuery:=False
            End With
            ActiveSheet.Select
            ActiveSheet.Move
            ChDir cheminFi
            ActiveWorkbook.SaveAs Filename:=cheminComplet, FileFormat:=xlCSV, CreateBackup:=False
            ActiveWindow.Close
        End Sub
     
     
    Le nouveau fichier s'enregistre donc en lieu et place du fichier initial mais avec un nouveau format xlCSV dont le délimiteur est mis automatiquement.
    Par la suite ma macro utilise le nouveau fichier CSV + 3 fichiers CSV que je ne modifie pas pour réaliser d'autres traitements : 
     
    Sub AjouterDansClasseurExcel(FichierCSV, Classeur As Workbook, NomFeuille As String)
        Dim wkbClasseur As Workbook
        Set wkbClasseur = Workbooks.Open(FichierCSV, , True, Delimiter:="|", local:=True)
     
        wkbClasseur.ActiveSheet.Copy Classeur.ActiveSheet
        Classeur.ActiveSheet.Name = NomFeuille
        wkbClasseur.Close False
     
        If NomFeuille = "Dossiers" Then
            Classeur.ActiveSheet.Columns(1).TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
                TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
                Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo:=Array(Array(1, 2), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, _
                1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12 _
                , 1), Array(13, 1), Array(14, 1), Array(15, 1), Array(16, 1), Array(17, 1), Array(18, 1), _
                Array(19, 1), Array(20, 1), Array(21, 1), Array(22, 1), Array(23, 1), Array(24, 1), Array( _
                25, 1), Array(26, 1), Array(27, 1), Array(28, 1), Array(29, 1), Array(30, 1)), _
                TrailingMinusNumbers:=True
        ElseIf NomFeuille = "Actions" Then
            Classeur.ActiveSheet.Columns(1).TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
                TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
                Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
                :="|", FieldInfo:=Array(Array(1, 2), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, _
                1), Array(6, 1), Array(7, 1)), TrailingMinusNumbers:=True
        ElseIf NomFeuille = "Statuts" Then
            Classeur.ActiveSheet.Columns(1).TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
                TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
                Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
                :="|", FieldInfo:=Array(Array(1, 2), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, _
                1)), TrailingMinusNumbers:=True
        ElseIf NomFeuille = "Tâches" Then
            Classeur.ActiveSheet.Columns(1).TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
                TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
                Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
                :="|", FieldInfo:=Array(Array(1, 1), Array(2, 2), Array(3, 1), Array(4, 1), Array(5, _
                1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12 _
                , 1), Array(13, 1), Array(14, 1), Array(15, 1), Array(16, 1)), TrailingMinusNumbers:= _
                True
        Else
            Classeur.ActiveSheet.Columns(1).TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
                TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
                Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
                :="|"
        End If
    End Sub

    En espérant que cela t'aide à y voir plus clair dans mon besoin.
    Merci,
    Phocéo

Discussions similaires

  1. Modifier le séparateur d'un fichier CSV
    Par elamarti dans le forum PL/SQL
    Réponses: 2
    Dernier message: 26/01/2016, 19h24
  2. Réponses: 6
    Dernier message: 18/05/2015, 10h57
  3. [XL-2003] vba, stocker des résultats dans un fichier csv
    Par linann dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 19/06/2010, 21h17
  4. Modifier plusieurs champs dans un fichier Csv
    Par francois_a dans le forum Shell et commandes GNU
    Réponses: 36
    Dernier message: 02/09/2009, 17h31
  5. [CSV] Modifier un champ d'un fichier CSV
    Par BernardT dans le forum Langage
    Réponses: 3
    Dernier message: 04/07/2007, 10h13

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