Accumulez deux fichier en un seule avec nom qui change

walyddu59

XLDnaute Nouveau
Salut , le forum

J'aurais voulus savoir s'il était possible a partir d'une macro de fusionner deux fichier , les deux fichiers sont toujours dans le même répertoire la macro permettrait de les mettre l'un a la suite de l'autre , le nombre de ligne peut varier selon les fichiers , c'est deux fichier auront toujours la même référence , mais cette référence changerez , le seul moyen de les distinguer et une lettre a la fin pour les deux exemple : 789789v et 789789 f , 987897v et 987987f ainsi de suite , je poste un exemple des deux fichiers qui devront être fusionnez , je suis a l’écoute de toute solutions , et merci a tout aide apportez .

Cordialement .
 

Nairolf

XLDnaute Accro
Re : Accumulez deux fichier en un seule avec nom qui change

ça devrait marcher en metant ce code dans le fichiersynthèse :

Code:
Sub test()
Dim nom_onglet As String

chemin = "C:\"
ligne = 1
nom_onglet = ""
fichier = Dir(chemin & "*.XLS")
fichiersynthèse ="fichier.xls"
Do While fichier <> "" And fichier <> fichiersynthèse

    Workbooks.Open Filename:=chemin & fichier
    
If nom_onglet <> Workbooks(fichier).Worksheets(1).Range("A1").Value Then

    Workbooks(fichiersynthèse).Sheets.Add after:=Worksheets(Worksheets.Count)
    Windows(fichiersynthèse).Activate
    Worksheets(Workbooks(fichiersynthèse).Worksheets.Count).Select
    Workbooks(fichiersynthèse).Worksheets(Workbooks(fichiersynthèse).Worksheets.Count).Name = Workbooks(fichier).Worksheets(1).Range("A1").Value
    
    Windows(fichier).Activate
    Workbooks(fichier).Worksheets(1).Columns("B:B").Select
    Selection.Copy
    Windows(fichiersynthèse).Activate
    Range("B1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=True, Transpose:=False
    Application.CutCopyMode = False
    
    nom_onglet = Workbooks(fichier).Worksheets(1).Range("A1").Value
    
Else
    
    Windows(fichier).Activate
    Workbooks(fichier).Worksheets(1).Range("B2").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Windows(fichiersynthèse).Activate
    Workbooks(fichiersynthèse).Worksheets(nom_onglet).Activate
    Range("B1").Select
    Selection.End(xlDown).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=True, Transpose:=False

End If
    Workbooks(fichier).Close
    fichier = Dir
Loop
End Sub

Tu peux remplacer les copy par des boucles sur les cellules pour être sûr de ne prendre que les valeurs différentes de "".

PS: Le code prend les fichier en ordre alphabétique.
 

walyddu59

XLDnaute Nouveau
Re : Accumulez deux fichier en un seule avec nom qui change

Salut ,

la macro bloque des le debut , j'ai declarer les différentes variables , ensuite cela bloque sur chemin = "C:\" , je comprends pas pourquoi j'ai tout bien placer dans ce répertoire .
 

walyddu59

XLDnaute Nouveau
Re : Accumulez deux fichier en un seule avec nom qui change

Salut ,

Je tourne sur excel 2003 , je viens d’adapter une macro trouvez sur internet ça fonctionne mais a partir de cela je voudrez que cette macro soit dans un module et non sur la feuille car je doit faire d'autre chose après cela serait-il possible de le l'adaptez a mon besoin .
 

Nairolf

XLDnaute Accro
Re : Accumulez deux fichier en un seule avec nom qui change

Je suis déçu que tu n'utilises pas ma macro :( Mais tu fais ce que tu veux :)

Pour mettre ta macro dans un module, tu as plusieurs possibilités:
- créer un module avec une sub toto()
- copier le code dedans (hors sub et end sub)
- là tu as le choix de:
a) remplacer le controle activeX dans la feuille par un contrôle de formulaire auquel tu rattaches ta macro toto()
b) tu appelles (call) la sub toto() dans la sub boutonclick.
 

walyddu59

XLDnaute Nouveau
Re : Accumulez deux fichier en un seule avec nom qui change

salut ,

desoler pour ne pas avoir utiliser ta macro , mais je pense que cela evitera de trop se casser la tete , par contre j'ai bien fait se que tu ma dit mais ca ne fonctionne pas pourrait tu me faire un model stp .
 

walyddu59

XLDnaute Nouveau
Re : Accumulez deux fichier en un seule avec nom qui change

re-salut ,

j'ai reussi a introduire le code dans un module par contre j'arrive pas a trier par ordre croissant le résultat , je le met bien a la suite mais rien n'y fait .
 

Nairolf

XLDnaute Accro
Re : Accumulez deux fichier en un seule avec nom qui change

j'allais de répondre avec le fichier joint.

Je regarde pour le classement.
 

Pièces jointes

  • test macro.xlsm
    20.4 KB · Affichages: 46
  • test macro.xlsm
    20.4 KB · Affichages: 44
  • test macro.xlsm
    20.4 KB · Affichages: 44

walyddu59

XLDnaute Nouveau
Re : Accumulez deux fichier en un seule avec nom qui change

Donc je poste la solution que j'ai trouver pour placer la macro dans un module , il me reste plus qu'a trier j’attends ta solution ;) merci a toi .

Code:
Option Explicit

Sub Fusion2()

'*******************************************************
'Declaration des variables
Dim repertoire_source As String  'Nom repertoire contenant les fichiers a concaténé (sources)
Dim repertoire_det As String 'Nom repertoire contenant les fichiers concaténés (resultats)
Dim objFSO, objDossier, objFichier
Dim mesfichiers() As String
Dim fichier_ss_extension As String  'Nom du fichier sans la lettre afin de le mettre en haut de la colonne A dans le fichier resultat
Dim old_fichier_ss_extension As String
Dim i, b As Double 'Compteur utilisé dans différentes parties du code
Dim valeurs() As String  'On va copier la colonne B dans ce tableau
Dim workbook_in As Workbook  'Classeur Excel en entrée
Dim workbook_Fusion As Workbook  'Classeur Excel en sortie : Fusion
Dim compteur_valeur As Double 'compteur du nombre de valeurs stocké dans le tableau Valeurs()
'*******************************************************


''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'******************************************
'Définition des valeurs constantes  A MODIFIER
repertoire_source = "C:\"  'NE PAS OUBLIER LE \ A LA FIN DU CHEMIN
repertoire_det = "C:\Mes documents personnels\"  'NE PAS OUBLIER LE \ A LA FIN DU CHEMIN
Application.DisplayAlerts = True  'False = Pas de message si fichier existe deja = Il sera ecrasé
                                   'True = Message de confirmation d'ecrasement de fichier si deja existant

'******************************************


'*********************************************************
'On va parcourir les fichiers de types excel dans le repertoire source et on va stocker leur nom
'dans le tableau mesfichiers()
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objDossier = objFSO.GetFolder(repertoire_source) 'On ouvre le repertoire source

'On peuple les noms de fichier dans le tableau mesfichiers()
i = 0 'Init de i=0
  If (objDossier.Files.Count > 0) Then  'Si il y a des fichiers
     For Each objFichier In objDossier.Files
        If (InStr(1, objFichier.Name, ".xls", 1) > 0) Then  'Si il y a des fichiers de type Excel
             ReDim Preserve mesfichiers(i)
             mesfichiers(i) = objFichier.Name
             i = i + 1
        End If
     Next
   End If
'************************************************************

