Macro Excel pr concatener plusieurs fichiers

SERIEUXETCOOL

XLDnaute Occasionnel
Bonjour tout le monde,

C'est mon premier post ici alors je ne sais pas trop si je suis au bon endroit. D'avance je m'excuse.

Je viens vous demander un peu d'aide (beaucoup en fait !). Je viens de découvrir les macros sous Excel. Je sais qu'il existe 2 manière de procéder : sois en programmant par code sois en enregistrant une macro action par action de manière automatique. Je suis donc vraiment novice.

Voila mon objectif :

Dans un dossier disponible sur le pc, j'enregistre plusieurs fichiers .txt (14 fichiers environs). Ces fichiers ont la particularité d'avoir TOUJOURS le même nombre de colonnes (5 colonnes) mais pas forcément le même nombre de lignes (de 0 à 3000 lignes).
Ci après je vous donne un exemple d'un fichier pour mieux voir.

FICHIER 1 :
0 2 4 9 2,2
3 6 7 1 5,6

FICHIER 2 :
3 0 2 3 10
3 2 4 7 89
2 1 1 3 0,01
3 4 1 3 2

Donc le nombre de colonnes est fixe, le nombre de lignes variable et le contenu est exclusivement du nombre.

Je peux avoir plusieurs fichiers de ce type avec plus de lignes. J'aimerais disposer d'un fichier Excel avec une seule Macro à l'intérieure. A partir de l'onglet Formulaire d'Excel j'aimerais insérer un gro bouton qui serait la seule interface avec l'utilisateur. Pour que sa sois simple. Jusque la j'ai réussi à trouver mon bonheur (facile pour vous ? Je sais lol)

La ou sa se corse... Lorsque que je clique sur ce bouton formulaire j'aimerais déclencher ma Macro qui me demande alors de sélectionner mon premier fichier qui se trouve dans un dossier quelconque du PC. Ensuite le contenu du fichier s'ouvre dans un NOUVEAU fichier Excel. Puis automatiquement la macro me demande de sélectionner le fichier suivant qui vas alors s'ouvrir dans le même fichier Excel précédant ET à la suite de l'autre.
La encore pour mieux comprendre je vous donne le résultat estompé.

FICHIER 3 :
0 2 4 9 2,2
3 6 7 1 5,6
3 0 2 3 10
3 2 4 7 89
2 1 1 3 0,01
3 4 1 3 2

La Macro doit permettre de stopper le processus d'importation des fichiers à un moment. C'est à dire si je veux importer 2 fichiers, et bien que je puisse à un moment dire stop, j'ai tout mes fichiers voulu.

C'est une sorte de concaténation que je demande.

Alors j'ai bien évidement cherché sur le net des éléments de réponse et voila ce que j'ai trouvé :

-Il est possible de programmer une Macro permettant à l'utilisateur de sélectionner un fichier dans une arborescence. J'ai testé j'y suis arrivé (et oui même moi lol)

-Il est possible de demander l'ouverture successive de plusieurs fichiers à la suite. Sauf que je ne suis pas arrivé à les mettre sur UNE SEULE feuille Excel ET à la suite les un des autres.

J'ai donc trouvé à travers le net des petits bouts de réponse particulièrement intéressant mais encore trop complexe pour moi. Certains code sont compréhensible de loin mais les fonctions et le langage bien trop compliqué pour que je puisse modifier moi même le code source.


Je ne pense pas que sa sois une mission impossible pour un expert de vba. De même je ne pense pas que cela prenne bien plus de 30 min pour coder tout sa.
Ce que je vous demande est alors un peu de votre temps pour m'aider sur ce projet. J'ai d'autres idées en tête avec cette Macro mais pour le moment je procède étape par étape. Si j'arrive à faire ce que je demande je serais bien assez content pour démarrer.

Pour terminer je fais donc un dernier rappel très concis :
-Je veux un fichier Excel avec un seul bouton qui est lié à une ou plusieurs Macro(s)
-Je veux pouvoir parcourir plusieurs fichiers dans une arborescence et concaténer les fichiers les un après les autres

Est possible ? Je le pense à 90%

Bien amicalement,

André
 

JNP

XLDnaute Barbatruc
Re : Macro Excel pr concatener plusieurs fichiers

