Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[VBA] Fusion rapide de fichiers texte

12 réponses
Avatar
HD
Bonjour,

Via VBA, je fusionne des fichiers EDI au format texte. Jusque là pas de
souci si ce n'est que je voudrai accélérer la fusion des fichiers. En effet
je passe par des boucles qui lisent chaque fichiers pour les réecrire dans
un fichier commun...

Je me demandai si il était possible de fusionner les fichiers directement
via FSO ou une autre méthode ? Je n'ai pour l'instant rien trouver...

Pour info, voici mon script actuel :
'------------------------------------
[...]
If Application.FileDialog(msoFileDialogFilePicker).SelectedItems.Count >
1 Then
Fic = Environ("Temp") & "\CCTemp.edi"
Kill (Fic)
NbLiTot = 0
Open Fic For Output As #1
For j = 1 To
Application.FileDialog(msoFileDialogFilePicker).SelectedItems.Count
FicEDI =
Application.FileDialog(msoFileDialogFilePicker).SelectedItems(j)
NbLi = 0
Open FicEDI For Input As #2
Do Until EOF(2)
NbLi = NbLi + 1
NbLiTot = NbLiTot + 1
Line Input #2, Ligne
Print #1, Ligne
Application.StatusBar = "Fusion des fichiers " & Format(j,
"00") & " / " &
Format(Application.FileDialog(msoFileDialogFilePicker).SelectedItems.Count,
"00") & " / " & NbLiTot
Loop
Close #2
Next
Close #1
Application.StatusBar = ""
Else
If
Application.FileDialog(msoFileDialogFilePicker).SelectedItems.Count = 0 Then
Exit Sub
Fic =
Application.FileDialog(msoFileDialogFilePicker).SelectedItems(1)
End If
[...]
'------------------------------------

Cordialement,

HD

10 réponses

1 2
Avatar
Gloops
HD a écrit, le 31/05/2012 12:30 :
Bonjour,

Via VBA, je fusionne des fichiers EDI au format texte. Jusque là pas de
souci si ce n'est que je voudrai accélérer la fusion des fichiers. En effet
je passe par des boucles qui lisent chaque fichiers pour les réecrire dans
un fichier commun...

Je me demandai si il était possible de fusionner les fichiers directe ment
via FSO ou une autre méthode ? Je n'ai pour l'instant rien trouver...



Bonjour,

Il s'agit de concaténer plusieurs fichiers texte, c'est bien ça ?
ça peut être intéressant de bien regarder les options de la command e en
ligne COPY. En gérant bien les caractères joker, une commande fait
précisément ça. Après il faut vérifier si il n'y a pas de probl ème avec
un caractère de fin de fichier, si une option de COPY permet de
l'éliminer ...

Ce n'est pas certain que ça prenne plus de temps que d'écrire une
procédure VBA.

Enfin si on s'oriente vers ça, bien entendu il faut faire attention à
quel système d'exploitation on utilise. Et ne pas être avare de quelq ues
tests, imaginer dans quelles circonstances un des fichiers pourrait êtr e
verrouillé, ce qui peut se passer dans ce cas, si des caractères
indésirables induisent un comportement inapproprié, si les fins de
lignes sont marquées comme on s'y attend ...

C'est à la limite du sujet, mais au regard de la simplicité que ça peut
apporter ...
Avatar
MichD
Bonjour,

Essaie ceci :

J'ai supposé que les fichiers étaient tous dans le même répertoire

'-----------------------------------------
Sub Compilation_Fichier_Texte()

Dim Temp As String, T As String
Dim Chemin As String, Fichier As String
Dim X As Long, FichierCompilation As String


'Endroit où sont regroupés les fichiers texte à modifier
Chemin = "c:UsersDenisDocuments"
'Le nom du fichier où doit être compiler toutes les données
FichierCompilation = "Compilation.txt"


On Error Resume Next
'Suppprime le fichier de compilation s'il existe
Kill Chemin & FichierCompilation

X = FreeFile
Fichier = Dir(Chemin & "*.txt")

