Copier une ligne entre 2 tableaux excel

Résolu
azertym Messages postés 47 Date d'inscription vendredi 8 août 2003 Statut Membre Dernière intervention 7 décembre 2014 - 27 févr. 2012 à 15:21
azertym Messages postés 47 Date d'inscription vendredi 8 août 2003 Statut Membre Dernière intervention 7 décembre 2014 - 1 mars 2012 à 09:29
Bonjour à tous.

Je rencontre 2 petits soucis et j'aimerai avoir un peu d'aide.

Je vais déjà commencer par vous expliquer le fonctionnement du projet.

Premièrement un fichier excel est généré par pro_eng au format txt.1
Ensuite il y'a 2 fichiers excel : code.xls et base.xls
Code.xls exécute une macro qui met en forme le fichier texte dans excel. Voici le code :
Function Import_Code_Temp()

Dim Fich As Worksheet
Dim Tbl
Dim Variables
Dim Ligne As String
Dim I As Integer
Dim J As Integer
Dim FichierTemp As String
 
    Set Fich = ThisWorkbook.Worksheets("Feuil1")
 
    'entêtes de colonnes
   Variables = Array("", _
                    "A créer", _
                    "Code_JDE", _
                    "Format", _
                    "Indice", _
                    "Description", _
                    "Date", _
                    "Dessinateur")
 
    Fich.Cells.ClearContents
   
    For I = 0 To UBound(Variables)
      Fich.Cells(1, I + 1) = Variables(I)
    Next I
 
    'chemin du fichier texte à lire
   FichierTemp = "C:\ptc_config\config_perso_wf2\code_temp\code_temp.txt.1"
 
    'commence à la seconde ligne pour éviter les entêtes
   J = 2
 
    'ouverture pour lecture
   Open FichierTemp For Input As #1
 
    I = 3     ' On commence à la colonne 1

    'boucle sur toutes les lignes
   Do While Not EOF(1)
 
        'lecture de la ligne
       Line Input #1, Ligne
 
        'si pas vide
       If Ligne <> "" Then
       
            'splite dans un tableau, attention, le séparateur doit être adapté !
           Tbl = Split(Ligne, ":")
 
            'inscrit la valeur en fonction de l'entête de la colonne
           Fich.Cells(J, I) = Tbl(UBound(Tbl))
           
            ' colonne suivante
           I = I + 1
        End If
 
    Loop
 
    'ferme le fichier
   Close #1
 
    'vide le tableau
   Erase Tbl
 
    
Call KillProcessus("C:\WINDOWS\SYSTEM32\CMD.EXE") 'Module 2
Call Ajout_Base 'Module 3

End Function



A la fin de cette macro, il ouvre le fichier excel base.xls pour y copier la ligne qu'il vient de formater avec ce code ci :
Function Ajout_Base()
 
'=============================================================================
'Declaration des variables
'=============================================================================
Dim appExcel As Excel.Application 'Application Excel
Dim wbExcel As Excel.Workbook 'Classeur Excel
Dim wsExcel As Excel.Worksheet 'Feuille Excel
 
'=============================================================================
'Ajout de la ligne dans Base.xls
'=============================================================================
 
'Ouverture de l'application
Set appExcel = CreateObject("Excel.Application")
'Ouverture d'un fichier Excel
Set wbExcel = appExcel.Workbooks.Open("C:\ptc_config\config_perso_wf2\code_xls\base.xls")
'wsExcel correspond à la première feuille du fichier
Set wsExcel = wbExcel.Worksheets(1)
'copier la ligne 2 sur fichier code.xls
Workbooks("code.xls").Activate
'selectionne la ligne 2
Range("A2:H2").Copy
'Activation du classeur base.xls
Workbooks("base.xls").Activate
'Insertion d'une ligne à la ligne 1
Rows("2:2").Select
    Selection.Insert Shift:=xlDown
Range("A2:H2").EntireRow.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone

End Function


Le problème c'est que dans le fichier base.xls il me copie a l'infini la selection sur la deuxième ligne. Alors que si la sélection se trouve entre : A2:F2 il ne copie qu'une seule fois.

L'autre soucis, c'est que je suis obligé de lancer 2 fois le code.xls pour qu'il puisse ouvrir le base.xls

Voici les chemins des différents fichiers :
Pour le fichier texte :
C:\ptc_config\config_perso_wf2\code_temp\

Pour les fichiers excel :
C:\ptc_config\config_perso_wf2\code_xls\

Merci d'avance.

P.S: Je vous aurez bien mis mes fichiers en pièce jointe mais je ne sais pas si je peux utiliser des hébergeurs de fichiers ici, si ?

13 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 févr. 2012 à 11:16
Worbooks("toto").worksheets("titi").range("B2:C20").copy destination:= Workbooks("blabla").worksheets("wow").range("F1")



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 févr. 2012 à 10:19
Peux tu me dire s'il te plaît pourquoi les ".select" ".selection" etc sont à éviter ? Une raison pratique ? Esthétique ? Ou pire, ils génèrent un problème au niveau du code ?