Re :),
Pour le début, je t'avais donné le plus court chemin :rolleyes:...
Modifier les déclarations
Code:
Dim Chemin As String, Valeur As Integer, N As Integer
puis demander la valeur avant l'importation
Code:
While Chemin <> ""
Valeur = Application.InputBox("Valeur à reporter :", "3ème colonne", , , , , , 1)
Chemin = Application.GetOpenFilename("Texte, *.dat")
et insérer la valeur à chaque ligne
Code:
Range("A" & I & ":E" & I).Value = Split(Replace(Import, ",", "."), Chr(9))
Range("F" & I).Value = Valeur
I = I + 1
Enfin, pour supprimer les lignes en trop
Code:
Range("A:C").Delete
N = Range("A65536").End(xlUp).Row
For I = N To 1 Step -1
If Cells(I, 1) > 300 Or Cells(I, 1) < 50 Then Rows(I).Delete
Next I
Application.ScreenUpdating = True
Je t'ai mis à chaque fois la ligne du dessus et celle du dessous pour voir où ça s'intègre :p...
Maintenant, pour améliorer la vitesse, le plus simple serait peut-être de ne pas copier les lignes incorrectes ;)...
Code:
Split(Replace(Import, ",", "."), Chr(9))(3)
te donne la 4ème valeur, donc celle qui sera en colonne A après suppression des colonnes A:C, je te laisse mettre en place le test :rolleyes:...
Bonne journée :cool:
 

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Macro Excel pr concatener plusieurs fichiers

Re-Bonjour à tous,

J'étais entrain de me casser la tête sur mon problème et je n'avais pas remarqué la réponse de JNP sur la page numéro deux de cette discussion. Les boules d'avoir perdu encore un peu de tps^^

Bref...

JNP merci pour ces quelques petites précisions. En effet sa vas tout de suite mieux quand on place le code au bon endroit. Plus de problème de plantage.
Petite remarque, j'ai volontairement déplacer une petite partie du code car sa ne répondait pas de manière logique. Voila ce que j'ai déplacé :

While Chemin <> ""
Valeur = Application.InputBox("Valeur à reporter :", "3ème colonne", , , , , , 1)
Chemin = Application.GetOpenFilename("Texte, *.dat")

Si on reste dans cette configuration alors on demande à l'utilisateur de saisir une valeur avant même qu'il ai choisi son fichier .dat. Or Il vaut mieux ouvrir le fichier puis demander d'entrer la valeur. Enfin si l'utilisateur fait annuler lors de l'importation de fichier on reçois toujours le message qui nous invite à entrer une valeur alors qu'on a pas ouvert de fichier...Un peu lourd à long terme. J'ai donc simplement replacé le code de manière astucieuse comme ci-après :

