Macro concaténation de fichier
Fermé
M6sou
Messages postés
70
Date d'inscription
lundi 26 mai 2014
Statut
Membre
Dernière intervention
13 juin 2014
-
26 mai 2014 à 13:55
f894009 Messages postés 17233 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 29 janvier 2025 - 12 juin 2014 à 17:00
f894009 Messages postés 17233 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 29 janvier 2025 - 12 juin 2014 à 17:00
A voir également:
- Macro concaténation de fichier
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Ouvrir fichier .bin - Guide
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
4 réponses
M6sou
Messages postés
70
Date d'inscription
lundi 26 mai 2014
Statut
Membre
Dernière intervention
13 juin 2014
Modifié par M6sou le 27/05/2014 à 09:47
Modifié par M6sou le 27/05/2014 à 09:47
Le code précédent est incomplet.
Petite mise à jour. Après avoir fait pas mal de recherches, j'ai opté pour une solution.
Mon idée est la suivante:
Etant donnée que tout les noms de fichiers ont la même structure, et que ce qui m'intéresse est la date, j'ai décidé de prendre le milieu du nom de fichier et de les comparer entre eux.
Pour ce faire, j'ai écris le code suivant :
Néanmoins, le programme ne fonctionne pas (sinon je ne serais pas là je pense :D). Il semblerait qu'il bloque au lignes suivante (en gras dans le programme) :
Workbooks.Open (repertoire & NomFichierActif) ' copie ActiveSheet.UsedRange.Copy Destination:=principal.Sheets(1).Range("a" & Rows.Count).End(xlUp).Offset(1) ' copie
Merci pour vos réponses et aide,
Bonne journée !
Petite mise à jour. Après avoir fait pas mal de recherches, j'ai opté pour une solution.
Mon idée est la suivante:
Etant donnée que tout les noms de fichiers ont la même structure, et que ce qui m'intéresse est la date, j'ai décidé de prendre le milieu du nom de fichier et de les comparer entre eux.
Pour ce faire, j'ai écris le code suivant :
Option Explicit
Sub importDonnees()
Dim principal As ThisWorkbook
Dim repertoire As String
Dim NomFichierActif As String
Dim DateActiveP As String
Dim DateActive As String
Dim Init As Boolean
Application.ScreenUpdating = False
Set principal = ThisWorkbook
repertoire = "C:\Documents and Settings\...\Bureau\Test_Macro\"
NomFichierActif = Dir(repertoire & "*.csv")
Init = True
Do While NomFichierActif <> ""
DateActive = Mid(NomFichierActif, 9, 6) ' Prendre la date 1 sur le nom d'un fichier
If DateActiveP = DateActive Then ' Comparer date 1 et date 2
Workbooks.Open (repertoire & NomFichierActif) ' copie
ActiveSheet.UsedRange.Copy Destination:=principal.Sheets(1).Range("a" & Rows.Count).End(xlUp).Offset(1) ' copie ActiveWorkbook.Close True
NomFichierActif = Dir
DateActiveP = DateActive ' mettre la date 1 dans la date 2 Init = False
ChDir "C:\Documents and Settings\9403095F\Bureau\Test_Macro\Nouveau\"
End If
Loop
End Sub
Néanmoins, le programme ne fonctionne pas (sinon je ne serais pas là je pense :D). Il semblerait qu'il bloque au lignes suivante (en gras dans le programme) :
Workbooks.Open (repertoire & NomFichierActif) ' copie ActiveSheet.UsedRange.Copy Destination:=principal.Sheets(1).Range("a" & Rows.Count).End(xlUp).Offset(1) ' copie
Merci pour vos réponses et aide,
Bonne journée !
M6sou
Messages postés
70
Date d'inscription
lundi 26 mai 2014
Statut
Membre
Dernière intervention
13 juin 2014
5 juin 2014 à 12:52
5 juin 2014 à 12:52
Personne ?
f894009
Messages postés
17233
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
29 janvier 2025
1 712
Modifié par f894009 le 6/06/2014 à 14:10
Modifié par f894009 le 6/06/2014 à 14:10
Bonjour,
le chemin doit etre complet
repertoire = "C:\Documents and Settings\...\Bureau\Test_Macro\"
le chemin doit etre complet
M6sou
Messages postés
70
Date d'inscription
lundi 26 mai 2014
Statut
Membre
Dernière intervention
13 juin 2014
6 juin 2014 à 18:31
6 juin 2014 à 18:31
Dans mon programme le chemin est complet là j'ai juste mis des "..." par fainéantise de tout mettre :)
f894009
Messages postés
17233
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
29 janvier 2025
1 712
Modifié par f894009 le 7/06/2014 à 17:20
Modifié par f894009 le 7/06/2014 à 17:20
Bonjour,
une facon differente de faire:
principe:
deux objets Dictionary , Dico1 pour mise en memoire Date et les noms de fichiers meme date, Dico2 date et nombre de fichiers meme date (je pense qu'il et possible de faire avec un seul avec la valeur de clef)
commande Dos (ici pour deux fichiers):
copy chemin & Fichier1 + chemin & fichier2 chemin & fichierFinal
pensez a mettre votre ou vos repertoires
Question: pourquoi passer par une conversion CSV ???????
Les fichiers de log sont des fichiers texte
une facon differente de faire:
principe:
deux objets Dictionary , Dico1 pour mise en memoire Date et les noms de fichiers meme date, Dico2 date et nombre de fichiers meme date (je pense qu'il et possible de faire avec un seul avec la valeur de clef)
commande Dos (ici pour deux fichiers):
copy chemin & Fichier1 + chemin & fichier2 chemin & fichierFinal
pensez a mettre votre ou vos repertoires
Option Explicit
'--------------------------- API attente en ms ---------------------------------------------------------
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'-------------------------------------------------------------------------------------------------------------
Sub concat_fichier()
Dim repertoire As String
Dim NomFichierActif As String
Dim FDate As String
Dim TFichier, point As Integer, FFichier, retval
Dim Dico1, Dico2, curKey, sConcat
Application.ScreenUpdating = False
Set Dico1 = CreateObject("Scripting.Dictionary")
Set Dico2 = CreateObject("Scripting.Dictionary")
'repertoire a adapter
repertoire = "D:\_ACSV\"
NomFichierActif = Dir(repertoire & "*.csv")
Do While NomFichierActif <> ""
If Left(NomFichierActif, 4) = "Tss_" Then
'liste fichiers, date
FDate = Mid(NomFichierActif, 9, 6)
'liste Date
If Not Dico2.Exists(FDate) Then
Dico2.Add FDate, 1
Dico1.Add FDate, NomFichierActif
Else
'compteur NbFichier meme date
Dico2.Item(FDate) = Dico2.Item(FDate) + 1
'rang cle en cours
point = Application.Match(FDate, Dico1.keys, 0)
'ajout fichiers meme date
Dico1.Item(FDate) = Dico1.Item(FDate) & "-" & NomFichierActif
End If
End If
NomFichierActif = Dir
Loop
'boucle sur Dico2 pour concatenation fichiers mem date
For Each curKey In Dico2
If Dico2.Item(curKey) > 1 Then 'test si plusieurs fichiers meme date
'mise en tableau des noms de fichier
TFichier = Split(Dico1.Item(curKey), "-")
'nom de fichier final
FFichier = Left(TFichier(0), 14) & ".CSV"
'Chaine de commande DOS pour concatenation fichier
sConcat = "cmd /c Copy " & repertoire
'boucle fichier -1
point = UBound(TFichier)
For point = 0 To point - 1
'ajout fichier
sConcat = sConcat & TFichier(point) & "+" & repertoire
Next
'aout dernier fichier
sConcat = sConcat & TFichier(point)
'ajout nom de fichier final
sConcat = sConcat & " " & repertoire & FFichier
'commande shell
retval = Shell(sConcat, vbMinimizedNoFocus)
'attente: ici 200ms, peut etre remplace par ctrl process shell (a voir)
Sleep 200
End If
Next curKey
Application.ScreenUpdating = True
End Sub
Question: pourquoi passer par une conversion CSV ???????
Les fichiers de log sont des fichiers texte
M6sou
Messages postés
70
Date d'inscription
lundi 26 mai 2014
Statut
Membre
Dernière intervention
13 juin 2014
10 juin 2014 à 08:40
10 juin 2014 à 08:40
Salut f894009, merci pour ta réponse et désolez pour le temps qu'aura mise la mienne.
Pour l'histoire de la conversion, elle n'est pas obligatoire pour finir.
Merci pour le programme, j'ai exécuté le programme, en y remplaçant mon répertoire, mais je ne comprends pas une chose :
Où s'enregistre les fichiers finaux ? Car quand je lance le code, je vois bien la fenêtre de cmd s'ouvrir et se fermer rapidement, et travailler mais je ne trouve pas les fichiers de sortie...
Saurez tu où ils se trouvent ?
Pour l'histoire de la conversion, elle n'est pas obligatoire pour finir.
Merci pour le programme, j'ai exécuté le programme, en y remplaçant mon répertoire, mais je ne comprends pas une chose :
Où s'enregistre les fichiers finaux ? Car quand je lance le code, je vois bien la fenêtre de cmd s'ouvrir et se fermer rapidement, et travailler mais je ne trouve pas les fichiers de sortie...
Saurez tu où ils se trouvent ?
f894009
Messages postés
17233
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
29 janvier 2025
1 712
10 juin 2014 à 18:15
10 juin 2014 à 18:15
Bonjour,
Je n'avais qu'un seul repertoire:
utilise ici:
et
ici:
a vous de voir ce que vous avez mis comme repertoires
Je n'avais qu'un seul repertoire:
repertoire = "D:\_ACSV\"
utilise ici:
NomFichierActif = Dir(repertoire & "*.csv")
et
ici:
sConcat = sConcat & " " & repertoire & FFichier
a vous de voir ce que vous avez mis comme repertoires
M6sou
Messages postés
70
Date d'inscription
lundi 26 mai 2014
Statut
Membre
Dernière intervention
13 juin 2014
11 juin 2014 à 08:49
11 juin 2014 à 08:49
Oui pour ça je suis d'accord, j'ai mis mon repertoire, le programme tourne bien, mais je ne trouve pas mes fichiers de sorties (fichiers concaténés) ... Ils ne s'enregistrent pas dans le même répertoire
f894009
Messages postés
17233
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
29 janvier 2025
1 712
11 juin 2014 à 09:00
11 juin 2014 à 09:00
Bonjour,
Mettez votre code a dispo svp
Mettez votre code a dispo svp
M6sou
Messages postés
70
Date d'inscription
lundi 26 mai 2014
Statut
Membre
Dernière intervention
13 juin 2014
11 juin 2014 à 09:08
11 juin 2014 à 09:08
Option Explicit '--------------------------- API attente en ms --------------------------------------------------------- Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) '------------------------------------------------------------------------------------------------------------- Sub concat_fichier() Dim repertoire As String Dim NomFichierActif As String Dim FDate As String Dim TFichier, point As Integer, FFichier, retval Dim Dico1, Dico2, curKey, sConcat Application.ScreenUpdating = False Set Dico1 = CreateObject("Scripting.Dictionary") Set Dico2 = CreateObject("Scripting.Dictionary") 'repertoire a adapter NomFichierActif = Dir(repertoire & "*.txt") repertoire = "C:\Documents and Settings\9403095F\Bureau\Test\" Do While NomFichierActif <> "" If Left(NomFichierActif, 4) = "Tss_" Then 'liste fichiers, date FDate = Mid(NomFichierActif, 9, 6) 'liste Date If Not Dico2.Exists(FDate) Then Dico2.Add FDate, 1 Dico1.Add FDate, NomFichierActif Else 'compteur NbFichier meme date Dico2.Item(FDate) = Dico2.Item(FDate) + 1 'rang cle en cours point = Application.Match(FDate, Dico1.keys, 0) 'ajout fichiers meme date Dico1.Item(FDate) = Dico1.Item(FDate) & "-" & NomFichierActif End If End If NomFichierActif = Dir Loop 'boucle sur Dico2 pour concatenation fichiers meme date For Each curKey In Dico2 If Dico2.Item(curKey) > 1 Then 'test si plusieurs fichiers meme date 'mise en tableau des noms de fichier TFichier = Split(Dico1.Item(curKey), "-") 'nom de fichier final FFichier = Left(TFichier(0), 14) & "*.txt" 'Chaine de commande DOS pour concatenation fichier sConcat = "cmd /c Copy " & repertoire 'boucle fichier -1 point = UBound(TFichier) For point = 0 To point - 1 'ajout fichier sConcat = sConcat & TFichier(point) & "+" & repertoire Next 'aout dernier fichier sConcat = sConcat & TFichier(point) 'ajout nom de fichier final sConcat = sConcat & " " & repertoire & FFichier 'commande shell retval = Shell(sConcat, vbMinimizedNoFocus) 'attente: ici 200ms, peut etre remplace par ctrl process shell (a voir) Sleep 200 End If Next curKey Application.ScreenUpdating = True End Sub