Séparer le contenu d'une colonne en plusieurs colonnes

Bonjour,

Je possède des fichiers csv. dans lequel les données sont recensées sur une seule colonne et chaque valeur est séparé par une barre « | » ex :

date|GPEF_PUG_TGBT15_ELEC_GF_W304A_E*+1|SOMM
01/01/2023|1447|1447

J’ai essayé de réalisé une macro permettant de séparer chaque valeur dans une cellule. La macro fonctionne bien si je n’ai pas de chiffre après la virgule au niveau de la donnée et si je n’ai pas beaucoup de valeur à séparer.

Par exemple je n’arrive pas à dissocier correctement cette valeur :

date|OND_CH01_01_P*+1|OND_CH01_02_P*+1|OND_CH01_03_P*+1|OND_CH01_04_P*+1|SOMM
01/01/2023|1212,38433018724|2474,88264651694|3662,17758407398|4874,26117093258|4874,26117093258

Pourriez vous m’aider à ajuster ma macro svp ? :slightly_smiling_face:

Voici ma macro actuellement :

Sub Dosomething()

Dim xSh As Worksheet
Application.ScreenUpdating = False
For Each xSh In Worksheets
    xSh.Select
    Call RunCode
Next
Application.ScreenUpdating = True

End Sub

Sub RunCode()
'your code here

Derniereligne = Cells(100000, 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
End Sub

Merci pour votre aide!!

Bonjour,
Vous avez quelle version ? Car si vous avez une version récente, une formule fera facilement l’affaire (sans utiliser une macro.)
Bien cordialement

Bonjour Jacquinot,

J’ai la version excel 2016 cependant j’ai utilisé une macro car j’ai plus de 50 fichiers csv.
Du coup j’ai un fichier excel qui récupère via une première macro les 50 fichiers dans un même dossier et qui les ajoutes sur un même excel.
Et ensuite c’est la où intervient ma deuxième macro qui traite les fichiers csv (au lieu de passer par données => convertir)

Bien cdt,

1 « J'aime »

Votre exemple fait deux lignes ou juste une seule ligne :

ceci ?
Cordialement

Mon exemple fait deux lignes. Mais en réalité voici une photo la feuille :

Cdt

Voici un exemple également de mon fichier excel :

1 - Ma macro importe les fichiers csv dans différents onglets du fichier excel TRAITEMENT_HISTORIAN

2 - et ensuite j’ai ajouté une deuxième macro qui fonctionne en même temps et qui traite les fichiers csv en dissociant les valeurs dans chaque cellule. Mais c’est là où je coince quand j’ai un fichier csv avec des virgules + une séparation avec la barre…

Cdt

image

Bonjour,

Un fichier « type ». J’ai déjà importé les données en csv via la macro. On retrouve le dysfonctionnement au niveau de l’onglet CH4 en jaune.

Merci beaucoup,
Cordialement

TRAITEMENT_HISTORIAN_TEST.xlsm (38,5 Ko)

Re,

Voici ce que j’ai trouvé en utilisant l’outil convertir :

Sub Dosomething()
Dim xSh As Worksheet
Application.ScreenUpdating = False
For Each xSh In Worksheets
    xSh.Select
    Call Runcode
Next
Application.ScreenUpdating = True

End Sub
Sub Runcode()
Dim a As Integer
Dim b As Integer
ActiveCell.SpecialCells(xlLastCell).Select
a = ActiveCell.Row
For b = 0 To a - 1
Cells(b + 1, 1).Select
On Error Resume Next
ActiveCell.TextToColumns Destination:=ActiveCell, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, Other:=True, OtherChar:="|", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1)), TrailingMinusNumbers:=True
Next
End Sub

J’ai changé la deuxième partie de votre macro (RunCode)
Voici un fichier test :
Test Recherchexlsx.xlsm (48,8 Ko)

J’espère que j’ai bien compris.

Bien cordialement

Re,

Je te remercie pour ton aide !!

Alors je viens de faire le test mais j’ai ça ne fonctionne pas de mon côté.

Pour vraiment te montrer la problématique de ma macro, je t’ai envoyé un fichier zip avec les éléments suivants :

Tu retrouves les 12 fichiers sous format csv que je souhaite traiter et mettre sous un même excel.