While Chemin <> "" ' Tant que Chemin n'est pas vide
Chemin = Application.GetOpenFilename("Texte, *.dat") ' Boite de dialogue
If InStr(Chemin, "\") = 0 Then ' Si Chemin n'a pas de \ donc que l'opérateur a fait annuler
GoTo Fin ' Va à l'étiquette Fin:
End If ' Fin du test
Valeur = Application.InputBox("Valeur à reporter :", "3ème colonne", , , , , , 1)

Comme sa plus de soucis.


Sinon j'ai rien à dire le code est parfait. Je n'ai plus de soucis au niveau des suppressions de lignes et du temps. Sa se fait très vite. Donc s'est raisonnable maintenant. Donc je ne pense pas me servir de ton astuce pour aller encore plus vite car sa me conviens plus que bien. Mais merci quand même.
J'ai bien vu que tu as légèrement changé ma boucle pour supprimer les lignes. Tu as tout codé en une seule au lieu de faire en deux étapes. Je ne connaissais pas la syntaxe pour faire sa, mais s'est sa que je voulais faire aussi.

Merci JNP pour tous tes conseils. Sa marche impeccable jusque la.

Pour rappel aux nouveaux visiteurs, ce code permet d'importer les données contenues dans un fichier .dat et de les coller sur une feuille Excel. On peut ouvrir plusieurs Fichiers .dat et les données sont collées les unes à la suite des autres (fonction concaténer) sur la même feuille Excel.
De plus la marco permet à l'utilisateur de remplir une colonne par une valeur particulière et ce pour chaque fichier importé. Pour conclure, lors de l'import des données, on supprime un certains de nombre de lignes qui sont jugées inutiles. C'est la mise en forme de la table.

L'opération qu'il me reste à effectuer une fois tous les fichiers importés et ma table bien mise en forme, est un tableau croisé dynamique puis un graphe 3D (de surface).

Pour ce faire je vais enregistrer une nouvelle macro pas à pas de manière à obtenir une première version de code vba. Le souci que je vois venir réside dans le fait que mon graphe seras associé à une certaines plage de valeurs, pour un nom de fichier...

Bref quand je déciderais de coller mon bout de code qui fonctionne bien dans mon code source je sens que sa ne vas pas coïncider pour n'importe quel fichier importé si ma table change de nom ou de nombre de lignes...


Je vais tester un premier code en enregistrant une macro pas à pas. Je vais voir ce que j'en sors. J'aurais sans doute besoin d'un peu d'aide pour généraliser mon code avec le code source. Mais avant d'avoir des réponses je veux chercher un peu.

Je vous tiens au courant, sa devrait aller vite.

PS : Un grand merci à toi JNP
 

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Macro Excel pr concatener plusieurs fichiers

J'ai oublié de placer le code source actuel. Il s'agit de la dernière version la plus à jour...

Sub Test2()
Dim Chemin As String, Valeur As Integer, N As Integer
Dim I As Long, Import As String, Tableau As Double
Application.ScreenUpdating = False ' Désactive l'affichage
Cells.Clear ' Vide la feuille
I = 1 ' Initialise la première ligne
Chemin = "TEST" ' Pour que la boucle ne s'arrête pas tout de suite
While Chemin <> "" ' Tant que Chemin n'est pas vide
Chemin = Application.GetOpenFilename("Texte, *.dat") ' Boite de dialogue
If InStr(Chemin, "\") = 0 Then ' Si Chemin n'a pas de \ donc que l'opérateur a fait annuler
GoTo Fin ' Va à l'étiquette Fin:
End If ' Fin du test
Valeur = Application.InputBox("Valeur à reporter :", "3ème colonne", , , , , , 1) 'Boite de dialogue
Open Chemin For Input As #1 ' Ouvre un fichier en lecture
Do While Not EOF(1) ' Tant qu'on est pas à la dernière ligne
Line Input #1, Import ' Lit la ligne et la stocke dans Import
Range("A" & I & ":E" & I).Value = Split(Replace(Import, ",", "."), Chr(9))
' Copie dans la ligne I colonnes A à E la ligne importée où les "," sont remplacées par des "."
' et Split crée un tableau en fonction des tabulations (Chr(9))
' C'est là qu'on pourrait faire appel aux 2 dernières valeurs du tableau, mais ce serait plus lourd
Range("F" & I).Value = Valeur
I = I + 1 ' On augmente le N° de la ligne
Loop ' On boucle dans le fichier
Close #1 ' On ferme le fichier
Wend ' On boucle sur l'ouverture de fichier
Fin: ' Etiquette pour quand on sort de la boucle
If I = 1 Then Exit Sub ' Si on a pas importer de fichier, on quitte la Sub
' Le problème, c'est que le Split envoie des nombres au format texte, d'où le traitement complémentaire
Range("F1") = 1 ' Met 1 en F1
Range("F1").Copy ' Copie F1
Range("A1:E" & I - 1).PasteSpecial Paste:=xlPasteAll, Operation:=xlMultiply, _
SkipBlanks:=False, Transpose:=False
' Collage spécial en multiplication par 1 qui transforme les valeurs textes en nombres
Application.CutCopyMode = False ' Désactive la sélection du copier
Range("F1").Clear ' Ote le 1 en F1
Range("A:C").Delete ' Supprime les 3 colonnes
N = Range("A65536").End(xlUp).Row 'Récupère le nombre total de lignes
For I = N To 1 Step -1
If Cells(I, 1) > 300 Or Cells(I, 1) < 50 Then Rows(I).Delete 'Permet d'encadrer la table
Next I
Application.ScreenUpdating = True ' Rétablit l'affichage
End Sub
 

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Macro Excel pr concatener plusieurs fichiers

J'ai créé ma macro pas à pas en mode enregistrement lors de la création d'un tableau croisé dynamique.

Ci-après voici le code généré :

Sub Macro2()

Range("A1").Select
ActiveCell.FormulaR1C1 = "a"
Range("B1").Select
ActiveCell.FormulaR1C1 = "b"
Range("C1").Select
ActiveCell.FormulaR1C1 = "c"
Range("D1").Select
ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
"Feuil2!R1C1:R5191C3").CreatePivotTable TableDestination:="", TableName:= _
"Tableau croisé dynamique2"
ActiveSheet.PivotTableWizard TableDestination:=ActiveSheet.Cells(3, 1)
ActiveSheet.Cells(3, 1).Select
ActiveSheet.PivotTables("Tableau croisé dynamique2").SmallGrid = False
ActiveSheet.PivotTables("Tableau croisé dynamique2").AddFields RowFields:="c" _
, ColumnFields:="a"
With ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields("b")
.Orientation = xlDataField
.Caption = "Moyenne b"
.Function = xlAverage
End With
End Sub

Jusque la tout vas bien. Il m'extrais ma matrice en fonction de ma table. La ou sa se corse c'est lorsque je ferme Excel, la macro, vba, ect. Bref TOUT. Et que je recommence tout sur un nouveau classeur Excel. Comme je le sentais, sa coince ! En effet les noms ont changés, et ma marco n'est pas programmée pour travailler sur la feuille active avec une table quelconque (3 colonnes; Nb variant de lignes). J'ai bien spécifié 3 champs d'étiquette pour les 3 colonnes nommées a,b,c.

L'erreur est la suivante :

Erreur d'exécution '1004':
Le nom du champ dynamique n'est pas valide. Pour créer un tableau croisé dynamique, vous devez utiliser des données sous forme de liste avec étiquettes de colonnes. Si vous changez le nom d'un champ dynamique, il vous faut taper un nouveau nom pour le champ.

La ligne défectueuse est la suivante :

ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
"Feuil2!R1C1:R5191C3").CreatePivotTable TableDestination:="", TableName:= _
"Tableau croisé dynamique2"

