arrangement d'un fichier csv
Bonjour à tous
Je débute totalement en VBA, en fait j'ai juste besoin d'un petit outil pour trier des données venant d'un fichier csv.
En fait j'ai une boutique en ligne sur etsy.fr, et chaque fin de mois, je récupère mes données dans un fichier csv, le problème est que je suis obligé d'avoir une trentaine de colonnes alors que seules 7 ou 8 me suffisent pour mon compte rendu de fin de mois. Le faire à la main est assez long et pénible, j'aimerais automatiser.
Alors j'ai déja fait ça :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
Sub import_csv()
Dim wk1 As Workbook, wk2 As Workbook
Dim chemin As String, fichier As String
Set wk1 = ThisWorkbook
chemin = wk1.Path & "/"
fichier = "jan2019.csv"
MsgBox chemin & fichier
Workbooks.Open chemin & fichier
End Sub |
j'arrive déja à ouvrir mon fichier csv, (je suis déja content) mais j'ai plusieurs choses que j'aimerais faire (je vais y aller petit à petit) :
- j'aimerais pouvoir ouvrir le csv dans le document courant car actuellement il m'ouvre un nouveau classeur (il faut peut etre importer au lieu d'ouvrir ?)
- j'aimerais pouvoir éliminer par exemple les colonnes 3, 7, 9, 10 et les redimensionner à la taille du champs de texte à l'interieur.
- j'aimerais afficher une boite de dialogue qui liste tous les fichiers csv du dossier afin d'ouvrir celui que je veux
- j'aimerais pouvoir remplacer tous les champs intitulés par exemple "wooden lampshade" par "L30"
- j'aimerais créer une nouvelle colonne "Total" qui ajoute la somme des frais de port et du montant de la commande (pour chaque ligne)
- j'aimerais créer une nouvelle ligne à la fin du tableau qui fait le total de mon chiffre d'affaire du mois
Je vais arreter là pour le moment, ça fait déja beaucoup.
Quand j'aurais le temps je fouillerais de mon coté et je mettrais ce que j'ai trouvé ici.
Je ne suis pas contre un peu d'aide pour les principales commandes qui me seraient utiles dans ce petit projet.
Merci à vous
Pierre
2 pièce(s) jointe(s)
re une proposition parmis d'autre
bonjour
une proposition commentée
solution1:
exemple
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| Sub test()
Dim MyCsv, Chemin, montablo, colonnes, Rng As Range ' variables utiles
Chemin = "C:\Users\polux\DeskTop\toto.csv" ' url du csv
Application.ScreenUpdating = False ' raffraichissement ecran inhibé
Set MyCsv = Workbooks.Open(Chemin, local:=True) 'ouverture du CSV
Set Rng = ActiveWorkbook.Sheets(1).UsedRange ' on determine la plage complete du CSV
colonnes = Array(3, 7, 9, 10) ' les colonne que l'on veut
montablo = CreateTableauWithNonContigue(Rng, colonnes) 'apel de la fonction de creation du tableau
MyCsv.Close
With ActiveSheet.Cells(1, 1).Resize(UBound(montablo), UBound(montablo, 2)) 'determine la plage de reception
.Value = montablo ' pose du tableau obtenu
.Columns.AutoFit ' autsize des colonnes utilisé par le tableau
End With
End Sub
'
'
'Fonction pour créer un tableau avec un range non contigue
Function CreateTableauWithNonContigue(Rng As Range, colonnes)
CreateTableauWithNonContigue = Application.Index(Rng, Evaluate("Row(1:" & Rng.Rows.Count & ")"), colonnes)
End Function |
le csv au depart ouvert dans excel
Pièce jointe 460620
resultat
Pièce jointe 460623
Proposition 2
on créer une variable"p" qui contiendra l'union des plage colonnes et on copy -->destination
le resultat sera le meme
Code:
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
| Sub testU()
Dim MyCsv, Chemin, montablo, colonnes, Rng As Range ' variables utiles
Chemin = "C:\Users\polux\DeskTop\toto.csv" ' url du csv
Application.ScreenUpdating = False ' raffraichissement ecran inhibé
Set MyCsv = Workbooks.Open(Chemin, local:=True) 'ouverture du CSV
Set Rng = ActiveWorkbook.Sheets(1).UsedRange ' on determine la plage complete du CSV
colonnes = Array(3, 7, 9, 10) ' les colonne que l'on veut
Set maplage = CreateRangeWithUnionRangeNonContigue(colonnes) 'on créé une plage non contigue avec la fonction
maplage.Copy Destination:=ThisWorkbook.Sheets(1).Cells(1) ' on copy destination tout simplement
MyCsv.Close ' on peut fermer le csv
With ActiveSheet:
.Cells(1, 1).Resize(.UsedRange.Rows.Count, UBound(colonnes) + 1).Columns.AutoFit ' autsize des colonnes utilisé par le tableau
End With
End Sub
'fonction pour créer un range avec l'union de rangeS non contigues
'
'
Function CreateRangeWithUnionRangeNonContigue(colonnes) As Range
Dim p As Range
With ActiveSheet
For i = LBound(colonnes) To UBound(colonnes) ' union de plage colonnes dans "p"
If p Is Nothing Then Set p = .Cells(1, colonnes(i)).Resize(.UsedRange.Rows.Count, 1) Else Set p = Union(p, .Cells(1, colonnes(i)).Resize(.UsedRange.Rows.Count, 1))
Next
End With
Set CreateRangeWithUnionRangeNonContigue = p
End Function |
;)