Copier une ligne d'une feuille d'un fichier et la coller dans une feuille d'un a [Résolu]

Signaler
Messages postés
134
Date d'inscription
samedi 23 septembre 2006
Statut
Membre
Dernière intervention
1 juin 2007
-
Messages postés
134
Date d'inscription
samedi 23 septembre 2006
Statut
Membre
Dernière intervention
1 juin 2007
-
Bonjour à toutes et tous,

Récemment, JMO ( jean-marc) m'a écrit un super code pour traiter, pour standardiser des fichiers xls avnt de les importer en Access2002.
Super code qui marche du tonnerre auquel je voudrais juste ajouter une commande en plus.
Je viens de m'apaercevoir que certains fichiers xls que je reçois, ont des entêtes ( 1er ligne) en anglais ou en français. Hélas, pour l'importation dans Access, c'est toujours en français ou toujours en anglais.

Ma demande :

J'ai créé un classeur en xls qui sera toujours  C:\aa\modèles\feuilles_modèles.xls dans lequel j'ai une feuille "mod1".

Quelqu'un pourrait-il m'écrire le code pour
1- copier la ligne 1 de la feuille"mod1" de mon classeur feuilles_modèles.xls
2- coller cette ligne en ligne 1 dans la feuille "ident" .

Merci d'avance.
JL
********************

Function ShowFolderListmobi(path)
'présentation originale: 1 feuille appelée req...
Dim fso:        Set fso = CreateObject("Scripting.FileSystemObject")
Dim Dossiers:   Set Dossiers = fso.GetFolder(path)
Dim fichiers:   Set fichiers = Dossiers.Files


Dim fichier, f, strListe


For Each fichier In fichiers
   
   DoCmd.Hourglass True
  Set f = fso.GetFile(fichier)
    If fso.GetExtensionName(fichier) = "xls" Then
    
       Dim objExcel, objClasseur
       Set objExcel = CreateObject("Excel.Application")
       Set objClasseur = objExcel.Workbooks.Open(fichier)


       objExcel.DisplayAlerts = False 'enlève l'alerte
       objExcel.Application.Visible = False


      'MsgBox objClasseur.Sheets(1).Name,,"Nom de la Feuil1 avant modification"
      If objClasseur.Sheets(1).Name <> "Référence" Then
      objClasseur.Sheets(2).Name = "ident"
   End If
  
     'Renommer la derniere feuille
      If objExcel.ActiveWorkbook.Sheets(1).Name <> "Référence" Then
         objExcel.ActiveWorkbook.Sheets.Add
         objExcel.ActiveWorkbook.Sheets(objExcel.Sheets.Count - 1).Name = "Référence"
   
     
      End If


      'écriture du nom du fichier dans la 1ère cellule de "Référence"
      objExcel.ActiveWorkbook.Sheets("Référence").Select
      objExcel.Cells(1, 1).Value = fichier
       objExcel.ActiveWorkbook.Sheets("ident").Select


      'suppression des colonnes vides
    Dim LastLine, I
    LastLine = objExcel.ActiveSheet.UsedRange.Row - 1
    LastLine = LastLine + objExcel.ActiveSheet.UsedRange.Columns.Count
    For I = LastLine To 1 Step -1
        If objExcel.Application.WorksheetFunction.CountA(objExcel.Columns(I)) = 0 Then objExcel.Columns(I).Delete
    Next


   
      'Coupe les lignes 1 à 12 de la feuille "ident"
   objExcel.ActiveWorkbook.Sheets("ident").Select
     If objExcel.Cells(1, 1).Value = "User" Then
    
    objExcel.ActiveWorkbook.Worksheets("ident").Rows("1:11").Cut
    'Insert la selection coupé a partir de la ligne 2
    '(la ligne 2 se retrouvera donc APRES la selection insérée
    objExcel.ActiveWorkbook.Worksheets("Référence").Rows("2:2").Insert Shift:=xlDown
    objExcel.ActiveWorkbook.Worksheets("ident").Rows("1:12").Delete



'copier la ligne 1 de ma feuille"modèle1" qui se trouve dans C:\aa\modèles\modèles_feuilles.xls ( sera toujours à cet emplacement)
'coller en ligne 1 de ma feuille "ident" (du classeur actif )    
   
End If
       
      'WScript.Sleep "500"
      'MsgBox objClasseur.Sheets(1).Name,,"Nom de la Feuil1 après modification"


      objExcel.ActiveWorkbook.SaveAs fichier 'sauvegarde sous le même nom
      objExcel.ActiveWorkbook.Saved = True 'sauvegarde true=oui false=non
      'objExcel.DisplayAlerts=True 'remet l'alerte
      'objExcel.Application.Visible=True 'remet la visibilité
      objExcel.ActiveWorkbook.Close 'Fermeture d'Excel


    
      Set objExcel = Nothing
      Set objClasseur = Nothing
   End If
Next
Set f = Nothing
Set fichiers = Nothing
Set Dossiers = Nothing
Set fso = Nothing
DoCmd.Hourglass False
End Function

10 réponses

Messages postés
134
Date d'inscription
samedi 23 septembre 2006
Statut
Membre
Dernière intervention
1 juin 2007

Bonsoir,