Le problème viens de "Feuil2!R1C1:R5191C3" je pense. Mais je ne sais pas comment lui forcer à prendre toujours la même référence de feuille ou ma table se créer.

Un conseil, un avis, une remarque, une suggestion, une idée ???


Merci à vous
 

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Macro Excel pr concatener plusieurs fichiers

Bien j'ai enfin trouvé la manière de créer mon tableau croisé dynamique en fonction de la table que je sors. Cette table pour rappel se constitue de 3 colonnes et d'un nombre variable de lignes.

Voici ci après le code source totale qui fonctionne :

Sub Test2()
Cells.Clear ' Vide la feuille
Dim Chemin As String, Valeur As Integer, N As Integer
Dim I As Long, Import As String, Tableau As Double
Application.ScreenUpdating = False ' Désactive l'affichage
I = 1 ' Initialise la première ligne
Chemin = "TEST" ' Pour que la boucle ne s'arrête pas tout de suite
While Chemin <> "" ' Tant que Chemin n'est pas vide
Chemin = Application.GetOpenFilename("Texte, *.dat") ' Boite de dialogue
If InStr(Chemin, "\") = 0 Then ' Si Chemin n'a pas de \ donc que l'opérateur a fait annuler
GoTo Fin ' Va à l'étiquette Fin:
End If ' Fin du test
Valeur = Application.InputBox("Valeur à reporter :", "3ème colonne", , , , , , 1) 'Boite de dialogue
Open Chemin For Input As #1 ' Ouvre un fichier en lecture
Do While Not EOF(1) ' Tant qu'on est pas à la dernière ligne
Line Input #1, Import ' Lit la ligne et la stocke dans Import
Range("A" & I & ":E" & I).Value = Split(Replace(Import, ",", "."), Chr(9))
' Copie dans la ligne I colonnes A à E la ligne importée où les "," sont remplacées par des "."
' et Split crée un tableau en fonction des tabulations (Chr(9))
' C'est là qu'on pourrait faire appel aux 2 dernières valeurs du tableau, mais ce serait plus lourd
Range("F" & I).Value = Valeur
I = I + 1 ' On augmente le N° de la ligne
Loop ' On boucle dans le fichier
Close #1 ' On ferme le fichier
Wend ' On boucle sur l'ouverture de fichier
Fin: ' Etiquette pour quand on sort de la boucle
If I = 1 Then Exit Sub ' Si on a pas importer de fichier, on quitte la Sub
' Le problème, c'est que le Split envoie des nombres au format texte, d'où le traitement complémentaire
Range("F1") = 1 ' Met 1 en F1
Range("F1").Copy ' Copie F1
Range("A1:E" & I - 1).PasteSpecial Paste:=xlPasteAll, Operation:=xlMultiply, _
SkipBlanks:=False, Transpose:=False
' Collage spécial en multiplication par 1 qui transforme les valeurs textes en nombres
Application.CutCopyMode = False ' Désactive la sélection du copier
Range("F1").Clear ' Ote le 1 en F1
Range("A:C").Delete ' Supprime les 3 colonnes
N = Range("A65536").End(xlUp).Row 'Récupère le nombre total de lignes
For I = N To 1 Step -1
If Cells(I, 1) > 300 Or Cells(I, 1) < 50 Or Cells(I, 2) = 0 Then Rows(I).Delete 'Permet d'encadrer la table et de nétoyer les celulles nules
Next I
Range("A1").Select
ActiveCell.FormulaR1C1 = "a"
Range("B1").Select
ActiveCell.FormulaR1C1 = "b"
Range("C1").Select
ActiveCell.FormulaR1C1 = "c"
Application.ScreenUpdating = True ' Rétablit l'affichage

Range("A1").CurrentRegion.Select
ActiveWorkbook.Names.Add "BD", RefersToR1C1:=Selection
ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
"BD").CreatePivotTable TableDestination:="", TableName:= _
"TCD"
ActiveSheet.PivotTableWizard TableDestination:=ActiveSheet.Cells(3, 1)
ActiveSheet.Cells(3, 1).Select
ActiveSheet.PivotTables("TCD").AddFields RowFields:="C" _
, ColumnFields:="A"
ActiveSheet.PivotTables("TCD").PivotFields("B"). _
Orientation = xlDataField
ActiveSheet.PivotTables("TCD").PivotFields("Somme b").Function = xlAverage
With ActiveSheet.PivotTables("TCD").PivotFields("a")
.PivotItems("54").Visible = False
.PivotItems("55").Visible = False
.PivotItems("56").Visible = False
.PivotItems("57").Visible = False
.PivotItems("58").Visible = False
.PivotItems("59").Visible = False
End With
End Sub


