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 :

Tableau fichier csv, split virgule


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 10
    Par défaut Tableau fichier csv, split virgule
    Bonjour,
    étant particulièrement novice en VBA, j'ai besoin d'aide pour un projet d'étude. en effet, je veux splitter les caractères séparés par une virgule entre 2 mais il y a une colonne qui contient des noms où la virgule ne doit pas être splitter et les mots sont en guillemets. Je sais pas si je suis bien claire.
    Je veux tout splitter à la virgule sauf le nom qui est entre guillemets mais qui est aussi séparé d'une virgule, du coup la fonction me le spplit aussi.

    Comment faire pour que le Nom de se spillt pas. Je vous mets mon code et mon fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DerniereLigne = Cells(65535, 1).End(xlUp).Row
        Dim ContenuInitial As String
        Dim a() As String
     
        For i = 1 To DerniereLigne
            ContenuInitial = Cells(i, 1).Value
            a() = Split(ContenuInitial, ",")
            For j = 0 To UBound(a)
                Cells(i, j + 1).Value = a(j)
            Next j
        Next I

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    une piste à creuser avec un split intermédiaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub toto()
    Dim a, b
     
    ' on sépare en fonction des guillemets
    a = Split(ActiveCell.Value, """")
     
    ' la seconde portion contient la chaine où la virgule doit être exclue
    ' on la remplace par un point virgule
    a(1) = Replace(a(1), ",", ";")
     
    ' on rassemble et on resplit
    b = Split(Join(a, """"), ",")
     
    End Sub
    Si besoin de remettre la virgule en place, je te laisse ajouter ce post-traitement

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 10
    Par défaut
    Citation Envoyé par joe.levrai Voir le message
    Bonjour,

    une piste à creuser avec un split intermédiaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub toto()
    Dim a, b
     
    ' on sépare en fonction des guillemets
    a = Split(ActiveCell.Value, """")
     
    ' la seconde portion contient la chaine où la virgule doit être exclue
    ' on la remplace par un point virgule
    a(1) = Replace(a(1), ",", ";")
     
    ' on rassemble et on resplit
    b = Split(Join(a, """"), ",")
     
    End Sub
    Si besoin de remettre la virgule en place, je te laisse ajouter ce post-traitement
    Merci beaucoup de ta réponse.
    Oui en effet, c'est une idée, j'essaye de la réaliser. toutefois je comprends pas, j'ai un message d'erreur au niveau de a(1) message d'erreur 9"l'indice est en dehors des délimitations". Je dois mal l'exécuter

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Regardes ce lien tu pourras définir la virgule comme délimiteur!

    Note qu'en Ado la virgule est le délimiteur par défaut pas besoin de schéma.ini!

    https://www.developpez.net/forums/d1...e/#post9771189

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 10
    Par défaut
    Citation Envoyé par dysorthographie Voir le message
    Bonjour,

    Regardes ce lien tu pourras définir la virgule comme délimiteur!

    Note qu'en Ado la virgule est le délimiteur par défaut pas besoin de schéma.ini!

    https://www.developpez.net/forums/d1...e/#post9771189
    Bonjour merci pour votre réponse mais quel est le but exacte de cette manip? je comprends pas pas très bien le code..?

  6. #6
    Invité
    Invité(e)
    Par défaut
    le but de cette manip est de remplir ta feuille sens faire un replace des virgule, sens faire un split ,sens faire un scan du tableau pour renseigner tes cellule!

    en gros moyennant une légère modification faire exactement ce que tu demande!

  7. #7
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par polo9431 Voir le message
    Je veux tout splitter à la virgule sauf le nom qui est entre guillemets mais qui est aussi séparé d'une virgule, du coup la fonction me le spplit aussi.
    Au lieu d'utiliser la fonction Split qui est assez limitée dans ses possibilités, copie tes données dans des cellules et utilise la méthode TextToColumns qui peut faire exactement ce que tu décris (si on lui donne les bons paramètres).
    https://msdn.microsoft.com/fr-fr/lib.../ff193593.aspx

    Ce qui peut donner un code du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A1:A100").TextToColumns Destination:=Range("B1"), DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, Tab:=False, Comma:=True,
    Pour faire propre, il faudrait aussi typer les données par colonne avec le paramètre FieldInfo.

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 10
    Par défaut
    Citation Envoyé par Menhir Voir le message
    Au lieu d'utiliser la fonction Split qui est assez limitée dans ses possibilités, copie tes données dans des cellules et utilise la méthode TextToColumns qui peut faire exactement ce que tu décris (si on lui donne les bons paramètres).
    https://msdn.microsoft.com/fr-fr/lib.../ff193593.aspx

    Ce qui peut donner un code du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A1:A100").TextToColumns Destination:=Range("B1"), DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, Tab:=False, Comma:=True,
    Pour faire propre, il faudrait aussi typer les données par colonne avec le paramètre FieldInfo.
    J'ai essayer de le faire toutefois de 1 colonnes je veux "splitter" en plusieurs colonne qui ne sont pas défini par à l'avance. De plus, le nombre de ligne est aléatoire, Je ne sais donc pas si cette fonction peut marcher encore

  9. #9
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par polo9431 Voir le message
    J'ai essayer de le faire toutefois de 1 colonnes je veux "splitter" en plusieurs colonne qui ne sont pas défini par à l'avance. De plus, le nombre de ligne est aléatoire, Je ne sais donc pas si cette fonction peut marcher encore
    Je suppose que le terme "aléatoire" est mal choisi et que tu veux dire "variable".
    Ceci ne pose pas de problème. D'autant plus que tu as déjà le nombre de lignes dans une variable.

    Je ne vois pas non plus en quoi le nombre de colonnes peut poser problème.
    Il suffit de faire l'opération sur une feuille vierge.
    Mais comme je vois que dans ton code tu mets le résultat dans les colonnes B et plus, je pense que ce ne sera pas nécessaire.
    En tout cas, je ne vois pas pourquoi ça pourrait poser problème avec des cellules et ne pas poser de problème avec un tableau de variables.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim DerniereLigne As Range
    Set DerniereLigne = Cells(Rows.Count, 1).End(xlUp)
    Range("A1", DerniereLigne).TextToColumns Destination:=Range("B1"), DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, Tab:=False, Comma:=True
    Attention à ta variable DerniereLigne : tu as un orthographe différent dans la déclaration et dans le reste du code.

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 10
    Par défaut
    Bonjour et merci pour ta réponse,

    quand j'utilise ton code il m'affiche une erreur "variable objet ou variable de bloc With non défini"?

    C'est à dire mon code VBE, c'est un copié coller de mon code dans l'éditeur de macro si

  11. #11
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re

    bonjour
    donc je reprends depuis le debut

    si je comprends bien tu a un csv qui a comme separateur une virgule MAIS!!!!!! deux de tes colonnes sont en fait une avec nom/prenom entre guillemet separer par une virgule
    c'est bien ca ???

    si c'est le cas il te faut travailler en deux fois
    a savoir
    ouvrir le csv en text avec open for input (en memoire)

    faire un replace de tout le texte sur le (","( la virgule qui separe nom/prenom) par exemple par ceci:("|") ou ce que tu veux
    tu peut faire ensuite un replace sur les virgule en point virgule
    a partir de maintenant tu a le choix
    soit tu sauve le texte obtenu dans un fichier tempavec open for output et tu le réouvre en mode local puis un texttocolonne par les ";"
    soit tu fait un tablo avec un double split ligne/colonne

    rien de bien compliqué

    ai je bien saisi ton probleme ?
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  12. #12
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par polo9431 Voir le message
    quand j'utilise ton code il m'affiche une erreur "variable objet ou variable de bloc With non défini"?
    Je l'ai testée avant de la mettre en ligne.
    Si ça ne marche pas dans ton code, c'est soit que tu as mal copié, soit qu'il y a quelque chose dans ton code qui met un grain de sable.
    As-tu remarqué que DerniereLigne est définie en tant que Range ?

    C'est à dire mon code VBE, c'est un copié coller de mon code dans l'éditeur de macro si
    C'est la faute d'orthographe sur ta variable derniere_ligne / DerniereLigne qui m'a induit en erreur.
    Tu devrais mettre un Option Explicit au début de tes codes pour éviter de type d'erreur.

  13. #13
    Invité
    Invité(e)
    Par défaut
    Code Voila tout en 1 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test()
    With CreateObject("AdoDb.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\MyRepertoire;Extended Properties=""Text;HDR=YES;"""
        Range("a1").CopyFromRecordset .Execute("Select * from [Testes2Rd#csv]")
        .Close
    End With
    End Sub

  14. #14
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 10
    Par défaut
    Citation Envoyé par dysorthographie Voir le message
    Code Voila tout en 1 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test()
    With CreateObject("AdoDb.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\MyRepertoire;Extended Properties=""Text;HDR=YES;"""
        Range("a1").CopyFromRecordset .Execute("Select * from [Testes2Rd#csv]")
        .Close
    End With
    End Sub
    Merci de tes réponses, c'est super. Toutefois je crois que je capte toujours pas...
    Message d'erreur quand je l'utilise "un exposant active x ne peut pas être crée sur le "with créate object"

  15. #15
    Invité
    Invité(e)
    Par défaut
    tu travail dans un milieu sécurisé genre banque,assurance?

  16. #16
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 10
    Par défaut plus clair
    Merci a tous pour vos réponses, pour comprendre exactement ce que je veux faire, je vous mets le code complet (pas optimiser du tout )

    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
    Dim premier_ligne As String
       Dim derniere_ligne As Long
       Dim i_tab As Long
       Dim a, b
     
        'Application.ScreenUpdating = False
                     ' initialisation classeur source
                            Set wbSource = ThisWorkbook
                            ' sélection du fichier à importer
                         FileToOpen = Application.GetOpenFilename()
                            ' si choix effectué
                            If FileToOpen = False Then
                                MsgBox "Vous n'avez pas sélectionné de fichier csv.", 16
                                Exit Sub
                            Else
                                ' ouverture du fichier csv
                                Workbooks.OpenText FileName:=FileToOpen, Local:=True
     
                                'colle la partie csv dans excel
                                Sheets(1).Copy after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
      ' FileToOpen.Close
     
    End If
     
     
    DerniereLigne = Cells(65535, 1).End(xlUp).Row
       Dim ContenuInitial As String
        Dim c() As String
     
        For i = 1 To DerniereLigne
            ContenuInitial = Cells(i, 1).Value
            c() = Split(ContenuInitial, ",")
            For j = 0 To UBound(c)
            Cells(i, j + 1).Value = c(j)
            Next j
        Next i

  17. #17
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 10
    Par défaut pas sécurisé du tout
    Citation Envoyé par dysorthographie Voir le message
    tu travail dans un milieu sécurisé genre banque,assurance?
    Non pas du tout ke suis étudiant sur mon ordi perso (mac)

  18. #18
    Invité
    Invité(e)
    Par défaut
    je n'avais as vue que dans ton poste tu avais précisé que tu travaillais sur mac! désole ça marchera pas!

    mais effectivement c'est indiqué!

    si une personne peut t'indique comment convertir mon code sur MAC, ça m'intéressera de voir le processus, car je suis convaincu qu'il est possible de faire du l'Ado Sql sur MAC!

  19. #19
    Invité
    Invité(e)
    Par défaut
    le mien et par voie de conséquence le tien!

    C'est la faute d'orthographe sur ta variable derniere_ligne / DerniereLigne qui m'a induit en erreur.

Discussions similaires

  1. [XL-2010] Fichier CSV en virgule vers point virgule
    Par Dolchan dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 11/07/2012, 14h15
  2. Transformation tableau -> fichier csv avec opération
    Par archibald78 dans le forum Excel
    Réponses: 0
    Dernier message: 03/06/2011, 18h02
  3. [MySQL] Fichier csv, aide virgule
    Par koka1 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 02/10/2010, 19h08
  4. [VBA-E] Création Fichier csv (séparateur Virgule)
    Par dev_php51 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/07/2008, 11h39
  5. Importer un fichier csv (séparateur virgule) dans un classeur excel 2003
    Par Valérie32 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/06/2008, 21h44

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