CSV vers Excel : Extraction des données
Bonsoir chers tous et meilleurs vœux pour l'année advenir.
Je sui de retour avec mes problèmes. Certes j'ai dores et déjà fait des recherches dans le forum, mais aucun ne répond le plus nettement à mon problème.
Situation :
J'ai un rapport d'activité d'impression généré automatiquement depuis un logiciel via un fichier .csv (avec pour séparateur les virgules) logé dans "Mes Documents.
J'ai également un fichier .xlsm sur le bureau avec lequel je souhaite récupérer et retraiter ce rapport avec les entêtes (Ligne 2 du rapport)
Problème :
Je souhaiterais récupérer le rapport dans le classeur à partir de la 3ème ligne, tant que la ligne en question n'a pas encore été exportée chaque virgule étant un séparateur de colonne.
Je ne sais pas si je me suis bien expliquée, je joins donc les deux fichiers, le rapport tel quel, et mon fichier en conception.
Merci pour ceux qui auront le temps de m'aider.
bonjour,
A tester : (Attention dans ton classeur il est question de Feuil1...)
Sub integration()
Dim FileName$, chemin$, FileNum%
Dim textline$, csvline
Dim iR%, i%
Worksheets("Feuil1").Cells.Clear
FileName = Application.GetOpenFilename("Text Files (*.csv), *.csv")
FileNum = FreeFile()
Open chemin & FileName For Input As #FileNum
iR = 1
Do While Not EOF(FileNum)
Line Input #FileNum, textline
csvline = Split(textline, ",")
With Worksheets("Feuil1")
If iR > 1 Then .Range(.Cells(iR - 1, 1), .Cells(iR - 1, UBound(csvline) + 1)) = csvline
End With
iR = iR + 1
Loop
Worksheets("Feuil1").Cells.Replace What:="""", Replacement:="", LookAt:=xlPart
End SubA+
bonjour,
A tester : (Attention dans ton classeur il est question de Feuil1...)
Sub integration()
Dim FileName$, chemin$, FileNum%
Dim textline$, csvline
Dim iR%, i%
Worksheets("Feuil1").Cells.Clear
FileName = Application.GetOpenFilename("Text Files (*.csv), *.csv")
FileNum = FreeFile()
Open chemin & FileName For Input As #FileNum
iR = 1
Do While Not EOF(FileNum)
Line Input #FileNum, textline
csvline = Split(textline, ",")
With Worksheets("Feuil1")
If iR > 1 Then .Range(.Cells(iR - 1, 1), .Cells(iR - 1, UBound(csvline) + 1)) = csvline
End With
iR = iR + 1
Loop
Worksheets("Feuil1").Cells.Replace What:="""", Replacement:="", LookAt:=xlPart
End Sub
A+
Merci Galopin01
S'il te plaît, j'aimerais que la ligne d'entête (que j'ai traduite en français reste immuable (inchangée))
... que les données commencent à partir de ligne 2 quoi.
Y a-t-il un moyen de ne plus "clear" la feuille avant et coller juste à partir de la première ligne vide sans doublons ?
S'il te plaît, je voudrais rappeler que ce rapport est quotidien (Les impressions peuvent s'ajouter et le lendemain matin un nouveau rapport se génère)
je voudrais que peu importe la date, tous ces rapports puissent être récapitulés et consolidés dans mon classeur de telle sorte que je puisse insérer un TCD dans la feuille 2 pour l'analyse.
NB, le code a un peu changé comme sui :
Sub integration()
Dim NomFichier$, Chemin$, NumeroFichier%
Dim LigneTexte$, LigneCSV
Dim iR%, i%, Ligne As Long
'Vidage des données
Ligne = Impressions.Range("A" & Impressions.Rows.Count).End(xlUp).Row
Impressions.Range("A1:N" & Ligne - 1).Clear 'car j'ai augmenté les colonnes O et P qui seront autocalculées.
NomFichier = Application.GetOpenFilename("Text Files (*.csv), *.csv")
NumeroFichier = FreeFile()
Open Chemin & NomFichier For Input As #NumeroFichier
iR = 1
Do While Not EOF(NumeroFichier)
Line Input #NumeroFichier, LigneTexte
LigneCSV = Split(LigneTexte, ",")
With Impressions
If iR > 1 Then
.Range(.Cells(iR - 1, 1), .Cells(iR - 1, UBound(LigneCSV) + 1)) = LigneCSV
'conversion des nombres-textes en nombres
.Range(.Cells(iR - 1, 3), .Cells(iR - 1, 4)).Cells.NumberFormat = "General"
.Range(.Cells(iR - 1, 3), .Cells(iR - 1, 4)).Cells.Value = _
.Range(.Cells(iR - 1, 3), .Cells(iR - 1, 4)).Cells.Value
End If
End With
iR = iR + 1
Loop
Impressions.Cells.Replace What:="""", Replacement:="", LookAt:=xlPart
End Sub
Ton fichier corrigé. (en pièce jointe.
Nota :
Arr est un Array :cette notation est généralement bien comprise par les intervenants. Ne pas modifier.
Il ne sert à rien de renommer le CodeName de ta feuille comme tu le fais. Si tu le fais, fais en sorte que ça serve à quelque chose...
En général quand on le fait c'est pour avoir avoir un code plus court, clair, compréhensible.
Indentation : ça ne sert à rien d'intenter ton code en forme de pyramide : On le fait pas our faire "joli" mais uniquement quand on rentre dans un niveau de programmation (en général pour éviter d'oublier de refermer le niveau...)
A+
Bonjour à tous
Autre solution : PowerQuery. Ranger les csv au fil du temps dans une même dossier (sous-dossier de Mes Documents par exemple)
La liste dans le fichier xlsx s'enrichira au fur et à mesure.
Merci
a tous les deux.
1- Galopin01, stp, j'essaie d'importer le même fichier avec aucune modification faite cela importe toujours, je voudrais que si cela est déja importé, que l'emport ne se fasse plus.
2- peux tu m'écrire un code avec le dossier ou se trouve le fichier csv intégré une fois et laisse le ...Dialog ?
Merci pour les efforts.
78Chris, peux-tu simuler un modèle ? merci
RE
Il y a des doublons dans ton fichier : on ne retient que 2 lignes sur 4 ?
Dans tes en-têtes tu as 2 colonnes Paper et Size au lieu d'une colonne Paper size.
Au fait cela c'est le test.
Il s'agit d'un traceur d'impressions sur plusieurs machines même en réseau.
Du coup les colonnes date et heure, noms de la machine et d'utilisateur, nom de l'imprimante sont les colonnes-clé
-A la même date heure et minutes, deux imprimantes peuvent tirer des copies, mais à partir de deux postes différents, tu comprends l'importance de l'heure.
il faut meme si possible ajouter les secondes
RE
Tu ne réponds pas vraiment : dans ton exemple on a bien des doublons et il ne reste bien que 2 lignes ?
Les secondes figurent dans le csv donc sont prises en compte
Pour ne pas avoir de Dialog il suffit que le fichier soit toujours le même. Dans ce cas tu remplaces la lige Dialog par
FileName = "MonBeauFichier.csv"Si ce fichier est dans le même dossier que le xlsm, même pas besoin de Chemin. (D'ailleurs il est inexistant dans mon classeur démo)
Je trouve tes questions de plus en plus... "téléphonées" voire même presque "sms" : C'est toi qui est sur place et qui peut réfléchir à la problématique.
Pour ne pas importer les doublons, il faut déjà les avoir importés... puis se rendre compte que ce sont des doublons !
C'est une procédure secondaire à lancer ensuite.
C'est à toi de déterminer une règle valide pour différencier les doublons normaux des importations en double...
Il y a sans doute une bonne demi douzaine de possibilité, peut-être plus ! Toutes ont plus ou moins les inconvénients de leurs avantages...
Je te laisse réfléchir à la solution qui conviendra le mieux.
A+