Avec ce code je génère bien mon tableau dynamique. Mais le souci se pose lorsque je veux créer mon graphe. La encore sa plante. Je n'arrive pas le faire. Le problème se pose lors de la création de mon graphe avec les lignes suivantes :

Charts.Add
ActiveChart.SetSourceData Source:=Sheets("Feuil5").Range("A3")
ActiveChart.Location Where:=xlLocationAsNewSheet


Quelqu'un aurait-il une idée pour me dépanner de ce mauvais pas ? J'aime bien ce que je fait, mais sa me prend bcp trop de tps et je me met en retard. Si quelqu'un voudrait bien m'aider sur ce tout petit souci sa serait cool. J'arrête pas de me casser la tête sur sa...

André
 

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Macro Excel pr concatener plusieurs fichiers

Je cherche je cherche mais je ne parviens toujours pas à résoudre mon problème de graphique 3D...

Je vais continuer de chercher encore et je vais bien finir par trouver une astuce un jour.

Mais si quelqu'un a une piste ou un conseil pour m'aiguiller je suis preneur.

Amicalement,

André
 

JNP

XLDnaute Barbatruc
Re : Macro Excel pr concatener plusieurs fichiers

Re :),
Je suis désolé mais TCD et graphiques ne sont pas ma tasse de thé :eek:...
Par contre, je te conseillerais d'ouvrir un nouveau fil ("TCD et graphique 3D" par exemple, ou un meilleur titre plus descriptif), de ne décrire que le problème que tu rencontres actuellement, en n'oubliant pas un fichier d'essai retreint, ne contenant que ton TCD et ce que tu souhaites en faire (surtout pas plein des macros utilisées jusqu'à présent :p), tout en indiquant éventuellement un lien vers ce fil pour ceux qui voudraient ce faire une idée plus complète, ce qui permettra aux spécialistes de la question d'avoir envie de se pencher sur ton problème :rolleyes:...
Bon courage pour la suite :cool:
PS : Essaie d'être un peu moins bavard et plus synthétique, tout le monde ne prends pas le temps de lire 50 lignes de texte ;)...
 

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Macro Excel pr concatener plusieurs fichiers

No soucis JNP

L'idée que tu propose est bonne. Repartir d'un nouveau fil avec seulement mon dernier problème. C'est vrai qu'on est un peu sorti du contexte initial qui était de concaténer plusieurs fichiers.

Dsl mais s'est mon premier post sur un forum...

Je vais créer une nouvelle discussion.


Merci pour tous tes conseils JNP. Ta été génial encore une fois
 

Discussions similaires

Statistiques des forums

Discussions
312 113
Messages
2 085 420
Membres
102 886
dernier inscrit
eurlece