Do While Fichier <> ""
If Fichier <> FichierCompilation Then
Open Fichier For Binary Access Read As #X
Temp = String(LOF(X), Chr(0))
Get #X, , Temp
T = T & Temp & vbCrLf
Close #X
End If
Fichier = Dir()
Loop
T = Left(T, Len(T) - 2)
Open Chemin & FichierCompilation For Output As #X
Print #X, T
Close #X
End Sub
'-----------------------------------------





"HD" a écrit dans le message de groupe de discussion : jq7h1u$2acn$

Bonjour,

Via VBA, je fusionne des fichiers EDI au format texte. Jusque là pas de
souci si ce n'est que je voudrai accélérer la fusion des fichiers. En effet
je passe par des boucles qui lisent chaque fichiers pour les réecrire dans
un fichier commun...

Je me demandai si il était possible de fusionner les fichiers directement
via FSO ou une autre méthode ? Je n'ai pour l'instant rien trouver...

Pour info, voici mon script actuel :
'------------------------------------
[...]
If Application.FileDialog(msoFileDialogFilePicker).SelectedItems.Count >
1 Then
Fic = Environ("Temp") & "CCTemp.edi"
Kill (Fic)
NbLiTot = 0
Open Fic For Output As #1
For j = 1 To
Application.FileDialog(msoFileDialogFilePicker).SelectedItems.Count
FicEDI Application.FileDialog(msoFileDialogFilePicker).SelectedItems(j)
NbLi = 0
Open FicEDI For Input As #2
Do Until EOF(2)
NbLi = NbLi + 1
NbLiTot = NbLiTot + 1
Line Input #2, Ligne
Print #1, Ligne
Application.StatusBar = "Fusion des fichiers " & Format(j,
"00") & " / " &
Format(Application.FileDialog(msoFileDialogFilePicker).SelectedItems.Count,
"00") & " / " & NbLiTot
Loop
Close #2
Next
Close #1
Application.StatusBar = ""
Else
If
Application.FileDialog(msoFileDialogFilePicker).SelectedItems.Count = 0 Then
Exit Sub
Fic Application.FileDialog(msoFileDialogFilePicker).SelectedItems(1)
End If
[...]
'------------------------------------

Cordialement,

HD
Avatar
h2so4
Le jeudi 31 mai 2012 12:30:25 UTC+2, HD a écrit :
Bonjour,

Via VBA, je fusionne des fichiers EDI au format texte. Jusque là pas de
souci si ce n'est que je voudrai accélérer la fusion des fichiers. En effet
je passe par des boucles qui lisent chaque fichiers pour les réecrire d ans
un fichier commun...

Je me demandai si il était possible de fusionner les fichiers directeme nt
via FSO ou une autre méthode ? Je n'ai pour l'instant rien trouver...



tu pourrais utiliser un programme disponible via le command prompt de windo ws.

type fichier1.txt fichier2.txt > resultat.txt

execution possible à partir d'excel via l'instruction shell
Avatar
HD
Merci à tous !!!

J'ai utilisé la métrode de MichD car c'est une méthode qui reste dans
l'utilisation du VBA sans passer par des commandes windows.