- Plusieurs raisons : entre autres :
--- procédant par "tremplins", ils sont alourdissants et retardent.
--- ils transforment ton écran en arbre de Noël (avec des déplacements inutiles, d'une feuille à l'autre, d'une cellule à l'autre, voire d'un classeur à l'autre)
--- ils obligent à constamment rester sur ses gardes. La moindre erreur peut générer une petite catastrophe
--- ils rendent la maintenance souvent difficile (lisibilité ardue)
Autant de misères auxquelles ont échappe, pour une plus grande lisibilité du code en prime, en pointant directement sur les objets et en jouant directement avec eux.

Ces lourdauds apparaissent inévitablement lorsque l'on se sert de l'enregistreur de macros qui, lui, enregistre tout, y compris les gestes physiques de l'utilisateur. Le code qui en résulte ne doit jamais être utilisé que pour en retirer la "moelle" intéressante. Il convient de l'épurer de tout ce qui entoure cette "moelle"
Quant aux exemples quelquefois donnés et utilisant ces méthodes, ils ne sont en général ainsi "rédigés" que pour faciliter la compréhension d'un mécanisme.

Voilà ! tu sais l'essentiel.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
3
azertym Messages postés 47 Date d'inscription vendredi 8 août 2003 Statut Membre Dernière intervention 7 décembre 2014
27 févr. 2012 à 15:25
Bon n'ayant pas vu de points concernant les fichiers hébergé dans le règlement je me permets de les poster.
http://www.fufox.net/?d=1BA36BC42C9D
Si je n'ai pas le droit n’hésitez pas à supprimer ce post.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
27 févr. 2012 à 17:02
Il est bien que tu t'intéresses au règlement.
Il serait tout aussi bien que tu veilles (ce que tu n'as pas fait ici) au choix de la section dans laquelle tu ouvres une discussion. Tu ne développes pas sous VB6, mais sous VBA !
Quant à ton "problème" : il est là (et il hurle) :
Rows("2:2").Select
Selection.Insert Shift:=xlDown
Range("A2:H2").EntireRow.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone

si tu ne l'entends pas hurler et n'entends pas ce qu'il hurle, c'est que tu ignores totalement la portée de ce que tu écrit.
Et je vois qu'en plus, tu t'obstines avec tes select et cie... (je t'en avais pourtant parlé déjà).
Tu ne me donnes dans ces conditions pas vraiment envie de me "décarcasser" et me contente de ce que je t'ai signalé plus haut entre balises code.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
azertym Messages postés 47 Date d'inscription vendredi 8 août 2003 Statut Membre Dernière intervention 7 décembre 2014
28 févr. 2012 à 09:35
Excuse moi pour la section, c'est vrai je me suis trompé. Concernant la ligne. Figure toi que le entirerow et compagnie qu'ils soient là ou non ne change rien.

Je voudrais juste comprendre pourquoi ce code fonctionne quand je met par exemple A2:F2, A2:G2, et dès que je met A2:H2 il me répète en boucle la copie. C'est quand même étrange ça non ? C'est là que je ne comprends pas et je te l'avoue.

Par contre je ne ne me rappelle pas que tu m'as déjà avertis sur les selection... Sur les sendkeys oui ca je m'en rappelle bien mais pas pour le reste.

Bon, en tout cas je te remercie quand même et excusez moi pour m'être trompé de section...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 févr. 2012 à 10:34
C'est vrai. Ce n'est pas toi que j'ai prévenu plusieurs fois de ce que travailler ainsi était une habitude néfaste.
Mais il est vrai que c'est là un point sur lequel on ne cesse d'insister :
Reprends tout ton code suivant :
Pour mémoire :

Set appExcel = CreateObject("Excel.Application")

Set wbExcel = appExcel.Workbooks.Open("C:\ptc_config\config_perso_wf2\code_xls\base.xls")
'wsExcel correspond à la première feuille du fichier
Set wsExcel = wbExcel.Worksheets(1)
'copier la ligne 2 sur fichier code.xls
Workbooks("code.xls").Activate

'selectionne la ligne 2 '<<<<<<< la ligne 2 de quelle feuille, penses-tu ? elle est à préciser
Range("A2:H2").Copy '
'Activation du classeur base.xls
Workbooks("base.xls").Activate
'Insertion d'une ligne à la ligne 1
Rows("2:2").Select ' <<<<<<<< sur quelle feuille ^penses-tu être ainsi ? A préciser
Selection.Insert Shift:=xlDown
Range("A2:H2").EntireRow.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone


Explique en langage naturel et sans en exposer les raisons (juste les tenants et aboutissants) ce que tu veux faire exactement.
Et tu verras comme nul n'a besoin de ces faux amis Activate, Select, Copy, Paste ...
Et à quoi te servent des objets ( wbExcel et wsExcel) quie tu n'utilises pas
Et quel est le nom (au lieu d'en utiliser l'index ... risqué) de la feuille wbExcel.Worksheets(1) ?
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
28 févr. 2012 à 10:40
Sujet déplacé ...

en ce qui concerne le lien tant qu'il ne contient pas de pub ou autre contenu illégale il n'y a pas de soucis. Le lien que tu donnes mène à une archive qui contient les fichiers liés au code qui te pose problème.


[hr]@+Cirec
[hr]
0
azertym Messages postés 47 Date d'inscription vendredi 8 août 2003 Statut Membre Dernière intervention 7 décembre 2014
28 févr. 2012 à 11:08
Pour répondre a tes questions Ucfoutu. J'ai juste suivis cette explication ci : http://drq.developpez.com/vb/tutoriels/Excel/Chapitre2/

Je suis entrain de regarder ce que tu m'a expliqué et je comprends mieux le problème. Je raisonne mal dans la programmation, pour moi comme une feuille est activée, il suffit juste de sélectionner la plage de cellule, d'activer l'autre feuille, et de coller. Alors qu'en fait en une ligne on peu réaliser cette fonction.

En gros :
du claseur (source). de la feuille(feuillesource). tu sélectionnes la plage(de a de). et tu copies

Du classeur (destination).de la feuille(feuilledestination). tu sélectionnes la plage (de a de). et tu colles

Je vais voir comment je peux donc écrire ca. En tout cas j'ai fais du nettoyage au niveau des déclarations de variables ce qui fait que je n'ai plus de bug au lancement déjà.

Je continue à essayer et je te tiens au courant.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 févr. 2012 à 11:15
Worbooks("toto").worksheets("titi").range("B2:C20").copy destination:= workbooks("blabla").worksheets("wow").range("F1")

Il n'y a ici ni select, ni activate, ni paste, etc ...
colle bien évidemment, à partir de la cellule F1 de la feuille wow du classeur blabla le contenu de la plage B2:C
de la feuille titi du classeur toto.

Dur dur ?
et si des objets ont été affectés, utilise-les donc en lieu et place des choses vers lesquelles ils pointent !
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
azertym Messages postés 47 Date d'inscription vendredi 8 août 2003 Statut Membre Dernière intervention 7 décembre 2014
28 févr. 2012 à 13:54
J'en demandais pas temps Ucfoutu, c'est bien gentil en tout cas.
Tout fonctionne parfaitement, j'ai donc ce code la au final :
Option Explicit
Function Ajout_Base()

'Ouverture du classeur base.xls
Workbooks.Open Filename:= _
"C:\ptc_config\config_perso_wf2\code_xls\base.xls"

'Insertion d'une nouvelle ligne
Rows("2:2").Select
    Selection.Insert Shift:=xlDown
    
'copie de la ligne 2 du classeur code.xls vers base.xls
Workbooks("code.xls").Worksheets("Feuil1").Range("A2:H2").Copy Destination:=Workbooks("base.xls").Worksheets("Feuil1").Range("A2")

End Function


Je suis entrain de chercher une solution un peu plus approprié pour l'insertion de la nouvelle ligne. Cependant ce code ci fonctionne très bien.
J'aimerai bien réussir à avoir la logique vba mais y'a toujours 2-3 qui me dérangent à chaque fois :\ ce qui fait que je m'embrouille assez vite.

En tout cas merci à toi encore une fois et excuse moi de t'avoir fais répété.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 févr. 2012 à 17:59
Alors fais-moi plaisir :
Corrige donc également cela (sans ce select lourdaud et à éviter) :
Rows("2:2").Select
    Selection.Insert Shift:=xlDown



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
azertym Messages postés 47 Date d'inscription vendredi 8 août 2003 Statut Membre Dernière intervention 7 décembre 2014
29 févr. 2012 à 09:49
Et voilà
Option Explicit
Function Ajout_Base()

'Ouverture du classeur base.xls
Workbooks.Open Filename:= _
"C:\ptc_config\config_perso_wf2\code_xls\base.xls"

'Insertion d'une nouvelle ligne
Workbooks("base.xls").Worksheets("Feuil1").Rows("3:3").Insert Shift:=xlDown
    
'copie de la ligne 2 du classeur code.xls vers base.xls
Workbooks("code.xls").Worksheets("Feuil1").Range("A2:H2").Copy Destination:=Workbooks("base.xls").Worksheets("Feuil1").Range("A3")

End Function


Peux tu me dire s'il te plaît pourquoi les ".select" ".selection" etc sont à éviter ? Une raison pratique ? Esthétique ? Ou pire, ils génèrent un problème au niveau du code ?
Parce que beaucoup d'exercices ou explications se servent de ces codes ci. C'est un peu dommage que ce n'est pas clairement dit à la base des exemples ou exercice.
0
azertym Messages postés 47 Date d'inscription vendredi 8 août 2003 Statut Membre Dernière intervention 7 décembre 2014
1 mars 2012 à 09:29
En effet, c'est même que des contraintes à utiliser ces "lourdaux" après avoir lu ton explication . Et apparemment ce n'est pas la seule chose à savoir en VB.

En tout cas je te remercie bien pour tes aides et ton explication. Ca me permet d'apprendre beaucoup de choses et surtout de progresser ! ;)
0
Rejoignez-nous