Et tu retrouves le fichier « TRAITEMENT HISTORIAN » qui centralise et traite les données : Celui-ci récupère les 12 fichiers csv du dossier à partir d’une macro et traite la mise en forme du csv à partir d’une deuxième macro (les deux sont rattachées au Bouton dans MACRO « 1-Importer les fichier csv ».

Cependant comme échangé précédemment, j’ai certain fichier csv comme le CH4 ou le CH1 qui possède des chiffres après la virgule et ma macro n’arrive pas à faire la dissociation avec la barre comme il y a aussi des virgules…

Onglet qui ne fonctionne pas :

Tu trouvera en PJ le csv ou ma macro ne fonctionne pas :confused:

Merci beaucoup pour ton aide!!

Julie

Voici le fichier de traitement, on voit bien que l’onglet CH4 ou CH11 ne se traite pas correctement par rapport au autre avec la macro que j’ai
TRAITEMENT_HISTORIAN.xlsm (26,4 Ko)

1 « J'aime »

Bonjour

Sans fichier source csv pas simple de trouver la faille
J’ai dû reconstituer à l’aveugle les données récupérées de ce fichier pour tester le traitement « Sub RunCode() »
Celui-ci fonctionne trés bien pour la séparation de chacune d’elles pour chaque ligne mais la virgule n’est pas conservé si le format de la cellule qui l’intègre n’est pas adapté
Il faut le mettre en format texte avant pour récupérer le chiffre décimal avec l’intégralité de ceux après la virgule
Je te propose cette modification dans le code de ce traitement :

Ici :

For j = 0 To UBound(a)
Cells(i, j + 1).Value = a(j)

Next j

mets comme ceci :

For j = 0 To UBound(a)
Cells(i, j + 1).NumberFormat = « @ »
Cells(i, j + 1).Value = a(j)

    Next j
    
Next i

Testes et dis moi

Bonjour,
Ce fichier n’est pas complet, malheureusement,
On ne peut pas accéder à la source comme vous avez mentionné.
Cordialement

Bonjour à vous,

Merci beaucoup pour vos retours ! J’ai fait le test, on retrouve toujours le dysfonctionnement. :confused:

Par contre j’ai fait un test au niveau de mon fichier source et quand je passe les virgules en point manuellement et que j’enregistre mon csv puis que ensuite je lance ma macro du fichier TRAITEMENT HISTORIAN, la dissociation en cellule fonctionne bien.

J’ai essayé plusieurs alternative de macro pour passer les « , » en « . » mais ça passe bien en point mais la dissociation ne se fait pas c’est très bizarre…

Effectivement sans fichier source, je ne vous aide pas…Voici en PJ le fichier source et encore merci pour votre aide !

CH4.csv (3,0 Ko)

Bonjour

Enfin grâce à ce fichier j’ai pu analyser et débusquer le problème
Il est déjà présent à la simple ouverture de celui-ci toutes ces données sont déjà séparé dans l’état où tu les trouves en fin de traitement
Il faut que ceux-ci reste regroupés et être séparés par la routine « Sub RunCode() » ce qui n’est pas en l’état le cas
Pas d’autre choix pour résoudre la difficulté liée à l’ouverture du fichier csv que de modifier celui-ci et de le mettre en txt
Pour cela il suffit de changer son extension donc de le renommer de :
CH4.csv
en
CH4.txt

J’ai dans cet esprit fait évolué ton outil pour qu’il puisse traiter les fichier csv et txt
Un bouton « 1bis - Importer les fichiers txt. » a été rajouté par mes soins permettant pour les fichier txt d’être traités de la même façon
Et bingo le miracle se produit les données sont bien séparées dans l’onglet de destination
J’ai rajouté pour le maintient de la virgule et de l’intégralité des décimales la ligne de code pour mettre la cellule réceptrice au format texte condition indispensable à cet effet :

Cells(i, j + 1).NumberFormat = « @ »

dans cette partie de la procédure « Sub RunCode() » :

For j = 0 To UBound(a)
Cells(i, j + 1).NumberFormat = « @ »
Cells(i, j + 1).Value = a(j)

    Next j
    
Next i

Donc la méthode consiste à intégrer tous les fichier csv par le bouton « 1 - Importer les fichiers csv. » et pour ceux qui n’ont pas un résultat satisfaisant concernant les partages de données de renommer leur fichier csv en txt (« .txt ») puis d’utiliser le bouton « 1bis - Importer les fichiers txt. »

Ton fichier ainsi adapté

Fais des essais et dis moi

TRAITEMENT_HISTORIAN.xlsm (23,6 Ko)

Rebonjour,
En utilisant votre fichier,
J’ai pas eu de problème, les codes s’adapte parfaitement aux types de données.

CH4 (2).xlsm (33,4 Ko)

Bien cordialement

Bonjour WILL-FREAD
Tout dépend de ton Excel
Certain on en mémoire le morcellement des données préétablit concernant des fichier de type csv
ce qui est le cas de notre interlocutrice et le mien aussi
En exécutant uniquement l’ouverture et la recopie de son fichier par la macro « Sub ExportCsv() » j’obtiens déjà les données morcelées mais pas comme attendues :

Elles sont toutes réparties dans les colonnes « A » à « F » simplement par le simple fait de l’ouverture du fichier rien d’autre

Seule solution est d’utiliser un fichier en format « .txt »

En adaptant la procédure à ce type de fichier que j’ai appelé « Sub ExportTxt() » à son ouverture le résultat est tout autre :

Toutes les données non morcelées se retrouvent dans une seule colonne « A »

Et ainsi de les avoir correctes pour le traitement de morcellement « Sub RunCode() »

Ce sont les caprices d’Excel" et ce n’est pas la premiere fois que je suis confronté à cette difficulté que je résous en changeant le type de fichier d’import au lieu de « CH4.csv » je le nomme « CH4.txt » et tout rentre dans l’ordre juste à adapter le traitement d’import

Donc notre interlocutrice fait partie des malchanceuses

A ta dispo pour des compléments si tu le souhaites

1 « J'aime »

Ah je vois :grin: :grin:,
C’est peut être ça !
Ah !!! les versions :thinking:

Non ce n’est même pas une question de version mais une mémorisation d’Excel sur les imports des fichier csv du partage des données qui s’en suit utilisant sur les import suivant le même
J’ai constaté ce phénomène lors d’un premier import d’un fichier sans aucun morcellement et les fois suivante pour celui-ci systématiquement morcelé à l’identique à ses ouvertures avec Excel strictement identique
La seule solution est de passer par un fichier txt

Ah, d’accord !
Je suis pas habitué à exporter des fichiers csv !
En tout cas merci pour l’info.
Une leçon en plus !
Merci