Cette méthode est énormément plus rapide que ma méthode précédente où je
lisais ligne à ligne (plus rapide d'un facteur 1000)... par contre,
inconvénient, je n'ai plus le nombre de ligne total du fichier de
concaténation et comme ce fichier est ensuite copié dans Excel cela me
permettait de savoir si le nombre de lignes du fichier ne dépassait pas les
65534 lignes d'une feuille Excel.

J'ai également adapté un peu la macr en supprimant le "& vbCrLf" de la ligne
:
T = T & Temp & vbCrLf
car elle m'ajoutait une ligne vide de séparation entre chaque fichier
concaténé.

Cordialement,

HD
Avatar
MichD
Utilise cette version :

Le nombre de lignes affichées compte aussi les lignes vides du
fichier s'il y en a!

'-----------------------------------
Sub Compilation_Fichier_Texte()

Dim Temp As String, T As String
Dim Chemin As String, Fichier As String
Dim X As Long, FichierCompilation As String
Dim Lignes As Long

'Endroit où sont regroupés les fichiers texte à modifier
Chemin = "c:UsersDenisDocuments"
'Le nom du fichier où doit être compiler toutes les données
FichierCompilation = "Compilation.txt"


On Error Resume Next
'Suppprime le fichier de compilation s'il existe
Kill Chemin & FichierCompilation

X = FreeFile
Fichier = Dir(Chemin & "*.txt")

Do While Fichier <> ""
If Fichier <> FichierCompilation Then
Open Fichier For Binary Access Read As #X
Temp = String(LOF(X), Chr(0))
Get #X, , Temp
T = T & Temp & vbCrLf
Close #X
End If
Fichier = Dir()
Loop
Lignes = Len(T) - _
Len(Application.WorksheetFunction.Substitute(T, Chr(10), ""))
T = Left(T, Len(T) - 2)
Open Chemin & FichierCompilation For Output As #X
Print #X, T
Close #X
MsgBox "Le fichier """ & FichierCompilation & """ contient " & Lignes & " lignes."
End Sub
'-----------------------------------




"HD" a écrit dans le message de groupe de discussion : jqaguc$c5e$

Merci à tous !!!

J'ai utilisé la métrode de MichD car c'est une méthode qui reste dans
l'utilisation du VBA sans passer par des commandes windows.

Cette méthode est énormément plus rapide que ma méthode précédente où je
lisais ligne à ligne (plus rapide d'un facteur 1000)... par contre,
inconvénient, je n'ai plus le nombre de ligne total du fichier de
concaténation et comme ce fichier est ensuite copié dans Excel cela me
permettait de savoir si le nombre de lignes du fichier ne dépassait pas les
65534 lignes d'une feuille Excel.

J'ai également adapté un peu la macr en supprimant le "& vbCrLf" de la ligne
:
T = T & Temp & vbCrLf
car elle m'ajoutait une ligne vide de séparation entre chaque fichier
concaténé.

Cordialement,

HD
Avatar
HD
Lignes = Len(T) - _
Len(Application.WorksheetFunction.Substitute(T, Chr(10), ""))


Un grand MERCI !!! ça fonctionne.

Cordialement,

HD
Avatar
HD
Lignes = Len(T) - _
Len(Application.WorksheetFunction.Substitute(T, Chr(10), ""))


Cette ligne de code fonctionne parfaitement avec mon classeur au format
compatible Excel 97-2003... mais par contre j'ai un plantage dès que je
l'utilise en Excel 2007 xlsm.

Je n'ai pas trouvé l'explication... pourtant la fonction Len() et
Application.WorksheetFunction.Substitute semble bien exister sous le format
xlsm...

Cordialement,
HD
Avatar
MichD
Je n'ai aucun problème pour exécuter cette ligne de code avec Excel 2010.

Dans la fenêtre de l'éditeur de code (vba) , Barre des menus / outils /
références / As-tu des références de cocher où il est écrit à côté "Manquantes"
si c'est le cas, décoche ces références.
Avatar
HD
Dans la fenêtre de l'éditeur de code (vba) , Barre des menus / outils /
références / As-tu des références de cocher où il est écrit à côté
"Manquantes"
si c'est le cas, décoche ces références.


Vendredi, j'avais regardé au niveau des références... et je n'avais aucune
référence manquantes...

Par contre, aujourd'hui je relance ma macro pour régénérer l'erreur et... je
n'ai plus aucune erreur... Le redémarrage du PC a dû résoudre le problème.

@+
HD
Avatar
HD
Ouille... je viens d'avoir le problème à nouveau... cela se produit lorsque
je sélectionne certains fichiers. Vendredi, j'ai eu le souci en testant mes
macros avec le classeur en xlsm sauf que le hasard a fait que je tombe sur
le problème en xlsm car il se produit également avec le classeur en mode
compatible 97-2003.

Le message d'erreur est :
-------------------------
Erreur d'exécution '1004':
Impossible de lire la propriété Substitute de la classe WorksheetFunction.
-------------------------

Message d'erreur que j'ai sur la ligne:
NbLiTot = Len(T) - Len(Application.WorksheetFunction.Substitute(T, Chr(10),
""))

L'erreur ne se produit pas sur les petits fichiers sélectionnés... par
contre, si je sélectionne des fichiers de plusieurs centaines de ko là j'ai
un message d'erreur. Exemple, un MsgBox Len(T) d'un des fichiers me donne
147462 et tout de suite après j'ai le plantage. Y'aurait il une limite
atteinte ?

@+
HD
1 2