IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

copier des informations d'un fichier xls dans un autre fichier xls


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 56
    Points : 38
    Points
    38
    Par défaut copier des informations d'un fichier xls dans un autre fichier xls
    Bonjour à tous,

    Je suis en train de bricoler une macro (je dis bricoler car ca fait presque 2 ans que je n'ai pas fait une macro excel, alors en ce moment Google est mon ami) qui a pour but de récupérer des emails contenu d'un fichier A et de les coller dans une feuille d'un fichier B (celui qui lance la macro) puis après faire un traitement avec ces infos.

    par de restriction particulière, le fichier A contient une liste d'emails présente dans la première colonne de la première feuille. Et cela doit être copier dans la première colonne de la feuille nommé "Tools" du fichier B. Dans tous les cas je ne sait pas combien d'Emails sont traités, ca peut être 25 comme 3500.

    J'ai donc fait une procédure lancé par un bouton sur ma feuille "Tools"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    Sub MiseAJourEmail()
     
    Dim xlApp As New Excel.Application
    Dim xlBookDist As New Excel.Workbook
    Dim xlBookLocal As Excel.Workbook
    Dim xlSheetDist As New Excel.Worksheet
    Dim xlSheetLocal As Excel.Worksheet
    Dim fichier As Variant 'conteneur du chemin d'accès au fichier cible
    Dim taille As Integer
     
    'recherche du fichier cible
    fichier = Application.GetOpenFilename("Classeurs Excel,*.xls")
    If fichier = False Then Exit Sub
     
    'Instanciation du fichier cible
    Set xlBookDist = xlApp.Workbooks.Open(fichier) ' on match l'instance d'Excel ouverte avec le fichier de blacklist avec une variable
    Set xlSheetDist = xlBookDist.Worksheets(1)  ' on match la première feuille du tableau avec une variable
    Set xlBookLocal = ThisWorkbook
    Set xlSheetLocal = ThisWorkbook.Worksheets("Tools")
    taille = xlSheetDist.Cells.SpecialCells(xlCellTypeLastCell).Row
     
    'Nettoyage des informations contenues dans la feuille "Tools"
    xlSheetLocal.Columns.Clear
     
    'copie des infos
    xlSheetDist.Range("A1", "A" & taille).Copy
    With xlSheetLocal
    .Range("A1").PasteSpecial Paste:=xlPasteValues
    End With
    Application.CutCopyMode = False
     
    'process
    Dim nb As Integer
    nb = 0
    For Each ligne In xlSheetLocal.Range("A1", "A" & taille)
        nb = nb + 1
    Next
     
    'infos
    MsgBox (nb)
     
    'fermeture du fichier xls cible
    xlBookDist.Close
    xlApp.Quit
    End Sub
    problèmes :
    - à chaque fois que je la lance, lorsque je fais l'opération xlBookDist.Close j'ai un message du type "le presse papier une grande quantité d'information" bla bla bla OUI/NON/annuler. Très embêttant.
    - lors de la copie des informations, je n'arrive pas à faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    'copie des infos
    xlSheetDist.Range("A1", "A" & taille).Copy Destination:=xlSheetLocal.Range("A1", "A" & taille)
    Mais je ne sais pas du tout pourquoi, je veux juste copier une colonne , d'un fichier dans un autre ...

    à j'oubliais, j'ai essayer avec Application.DisplayAlerts = False, idem.

    n'hésitez pas à modifier le code, je suis pas un super développeur Excel, loin de là.

    help help

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 388
    Points : 437
    Points
    437
    Par défaut
    Pour éviter le message "le presse papier une grande quantité d'information" essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.CutCopyMode = False
    pas certain mais je pense que ça devrait aller

    JP

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 134
    Points : 129
    Points
    129
    Par défaut
    Sinon méthode alternative ADODB, propre, pas besoin d'ouvrir les deux classeurs en même temps, ça va chercher dans ta colonne de ta feuille spécifiée, et le retourne dans ta colonne A :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Function ExtractionValeurCellulesClasseurFerme(Fichier As String, Feuille As String, Cellules As String)
     
         Dim Source As ADODB.Connection
         Dim Donnees As Variant
         Dim Rst As ADODB.Recordset
     
         Set Source = New ADODB.Connection
     
         With Source
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
             & Fichier & ";Extended Properties=""Excel 12.0;HDR=YES;"""
            .Open
         End With
     
         Donnees = "SELECT * FROM [" & Feuille & "$" & Cellules & "]"
     
         Set Rst = New ADODB.Recordset
         Set Rst = Source.Execute(Donnees)
     
         Feuil4.Range("A1").CopyFromRecordset Rst
     
         Source.Close
         Set Source = Nothing
     
    End Function
    P.S. : Ici Feuil4 = feuille Tools
    Au taf : Quad Core/8Go de RAM sous Win Seven 64 - Matlab 2009b 64bit.
    Perso : Core 2 Duo/8Go de RAM Mac OS X 10.6 - Matlab 2009b 64bit

  4. #4
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 56
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par JPierreM Voir le message
    Pour éviter le message "le presse papier une grande quantité d'information" essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.CutCopyMode = False
    pas certain mais je pense que ça devrait aller

    JP
    regarde c'est deja dans mon code

    Citation Envoyé par HAL-9000 Voir le message
    Sinon méthode alternative ADODB, propre, pas besoin d'ouvrir les deux classeurs en même temps, ça va chercher dans ta colonne de ta feuille spécifiée, et le retourne dans ta colonne A :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Function ExtractionValeurCellulesClasseurFerme(Fichier As String, Feuille As String, Cellules As String)
     
         Dim Source As ADODB.Connection
         Dim Donnees As Variant
         Dim Rst As ADODB.Recordset
     
         Set Source = New ADODB.Connection
     
         With Source
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
             & Fichier & ";Extended Properties=""Excel 12.0;HDR=YES;"""
            .Open
         End With
     
         Donnees = "SELECT * FROM [" & Feuille & "$" & Cellules & "]"
     
         Set Rst = New ADODB.Recordset
         Set Rst = Source.Execute(Donnees)
     
         Feuil4.Range("A1").CopyFromRecordset Rst
     
         Source.Close
         Set Source = Nothing
     
    End Function
    P.S. : Ici Feuil4 = feuille Tools
    et je met quoi en paramètre d'entré pour feuille et cellule ?

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 134
    Points : 129
    Points
    129
    Par défaut
    Citation Envoyé par ironfalcon Voir le message
    et je met quoi en paramètre d'entré pour feuille et cellule ?
    Par exemple si tes données a recupérer sont dans la colonne A :
    Donnes = ExtractionValeurCellulesClasseurFerme("C:\Documents and Settings\...\Mon_classeur_qui_contient_les_données_mails.xlsx", "Nom_de_la feuille", "A1:A50000")
    Au taf : Quad Core/8Go de RAM sous Win Seven 64 - Matlab 2009b 64bit.
    Perso : Core 2 Duo/8Go de RAM Mac OS X 10.6 - Matlab 2009b 64bit

  6. #6
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 56
    Points : 38
    Points
    38
    Par défaut
    et si le nom de la feuille est aléatoire, mais que dans tout les cas il faut prendre uniquement la première feuille ?

    et j'ai un problème Excel m'envoi boulet avec la déclaration d'un objet de type ADODB.Connection

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 57
    Points : 41
    Points
    41
    Par défaut
    et j'ai un problème Excel m'envoi boulet avec la déclaration d'un objet de type ADODB.Connection
    ll fait que tu installes la reference Microsoft ActiveX data Object 2.8

    Ensuite, il faut que par le code tu analyse la structure de la "base" pour trouver le nom qui t'intéresse. Solution alternative, la feuille 1 doit toujours avoir le même nom ("Feuille1" par exemple).

    A l'ouverture de ton classeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets(1).name="Feuille1"
    Tu peux alors récupérer les données avec une requette universelle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Donnees = "SELECT * FROM [Feuille1$]" *
    et la suite du code de HAL-9000

  8. #8
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 56
    Points : 38
    Points
    38
    Par défaut
    dans tous les cas je doit spécifier un nom de feuille ? car dans certains cas ce nom change, mais je ne doit pas y faire attention.

    et Question fondamentale :
    - La je l'utilise sur Excel 2007 c'est super, mais quand je l'utilise sur excel 2003 -> Bim

    Comment avoir un code ADODB compatible a la fois pour 2007 et 2003 ?

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 134
    Points : 129
    Points
    129
    Par défaut
    Pour Excel 2003 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Function ExtractionValeurCellulesClasseurFerme(Fichier As String, Feuille As String, Cellules As String)
     
    Dim Source As ADODB.Connection
    Dim Rst As ADODB.Recordset
    Dim ADOCommand As ADODB.Command
    Set Source = New ADODB.Connection
     
    Source.Open "Provider = Microsoft.Jet.OLEDB.4.0 ;" & "Data Source = " & Fichier & " ; Extended Properties = "" Excel 8.0 ; HDR = No ;"" ;"
     
    Set ADOCommand = New ADODB.Command
     
    With ADOCommand
    .ActiveConnection = Source
    .CommandText = "SELECT * FROM [" & Feuille & "$" & Cellules & "]"
    End With
     
    Set Rst = New ADODB.Recordset
    Rst.Open ADOCommand, , adOpenKeyset, adLockOptimistic
     
    Set Rst = Source.Execute("[" & Feuille & "$" & Cellules & "]")
    Feuil4.Range("A1").CopyFromRecordset Rst
     
    Rst.Close
    Source.Close
    Set Source = Nothing
    Set Rst = Nothing
    Set ADOCommand = Nothing
     
    End Function
    Maintenant tu inserts tes 2 codes et execute l'un ou l'autre en fonction de la version Excel détectée
    Au taf : Quad Core/8Go de RAM sous Win Seven 64 - Matlab 2009b 64bit.
    Perso : Core 2 Duo/8Go de RAM Mac OS X 10.6 - Matlab 2009b 64bit

  10. #10
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 56
    Points : 38
    Points
    38
    Par défaut
    Merci beaucoup, en fouillant sur le net, je suis arrivé au même résultat, ton message confirme mon choix ^^

    Sinon il n'y a vraiment aucun moyen de définir une feuille par défaut ? genre toujours la première, peu importe le nom de la feuille ?

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 57
    Points : 41
    Points
    41
    Par défaut
    Si la feuille est toujours la feuille 1, tu peux écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dim NomFeuille$
    nomfeuille=activeworkbook.sheets(1).name
    si la feuille est toujours la feuille active:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nomfeuille=activeworkbook.activesheet.name
    puis pour la requette:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xsql= "Select * from [" & NomFeuille & "$]"
    etc....

  12. #12
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 56
    Points : 38
    Points
    38
    Par défaut
    le problème c'est que cela reprendra le nom de la feuille du fichier qui appel la macro pas le fichier cible. :/

  13. #13
    Membre chevronné Avatar de rvtoulon
    Homme Profil pro
    Agent Technique
    Inscrit en
    Mars 2009
    Messages
    1 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Agent Technique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 042
    Points : 2 003
    Points
    2 003
    Par défaut
    Bjr , à tous
    je m'excuse d'arriver comme çà dans la discution mais pour reprendre ton code d'origine un peu épuré est-ce que celui-ci ne ferait pas l'affaire :
    Dans un module du classeur qui doit recevoir les données copiées:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Sub copie()
     
    Dim wbdest As Workbook, wsdest As Worksheet
    Dim derlign As Long
     
    Application.ScreenUpdating = False 
     
    'Wbsource=classeur qui contient les données que je veux copier
    Set wbsource = Workbooks.Open("C:\Documents and Settings\Nom utilisateur\Bureau\ton fichier.xls")
    Set wssource = wbsource.Worksheets(1) 'Feuil1 du classeur source
     
    'ici workbooks (1) = classeurdest = classeur qui contient la macro
    derlign = wssource.Range("A65536").End(xlUp).Row
    Workbooks(1).Sheets(1).Range("A1" & ":A" & derlign).Value = wssource.Range("A1" & ":A" & derlign).Value
     
    'ici tu fermes le classeur source sans enregistrer
    wbsource.Close dontsave = True 'False pour enregistrer les changements
     
    Application.ScreenUpdating = True
    End Sub
    Ici on ouvre le classeur qui contient les données que l'on veut copiées si j'ai compris "feuil1, colonne A nbre de lignes indéterminées" et on attribue la valeur de cette plage dans classeur dest " feuil1 à partir de A1", ensuite on referme le classeur source sans enregistrer.
    @+

    EDIT: L'avantage de ce code c'est qu'il n'y as pas de copier coller donc pas de problème de presse papier
    @+

    Si vous avez trouvé la solution à votre problème n'oubliez pas d'appuyer sur
    Et n'oubliez pas de voter en appuyant sur si ce message a repondu à vos attentes.
    Ou sur si ce n'est pas le cas

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/10/2010, 13h09
  2. [DOM] copie des noeuds d'un fichier xml dans un autre fichier xml
    Par chiraz86 dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 10/04/2010, 11h48
  3. copier des cellules A1:AZ1 et coller dans une autre feuille en E1:E42
    Par zergo dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 06/02/2010, 07h40
  4. Réponses: 5
    Dernier message: 24/02/2009, 09h05
  5. [DOM] (org.w3c.dom) copier un noeud d'un fichier XML dans un autre fichier XML
    Par snoop dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 13/02/2007, 17h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo