Aide VB Excel copie de lignes entre fichiers [Résolu]

Messages postés
12
Date d'inscription
jeudi 21 décembre 2006
Statut
Membre
Dernière intervention
26 janvier 2007
- - Dernière réponse : cs_orangeroad
Messages postés
12
Date d'inscription
jeudi 21 décembre 2006
Statut
Membre
Dernière intervention
26 janvier 2007
- 5 janv. 2007 à 06:38
Bonjour à tous,



<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
 




Je débute avec l’utilisation de VB sous Excel et j’ai besoin de votre aide.



 




Je dois créer un fichier Excel qui doit remonter à l’aide d’une macro toutes les lignes de la première feuille de n autres fichiers Excel.



 




Pour expliquer la situation, des personnes renseignent en fin de journée leur propre fichier et le chef d’équipe doit en lançant la macro de son fichier récupérer toutes les entrées des fichiers des agents.



 




Bien sûr toutes les feuilles des fichiers ont une mise en forme identique.



 




J’ai trouvé ce script qui fonctionne très bien pour copier toutes les lignes d’une feuille à un autre feuille d’un même classeur :



 





 





Sub test()






 






Dim F_S As Worksheet 'Feuille source





Dim F_D As Worksheet 'Feuille Destination





Dim Lig_S As Long 'Ligne source





Dim Lig_D As Long 'Ligne destination






 






'MEI **********************************************





'Définition des feuilles




Set F_S Sheets("Feuil1") 'feuille source onglet(Rex)


Set F_D Sheets("Feuil2") 'feuille destination onglet(perimee)



 




'définition des lignes



Lig_D = F_D.Range("A65536").End(xlUp).Row + 1





'Ligne destination est la première de G vide






 






'Programme *****************************************







    For Lig_S = F_S.Range("A65536").End(xlUp).Row To 1 Step -1






   

'Pour Ligne source = dernière non vide en A jusqu'à la ligne 1




    'en passant à la ligne précédente par décrémentation (-1)






        'Quand la valeur est inférieure à 1, on passe à laligne suivant Next Lig_S





       






                   
F_S.Rows(Lig_S).Copy Destination:=F_D.Rows(Lig_D)






                   

'on copie la ligne source sur la ligne destination





                    Lig_D = Lig_D + 1



                   
'on passe à la ligne destination suivante






                   








   

 Next Lig_S



   
'Retour à l'instruction For Lig_S....




MsgBox ("Fin de transfert")




End Sub

J’aimerai savoir s’il est possible de le modifier pour qu’il copie toutes les lignes d’une feuille d’un autre fichier vers la feuille du fichier principal.
Qu'il fasse la même chose, mais qu'il aille récupérer les lignes sources dans un autre fichier.



 




Imaginons qu’il y ait 4 fichiers d’agent, peut-on faire 4 boucles à la suite pour aller chercher les lignes dans chaque fichier ?





Le but de cette organisation est que chaque agent ne puisse accéder et modifier que son fichier, ce qui est facile à mettre en place.
Et que le chef d'équipe en ouvrant son fichier puisse voir toutes les lignes saisies.
 






Merci d'avance de l'aide que vous pourrez m'apporter.
Afficher la suite 

5 réponses

Meilleure réponse
Messages postés
7401
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
45
3
Merci
SAlut,
N'importe quelle feuille peu etre atteinte avec une syntaxe du style.

Dim ClasseurPrincipal As Workbook 
Dim NomClasseur As Workbook 
'Memorise le classeur du chef d'équipe
Set ClasseurPrincipal = ActiveWorkbook 
'OUvre le classeur d'un aute
Set NomClasseur = Application.Workbooks.Open("C:\B.Xls") 
'Devrait Copier tout les cellule de la feuille 1
NomClasseur.Worksheets(1).Cells.Copy 

@+: Ju£i?n
Pensez: Réponse acceptée

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 212 internautes nous ont dit merci ce mois-ci

Commenter la réponse de jrivet
Messages postés
12
Date d'inscription
jeudi 21 décembre 2006
Statut
Membre
Dernière intervention
26 janvier 2007
0
Merci
Merci pour ta réponse. ;-)

Mais je ne vois pas très bien où insérer dans mon code.
La méthode pour coller les lignes est différente et si j'ouvre le classeur "source" pour y copier des lignes, il faudra que je réouvre ensuite le classeur d'origine pour les copier, non ?

Car sur ce code F_S et F_D sont dans le même classeur, ce qui ne sera pas le cas dans ce que je veux faire.
Commenter la réponse de cs_orangeroad
Messages postés
12
Date d'inscription
jeudi 21 décembre 2006
Statut
Membre
Dernière intervention
26 janvier 2007
0
Merci
Jrivet,