en fait dans le code, il y a moyen de forcer le nom des colonnes ( à condition d'être certains de l'ordre de cette-ci.
il suffit de :
objExcel.ActiveWorkbook.Sheets("ident").Select
       objExcel.Cells(1, 1).Value = "nom"
       objExcel.Cells(1, 2).Value = "prénom"
        objExcel.Cells(1, 3).Value = "date"

Merci encore à tous les contributeurs.
JL
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
50
Salut,

'Copie la ligne 1 de la feuille Mod1 du classeur actif
objExcel.ActiveWorkbook.Worksheets("mod1").Rows("1:1").Copy 
'Selectionne la cellule A1 de la feuille ident du classeur actif
objExcel.ActiveWorkbook.Worksheets("ident").Range("A1").Select 
'Colle le contenu
objExcel.ActiveSheet.Paste 
 

<small> Coloration syntaxique automatique [AFCK]</small>
       

@+,   Ju£i?n
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
50
Re,

Je crois que je me suis trompe....
alors on va reprende

Est ce que au moment ou tu veux copier la ligne, le classeurC:\aa\modèles\modèles_feuilles.xls  est ouvert?

@+,   Ju£i?n
Messages postés
797
Date d'inscription
mardi 7 juin 2005
Statut
Membre
Dernière intervention
23 février 2011
5
Effectivement, si tu veux copier une ligne d'un classeur dans un autre, tu es obligé d'ouvrir auparavant le classeur.

Mais vu ton besoin, il y a peut être plus simple à faire : Tu crées une liaison dans ton fichier Excel.

Par ex, tu voulais copier la ligne 1 de la feuille "Mod1" dans la ligne 1 d'une feuille "Ident" de ton 2ème classeur.

Il te suffit de faire une égalité : A:='[NomClasseur]Ident!A1' (c'est un truc comme ça, le plus simple, c'est encore d'ouvrir les 2 classeurs, taper "=" et sélectionner la cellule .

L'avantage, c'est que ta liaison te permet d'avoir le contenu de la ligne sans être obligé de forcer l'ouverture du classeur, puis de le refermer.
Tant que ton fichier cible ne change pas de nom (si tu le remplaces, mais que tu l'écrases avec un fichier portant le même nom), la liaison reste.

Ce n'est qu'une idée, mais vu ce que tu dis, à mon avis ça doit suffire

Molenn
Messages postés
134
Date d'inscription
samedi 23 septembre 2006
Statut
Membre
Dernière intervention
1 juin 2007

Bonjour Julien,

1-Est ce que au moment ou tu veux copier la ligne, le
classeur C:\aa\modèles\modèles_feuilles.xls  est ouvert?    NON

2 - Par ex, tu voulais copier la ligne 1 de la feuille "Mod1" dans la ligne 1 d'une feuille "Ident" de ton 2ème classeur.

Il te suffit de faire une égalité : A:='[NomClasseur]Ident!A1' (c'est un truc comme ça, le plus simple, c'est encore d'ouvrir les 2 classeurs, taper "=" et sélectionner la cellule .

 Et çà, je dois le mettre où dans le code ?
.
A:='[C:\aa\modèles\modèles_feuilles.xls]Ident!A1'

Parce que je ne comprends pas où il va aller lire la ligne 1 de la feuille "modèle1" de C:\aa\modèles\modèles_feuilles.xls ?

Merci d'avance Julien
Bonne soirée
JL
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
50
Salut,

Tiens essaie ceci j'espere que ca t'aidera

Dim ClsOrigin 
objExcel.DisplayAlerts = False 

'Memorise le nom du classeur actif
ClsOrigin = objExcel.ActiveWorkbook.Name 
'Ouvre le classeur ou ce trouve la ligne a copier
'et copie la ligne 1 de la feuille mod1
Call objExcel.Workbooks.Open("C:\B.xls").Worksheets("mod1").Rows("1:1").Copy 
'Rends actif ton classeur d'origine (moi test.xls)
Call objExcel.Workbooks(ClsOrigin).Activate 
'Selectionne la cellule A1 de la feuille ident du classeur actif
Call objExcel.ActiveWorkbook.Worksheets("ident").Range("A1").Select 
'Colle le contenu
Call objExcel.ActiveSheet.Paste 
'Ferme l'autre classeur
Call objExcel.Workbooks("B.xls").Close 
objExcel.DisplayAlerts = True 

 

@+,   Ju£i?n
Messages postés
134
Date d'inscription
samedi 23 septembre 2006
Statut
Membre
Dernière intervention
1 juin 2007

Bonjour Julien,

Merci pour ta réponse que je me suis empressé d'essayer mais il y a un couac .

J'obtiens un message d'erreur
erreur d'exécution 1004
La méthode Select de la classe range a échoué

et la ligne ci dessous est en surbrillance
Call objExcel.ActiveWorkbook.Worksheets("ident").Range("A1").Select 

Peux-tu m'aider,  encore ?
Merci d'avance
JL
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
50
Salut,

Est ce que a ce moment, ActiveWorkBook possede bien une feuille appelé "ident"?

@+,   Ju£i?n
Messages postés
134
Date d'inscription
samedi 23 septembre 2006
Statut
Membre
Dernière intervention
1 juin 2007

Re,

Normalement oui, puisqu'il y a l'instruction
objClasseur.Sheets(2).Name = "ident" en amont.


mais le ActiveWorkBook n'est pas enregistré.
Merci
JL
Messages postés
134
Date d'inscription
samedi 23 septembre 2006
Statut
Membre
Dernière intervention
1 juin 2007

Bonjour Julien,

Je suis toujours avec mon problème de titres de colonnes.
Suggestion, plutôt que d'essayer de  copier la ligne 1 de la feuille modèle pour la coller dans la feuille active(ident), n'y aurait-il pas moyen de forcer le nom des colonnes de ma feuille active sans modifier le format des colonnes ( date / texte etc..)
colonne 1 = date
colone  2 = numero
colonne 3 = nom
colonne 4 = adresse

Mais comment écrire tout çà ?
Encore merci pour ton aide précieuse.
Jl