'************************************************************
'Lancement du traitement
compteur_valeur = 0
For i = 0 To UBound(mesfichiers)  'Pour tous les fichiers a traiter


    'On enleve extension + lettre au nom de fichier afin de le comparer
    fichier_ss_extension = Mid(mesfichiers(i), 1, InStr(1, mesfichiers(i), ".") - 2)  'Ici on n'a que le numero de ref sans la lettre afin de la comparer a l'autre fichiers

    If fichier_ss_extension = old_fichier_ss_extension Then  'Si même famille de fichier => On stoque dans le tableau valeurs()
        'ouverture du fichier Excel
        Set workbook_in = Workbooks.Open(repertoire_source & mesfichiers(i), , ReadOnly:=True) 'Ouverture en Readonly
        'On stock dans le tableau
        b = 2
        While workbook_in.ActiveSheet.Cells(b, 2) <> ""  'On parcours depuis la ligne 2
            ReDim Preserve valeurs(compteur_valeur)  'Ajoute un espace memoire au tableau
            valeurs(compteur_valeur) = workbook_in.ActiveSheet.Cells(b, 2)
            compteur_valeur = compteur_valeur + 1
            b = b + 1
        Wend
        workbook_in.Close
        
    Else  'Si pas même famille alors on ferme le fichier fusionné precedemment on on stocke le prochain
        'On ouvre le nouveau fichier fusionné avec le nom ancien....et on sauveagde les données
          
        If i > 0 Then 'Si pas premier passage
            Set workbook_Fusion = Workbooks.Add
            workbook_Fusion.ActiveSheet.Cells(1, 1) = old_fichier_ss_extension  'On copie le nom du fichier dans le cellule A1
             For b = 0 To UBound(valeurs) 'pour toutes les valeurs stoquées dans le tableau
                Cells(b + 2, 2) = valeurs(b)
            Next
            On Error Resume Next
            workbook_Fusion.SaveAs repertoire_det & old_fichier_ss_extension & "_Fusion.xls"
            workbook_Fusion.Close
            'On reinitialise le tableau et le compteur
            ReDim valeurs(0)
            compteur_valeur = 0
        End If
        
 
        'ouverture du fichier Excel
        Set workbook_in = Workbooks.Open(repertoire_source & mesfichiers(i), , ReadOnly:=True) 'Ouverture en Readonly
        'On stock dans le tableau
        b = 2
        While workbook_in.ActiveSheet.Cells(b, 2) <> ""  'On parcours depuis la ligne 2
            ReDim Preserve valeurs(compteur_valeur)  'Ajoute un espace memoire au tableau
            valeurs(compteur_valeur) = workbook_in.ActiveSheet.Cells(b, 2)
            compteur_valeur = compteur_valeur + 1
            b = b + 1
        Wend
        workbook_in.Close
       
    End If
old_fichier_ss_extension = fichier_ss_extension

Next

'On finit le dernier Fichier
'On ouvre le nouveau fichier fusionné avec le nom ancien....et on sauveagde les données
        Set workbook_Fusion = Workbooks.Add
        workbook_Fusion.ActiveSheet.Cells(1, 1) = old_fichier_ss_extension  'On copie le nom du fichier dans le cellule A1
For b = 0 To UBound(valeurs) 'pour toutes les valeurs stoquées dans le tableau
    Cells(b + 2, 2) = valeurs(b)
Next
workbook_Fusion.SaveAs repertoire_det & old_fichier_ss_extension & "_Fusion.xls"
workbook_Fusion.Close

End Sub
 

Nairolf

XLDnaute Accro
Re : Accumulez deux fichier en un seule avec nom qui change

Je viens de tester ton fichier avec ta nouvelle macro.

Essaye en mettant
Code:
    workbook_Fusion.Activate
    Range("B2").Select
    Range(Selection, Selection.End(xlDown)).Select
    With ActiveWorkbook.Worksheets("Feuil1").Sort
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
Avant
Code:
workbook_Fusion.SaveAs repertoire_det & old_fichier_ss_extension & "_Fusion.xls"
workbook_Fusion.Close
 

walyddu59

XLDnaute Nouveau
Re : Accumulez deux fichier en un seule avec nom qui change

Salut ,

Non toujours pas , ca bloque complétement sur la ligne "With ActiveWorkbook.Worksheets("Feuil1").Sort", j'ai essayer avec d'autres methodes mais rien n'y fait je sais pas pourquoi .
 

walyddu59

XLDnaute Nouveau
Re : Accumulez deux fichier en un seule avec nom qui change

Salut ,

Jvien de trouver la solution , sa bloquer au niveaux de la boucle .

voici le code vba :
Columns("B:B").Select
Selection.Sort Key1:=Range("B1"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal


J'aurais voulus savoir si y'avait une possibilite pour distinguez les deux fichier fusionnez par exemple par une couleur .
 
Dernière édition:

Nairolf

XLDnaute Accro
Re : Accumulez deux fichier en un seule avec nom qui change

Le problème est que tu enregistres toutes les valeurs dans un seul vecteur ce qui ne te permets pas d'identifier les valeurs correspondant à un fichier ou à un autre.

Tu pourrais peut-être utiliser une matrice à deux colonnes au lieu d'un vecteur en mettant en première colonne les valeurs des fichiers comme actuellement et en deuxième colonne un numéro de fichier, puis selon la valeurs du numéro de fichier enregistré dans la matrice, faire un "Selection.Interior.Color = 255+mat(b,2)".

PS:Le choix de la couleur est un exemple.
 

Discussions similaires

Statistiques des forums

Discussions
312 779
Messages
2 092 045
Membres
105 164
dernier inscrit
publd2