En fait ton code utilisé seul permet effectivement de copier toutes les cellules d'un autre classeur.
Mais il ne fait tout copier en bloc, ce qui marche quand il s'agit de faire une copie d'un fichier à un autre, mais pas quand il s'agit de copier plusieurs classeurs.

Le code que j'ai posté vérifie s'il y a des lignes présentes et commence à le première ligne vide.
Comme il y a plusieurs copies à faire, je veux que les lignes copiées se rajoutent à la suite de cellles déjà présentes, ce que fait mon code.

Par contre je ne sais pas comment le modifier pour qu'il aille copier les lignes dans un fichier différent et revenir ensuite au principal.

Je débute en VB alors ce n'est pas facile de tout comprendre.
Commenter la réponse de cs_orangeroad
Messages postés
12
Date d'inscription
jeudi 21 décembre 2006
Statut
Membre
Dernière intervention
26 janvier 2007
0
Merci
Bon après avoir réfléchi, si j'a bien compris :


Set F_S = Sheets("Feuil1") 'feuille source
Il faudrait que F_S désigne la première feuille d'un des classeur source.


Set F_D = Sheets("Feuil2") 'feuille destination
Il faudrait que F_D désigne une feuille du classeur actif.

Donc comment utiliser la commande Set pour qu'il désigne une feuille d'un classeur donné ?

Merci.
Commenter la réponse de cs_orangeroad
Messages postés
12
Date d'inscription
jeudi 21 décembre 2006
Statut
Membre
Dernière intervention
26 janvier 2007
0
Merci
Jrivet,

Merci beaucoup de ton aide j'ai réussi à utiliser ton code !

C'était plus simple que je ne le pensais finalement.

Sub test()


Dim F_S As Worksheet 'Feuille source
Dim F_D As Worksheet 'Feuille Destination
Dim Lig_S As Long 'Ligne source
Dim Lig_D As Long 'Ligne destination


Dim ClasseurPrincipal As Workbook
Dim NomClasseur As Workbook



'Memorise le classeur du chef d'équipe
Set ClasseurPrincipal = ActiveWorkbook
'Ouvre le premier classeur source
Set NomClasseur = Application.Workbooks.Open("C:\source1.xls")


 



'MEI **********************************************
'Définition des feuilles

Set F_D = ClasseurPrincipal.Sheets("Feuil1") 'feuille destination, c'est à dire la Feuil1 du classeur ouvert
Set F_S = NomClasseur.Sheets("Feuil1")  'feuille source, c'est à dire la Feuil1 du classeur "source1.xls"





'définition des lignes
Lig_D = F_D.Range("A65536").End(xlUp).Row + 1
'Ligne destination est la première de G vide



'Programme *****************************************

    For Lig_S = F_S.Range("A65536").End(xlUp).Row To 4 Step -1
    'Pour Ligne source = dernière non vide en A jusqu'à la ligne 4
    'en passant à la ligne précédente par décrémentation (-1)
        'Quand la valeur est inférieure à 1, on passe à laligne suivant Next Lig_S
       
                    F_S.Rows(Lig_S).Copy Destination:=F_D.Rows(Lig_D)
                    'on copie la ligne source sur la ligne destination
                    Lig_D = Lig_D + 1
                    'on passe à la ligne destination suivante
                   
               
       
    Next Lig_S
    'Retour à l'instruction For Lig_S...
   
NomClasseur.Close
'On ferme le classeur "source1.xls" sinon il reste ouvert


    
 
'On répète l'opération pour le deuxième classseur source.  


Set NomClasseur = Application.Workbooks.Open("C:\source2.xls")



'Définition des feuilles
Set F_D = ClasseurPrincipal.Sheets("Feuil1") 'feuille destination
Set F_S = NomClasseur.Sheets("Feuil1")  'feuille source





'définition des lignes
Lig_D = F_D.Range("A65536").End(xlUp).Row + 1
'Ligne destination est la première de G vide



'Programme *****************************************

    For Lig_S = F_S.Range("A65536").End(xlUp).Row To 4 Step -1
    'Pour Ligne source = dernière non vide en A jusqu'à la ligne 4
    'en passant à la ligne précédente par décrémentation (-1)
        'Quand la valeur est inférieure à 1, on passe à laligne suivantNext Lig_S
       
                    F_S.Rows(Lig_S).Copy Destination:=F_D.Rows(Lig_D)
                    'on copie la ligne source sur la ligne destination
                    Lig_D = Lig_D + 1
                    'on passe à la ligne destination suivante
                   
               
       
    Next Lig_S
    'Retour à l'instruction For Lig_S....
   
NomClasseur.Close
'On ferme le classeur "source1.xls" sinon il reste ouvert
    
    
MsgBox ("Fin de transfert")
'on avertit que c'est fini


End Sub

Voilà , on peut rajouter autant de boucle qu'il y a de classeurs source.
Et le classeur principal contient toute les lignes des classeurs source comme je voulais.
Commenter la réponse de cs_orangeroad