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 :
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
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
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)
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…
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)
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…
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)
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)
Merci beaucoup pour vos retours ! J’ai fait le test, on retrouve toujours le dysfonctionnement.
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 !
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. »
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 :
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
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