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 :

Copie .CSV dans une feuille excel.


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2016
    Messages : 8
    Par défaut Copie .CSV dans une feuille excel.
    Bonjour à tous,
    Je suis un très grand débutant en VBA. Je chercher a créer une macro qui me permettrait d'extraire une seule colonne de mon choix d'un fichier csv, de la copier de la coller dans le fichier excel exécutant la macro.
    J'ai déjà trouvé un code semblable au mien avec des fonctions en trop. Du coup je n'ai pas besoin d'utiliser tout les fichiers csv contenus dans mon dossier, mais uniquement d'en sélectionner un. Je pense pouvoir réussir à faire ça en continuant mes recherches, j'aurais juste besoin de savoir comment supprimer la boucle proprement.

    Du coup le but du code serait de choisir délimiter le tableau, cependant en modifiant le code je n'arrive pas à choisir la colonne que je veux copier et ou je veux la coller. En effet je comprend grossièrement le code mais pas suffisamment pour le modifier correctement et proprement.
    Si vous pouviez me guider un petit peu ça serait super sympa, Merci d'avance !


    Code qui fonctionne :
    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
    Private Sub CommandButton4_Click()
    Dim Wbcsv As Workbook
    Dim Fichier As String, Chemin As String
    Dim LastLig As Long, NewLig As Long
    Dim c As Range
    Dim Tablo
    Const Sep As String = ";"
     
    Application.ScreenUpdating = False                                   'Inhibe la mise à jour affichage
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Show
        If .SelectedItems.Count = 1 Then Chemin = .SelectedItems(1)
    End With
     
    If Chemin <> "" Then
        Chemin = Chemin & "\"
        Fichier = Dir(Chemin & "*.csv")                                  'Le premier fichier csv trouvé
        Do While Fichier <> ""                                           'on fait une boucle jusqu'à ce qu'on ne trouve plus de fichier csv
            Name Chemin & Fichier As Replace(Chemin & Fichier, ".csv", ".txt")
            Fichier = Replace(Fichier, ".csv", ".txt")
            Set Wbcsv = Workbooks.Open(Chemin & Fichier)                 'On ouvre le fichier csv qu'on affecte à la variable Wbcsv
            With Wbcsv.Sheets(1)
                LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row           'LastLig est la dernière ligne remplie du fichier csv ouvert
            End With
            With ThisWorkbook.Worksheets("Feuil1")
                For Each c In Wbcsv.Sheets(1).Range("A2:A" & LastLig)    'Pour chaque cellule de A2:Axxx
                    NewLig = .Cells(.Rows.Count, 1).End(xlUp).Row + 1   'la première cellule vide de la colonne 1 de Feuil1 de ce classeur
                    Tablo = Split(c.Value, Sep)                          'On sépare les données par rapport au séparateur (ici le point virgule)
                    .Range(.Cells(NewLig, 1), .Cells(NewLig, UBound(Tablo) - 8)).Value = Tablo  'on copie
                Next c
            End With
            Wbcsv.Close                                                  'On ferme le fichier csv
            Set Wbcsv = Nothing
            Name Chemin & Fichier As Replace(Chemin & Fichier, ".txt", ".csv")
            Fichier = Dir()                                              'on cherche le fichir csv suivant
        Loop                                                             'on reboucle
    End If
    End Sub

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Une piste avec lecture séquentielle du fichier .csv (explications dans le code) :
    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
     
    Sub Test()
     
        Dim Fichier As String
        Dim Ligne As String
        Dim Tbl()
        Dim I As Long
        Dim NbCol
        Const Sep As String = ";"
     
        'permet le choix d'un fichier csv seulement...
        With Application.FileDialog(msoFileDialogFilePicker)
     
            .Filters.Add "Fichiers csv", "*.csv", 1
            .Show
     
            'si choix effectué
            If .SelectedItems.Count = 1 Then
     
                Fichier = .SelectedItems(1)
     
            'si pas de choix, fin !
            Else
     
                MsgBox "Aucun fichier '.csv' choisi, fin de procédure !"
                Exit Sub
     
            End If
     
        End With
     
        'ouvre le fichier pour compter le nombre de colonnes...
        Open Fichier For Input As #1
     
        Line Input #1, Ligne
     
        'demande le numéro de la colonne à importer
        NbCol = InputBox("Le fichier '" & Dir(Fichier) & "' contient " & UBound(Split(Ligne, Sep)) + 1 & " colonne(s) !" & vbCrLf & _
                         "quel est le numéro de la colonne à importer ?", _
                         "Choix colonne.", 1)
     
        'referme le fichier...
        Close #1
     
        'si non numérique, fin !
        If Not IsNumeric(NbCol) Then
     
            MsgBox "Seulement numérique !"
            Exit Sub
     
        End If
     
        'puis le réouvre afin de revenir au début !
        Open Fichier For Input As #1
     
        'parcour le fichier
        Do While Not EOF(1)
     
            'récup de chaque ligne
            Line Input #1, Ligne
     
            'suppression d'éventuels espaces
            Ligne = Replace(Ligne, """", "")
     
            'stocke dans un tableau seulement les valeurs contenues dans la colonne choisie
            I = I + 1
            ReDim Preserve Tbl(1 To I)
            Tbl(I) = Split(Ligne, Sep)(NbCol - 1)
     
        Loop
     
        'fermeture
        Close #1
     
        'résultat en colonne A de la feuille active
        ActiveSheet.Range(Cells(1, 1), Cells(UBound(Tbl), 1)) = Application.Transpose(Tbl)
     
    End Sub

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2016
    Messages : 8
    Par défaut
    Bonjour,
    Je viens d'éxécuter le code qui fait exactement ce que je voulais. Juste un petit détail , la colonne commence à partir de la 43ème ligne, les cellules au dessus étant vide, j'essaye de modifier le code pour commencer à prendre la colonne à partir de la cellule de mon choix.
    J'ai essayé en modifiant comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      I = I + 1
            ReDim Preserve Tbl(1 To I - 42) 'redimensionner le tableau pour qu'il contienne moins de ligne
            Tbl(I + 42) = Split(Ligne, Sep)(NbCol - 1) 'commencer directement la boucle à partir de la ligne que je veux
    En tout cas merci beaucoup pour la réponse !

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    ...la colonne commence à partir de la 43ème ligne, les cellules au dessus étant vide...
    voici deux possibilités, contrôler si les lignes possèdent une valeur, et démarrer à la ligne 43.
    Pour démarrer à la ligne 43 :
    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
     
    Sub Test()
     
        Dim Fichier As String
        Dim Ligne As String
        Dim Tbl()
        Dim I As Long
        Dim J As Long
        Dim NbCol
        Const Sep As String = ";"
     
        'permet le choix d'un fichier csv seulement...
        With Application.FileDialog(msoFileDialogFilePicker)
     
            .Filters.Add "Fichiers csv", "*.csv", 1
            .Show
     
            'si choix effectué
            If .SelectedItems.Count = 1 Then
     
                Fichier = .SelectedItems(1)
     
            'si pas de choix, fin !
            Else
     
                MsgBox "Aucun fichier '.csv' choisi, fin de procédure !"
                Exit Sub
     
            End If
     
        End With
     
        'ouvre le fichier pour compter le nombre de colonnes...
        Open Fichier For Input As #1
     
        Line Input #1, Ligne
     
        'demande le numéro de la colonne à importer
        NbCol = InputBox("Le fichier '" & Dir(Fichier) & "' contient " & UBound(Split(Ligne, Sep)) + 1 & " colonne(s) !" & vbCrLf & _
                         "quel est le numéro de la colonne à importer ?", _
                         "Choix colonne.", 1)
     
        'referme le fichier...
        Close #1
     
        'si non numérique, fin !
        If Not IsNumeric(NbCol) Then
     
            MsgBox "Seulement numérique !"
            Exit Sub
     
        End If
     
        'puis le réouvre afin de revenir au début !
        Open Fichier For Input As #1
     
        'parcour le fichier
        Do While Not EOF(1)
     
            'récup de chaque ligne
            Line Input #1, Ligne
     
            J = J + 1
     
            If J > 42 Then
     
               'suppression d'éventuels espaces
               Ligne = Replace(Ligne, """", "")
     
               'stocke dans un tableau seulement les valeurs contenues dans la colonne choisie
               I = I + 1
               ReDim Preserve Tbl(1 To I)
               Tbl(I) = Split(Ligne, Sep)(NbCol - 1)
     
            End If
     
        Loop
     
        'fermeture
        Close #1
     
        'résultat en colonne A de la feuille active
        ActiveSheet.Range(Cells(1, 1), Cells(UBound(Tbl), 1)) = Application.Transpose(Tbl)
     
    End Sub
    si la ligne possède une valeur dans la colonne désirée :
    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
     
    Sub Test()
     
        Dim Fichier As String
        Dim Ligne As String
        Dim Tbl()
        Dim I As Long
        Dim NbCol
        Const Sep As String = ";"
     
        'permet le choix d'un fichier csv seulement...
        With Application.FileDialog(msoFileDialogFilePicker)
     
            .Filters.Add "Fichiers csv", "*.csv", 1
            .Show
     
            'si choix effectué
            If .SelectedItems.Count = 1 Then
     
                Fichier = .SelectedItems(1)
     
            'si pas de choix, fin !
            Else
     
                MsgBox "Aucun fichier '.csv' choisi, fin de procédure !"
                Exit Sub
     
            End If
     
        End With
     
        'ouvre le fichier pour compter le nombre de colonnes...
        Open Fichier For Input As #1
     
        Line Input #1, Ligne
     
        'demande le numéro de la colonne à importer
        NbCol = InputBox("Le fichier '" & Dir(Fichier) & "' contient " & UBound(Split(Ligne, Sep)) + 1 & " colonne(s) !" & vbCrLf & _
                         "quel est le numéro de la colonne à importer ?", _
                         "Choix colonne.", 1)
     
        'referme le fichier...
        Close #1
     
        'si non numérique, fin !
        If Not IsNumeric(NbCol) Then
     
            MsgBox "Seulement numérique !"
            Exit Sub
     
        End If
     
        'puis le réouvre afin de revenir au début !
        Open Fichier For Input As #1
     
        'parcour le fichier
        Do While Not EOF(1)
     
            'récup de chaque ligne
            Line Input #1, Ligne
     
            'suppression d'éventuels espaces
            Ligne = Replace(Ligne, """", "")
     
            'seulement si une valeur existe
            If Split(Ligne, Sep)(NbCol - 1) <> "" Then
     
               'stocke dans un tableau seulement les valeurs contenues dans la colonne choisie
               I = I + 1
               ReDim Preserve Tbl(1 To I)
               Tbl(I) = Split(Ligne, Sep)(NbCol - 1)
     
            End If
     
        Loop
     
        'fermeture
        Close #1
     
        'résultat en colonne A de la feuille active
        ActiveSheet.Range(Cells(1, 1), Cells(UBound(Tbl), 1)) = Application.Transpose(Tbl)
     
    End Sub

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2016
    Messages : 8
    Par défaut
    ça marche, c'est parfait.
    Merci beaucoup pour l'aide ! Bonne journée a tout le monde je passe le topic en résolu

    EDIT : Oups cela ne marche pas ! J'obtiens l'erreur :l"'indice n'appartiens pas à la sélection" en essayant d’exécuter la macro avec le même fichier mais des données différentes.
    Cela pourrait peut être venir du fait que la source du fichier est américaine, et que les données sont séparés par des ";" , mais les dizaine par des "." au lieu des ",". j'ai l'impression que ça bloque ici. En effet le programme détecte 87611 colonnes au lieu des vrai 12 colonnes présentes dans le fichier.
    Comment faire du coup ?

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Quel est le séparateur ? Tu peux modifier la valeur de la constante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Const Sep As String = ";"

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

Discussions similaires

  1. [XL-2010] importer et traiter un fichier csv dans une feuille excel
    Par guilhemaore dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 05/11/2015, 11h06
  2. [VB6]"Figer les volets" dans une feuille Excel
    Par maillardd dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 01/02/2006, 15h41
  3. Sélection de lignes dans une feuille Excel
    Par lerico dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/12/2005, 09h20
  4. [VBA]Userform mobile dans une feuille excel
    Par fikren dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 28/10/2005, 15h45
  5. Timer dans une feuille excel
    Par bbkenny dans le forum Macros et VBA Excel
    Réponses: 23
    Dernier message: 28/01/2005, 10h43

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