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/coller entre 2 classeurs [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de vanhoa
    Homme Profil pro
    Analyste Financier
    Inscrit en
    Octobre 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Analyste Financier
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 117
    Par défaut copier/coller entre 2 classeurs
    Bonjour,

    Je vous explique mon probleme.

    J'ai un userform dans mon classeur principale que je vais appeler "classeur1", lorsque je le lance, je clique sur un bouton qui appelle une sous procedure. Cette sous procedure me permet d'aller ouvrir un fichier PRN qui s'ouvre avec Excel (les donnees sont sur une colonne, comme lorsque l'on ouvre un fichier texte), nous appelerons ce classeur, "classeur2".

    Mon but est tout simple mais je ne comprends pas pourquoi ca ne marche pas. Je souhaite copier la colonne du classeur2 pour la coller dans mon classeur initial qui est le classeur1.

    Voici mon code pour la sous procedure:


    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
     
    Private Sub CommandButton3_Click()
     
     Dim classeur2 As Variant, classeur1 As Object
     
     Set classeur1 = Workbooks("classeur principal.xlsm")
     
        classeur2 = Application.GetOpenFilename("All file (*.*),*.*")
     
        If classeur2 <> False Then
            Workbooks.Open Filename:=classeur2
            Columns("A:A").Select
            Selection.Copy
            classeur1.Activate
            Worksheets("Sheet4").Range("A1").Select
            Selection.Paste
        End If
     
    End Sub

    J'obtiens un message d'erreur qui est le suivant et qui surligne Worksheets("Sheet4").Range("A1").Select:

    Run-time error '1004':
    Select method of Range class failed

    (pour la suite je vais simplement ecrire le code entre "If" et "End If" pour que ce soit moins long)

    Je me suis dit, peut etre que cela ne selection pas le bon classeur, donc je vais essayer ce code pour voir si ca me renvoie bien dans mon classeur principal:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
     
        If classeur2 <> False Then
            Workbooks.Open Filename:=classeur2
            Columns("A:A").Select
            Selection.Copy
            classeur1.Activate
            Worksheets("Sheet4").Range("A1").Select
            MsgBox ActiveWorkbook.Name & ActiveSheet.Name & Cells.Address
        End If
    Et la c'est tres etrange car, au lancement de ma procedure, si dans mon classeur1 j'etais deja sur le sheet4, alors j'ai ma MsgBox qui apparait et me dit: "classeur1.xlsmSheet4$1:$1048576"

    Mais si je suis sur un autre sheet dans mon classeur1 quand je lance ma procedure, j'obtiens :
    Run-time error '1004':
    Select method of Range class failed


    Encore etrange, je me suis dit, je vais faire pas a pas, donc j'ecris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
     
        If classeur2 <> False Then
            Workbooks.Open Filename:=classeur2
            Columns("A:A").Select
            Selection.Copy
            classeur1.Activate
            Worksheets("Sheet4").Select
            Range("A1").Select
            MsgBox ActiveWorkbook.Name & ActiveSheet.Name & Cells.Address
        End If
    Et la, peut importe dans quel sheet je suis au depart, ca marche, la MsgBox me remet bien le message!!!

    Et donc, comme ca marche, je tente de replacer mon "Selection.Paste":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
     
        If classeur2 <> False Then
            Workbooks.Open Filename:=classeur2
            Columns("A:A").Select
            Selection.Copy
            classeur1.Activate
            Worksheets("Sheet4").Select
            Range("A1").Select
            Selection.Paste
        End If

    Et la, malheureusement j'ai le message d'erreur suivant:
    Run-time error '438':
    Object doesn't support this property or method


    J'ai donc 2 questions:
    1) pourquoi est ce que je dois faire pas a pas pour ne pas avoir l'erreur 1004?
    2) pourquoi mon Selection.Paste me donne l'erreur 438?

    Voila, je pense avoir tout dit sur mon probleme!

    Merci beaucoup pour votre aide!

    vanhoa

  2. #2
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    Bonjour,

    1) pourquoi est ce que je dois faire pas a pas pour ne pas avoir l'erreur 1004?
    2) pourquoi mon Selection.Paste me donne l'erreur 438?
    1) Parce-que tu ne peux pas sélectionner une plage d'une feuille non active
    2) Parce-que l'objet Range n'a pas de méthode Paste.

    Un conseil: Bannis tous les Select et Activate du ton code...

  3. #3
    Membre expérimenté Avatar de vanhoa
    Homme Profil pro
    Analyste Financier
    Inscrit en
    Octobre 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Analyste Financier
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 117
    Par défaut
    merci pour la reponse Issoram :-)

    On m'avais deja dis sur une autre question d'eviter les select et activate, mais justement, au tout debut j'avais ecris mon code de cette facon:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    If classeur2 <> False Then
            Workbooks.Open Filename:=classeur2
            Columns("A:A").Copy
            classeur1.Worksheets("Sheet4").Colomn("A:A").Paste
        End If
    et ca ne marchait pas. j'avais l'erreur:
    Run-time error '438':
    Object doesn't support this property or method


    Et c'est pour ca que apres j'avais mis tous ces Activate Select Slection...
    Mais comme tu m'as dis dans ta reponse, je dois activer mon "Sheet4". Donc je dois passer forcement par un Select ou un Activate quelque part non?

    Merci de ton aide!! :-)

    vanhoa

  4. #4
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut copier/coller
    Bonjour,

    Avec le code joint, la colonne "A" de "feuil1" d'un fichier "classeur2" se copie bien dans le classeur "principal.xlsm" qui contient le code

    Il convient de préciser la feuille de "classeur2" que tu veux recopier.

    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
     
    Private Sub CommandButton3_Click()
     
    Dim wb2 As Variant
    Dim wb1 As Object
     
    Set wb1 = Workbooks("principal.xlsm") ' classeur qui possède le code
     
    wb2 = Application.GetOpenFilename("All file (*.*),*.*")
    If wb2 <> False Then
        Workbooks.Open Filename:=wb2
        Sheets("Feuil1").Columns("A:A").Copy wb1.Sheets("feuil1").Range("A1")
    End If
     
    End Sub
    Cordialement,

  5. #5
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Bonjour nibledispo, vanhoa.

    Pour être encore plus lisible, je garde wb2 pour contenir un objet classeur, comme wb1. Ensuite on peut passer de wb1 à wb2 à notre aise.


    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
    Private Sub CommandButton3_Click()
     
    Dim wb2 As Object
    Dim wb1 As Object
    Dim Fich As Variant
     
    Set wb1 = ThisWorkbook ' classeur qui possède ce code. Wb2 aussi peut contenir du code que l'on peut appeler
     
    Fich = Application.GetOpenFilename("All file (*.*),*.*")
    If Fich <> False Then
        Set wb2 = Workbooks.Open(Filename:=Fich)
        wb2.Sheets("Feuil1").Columns("A:A").Copy wb1.Sheets("feuil1").Range("A1")
    End If
    wb1.Activate 'Pour afficher wb1
     
     
    End Sub
    Cordialement

    Docmarti

  6. #6
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut copier/coller une cellule
    Bonjour Docmarti,

    Cela me semble plus propre, j'adhère sans réserve.

    Cordialement,

  7. #7
    Membre expérimenté Avatar de vanhoa
    Homme Profil pro
    Analyste Financier
    Inscrit en
    Octobre 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Analyste Financier
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 117
    Par défaut
    Super, merci beaucoup.
    Je ne connaissais pas cette methode de copier coller sans preciser explicitement la fonction "paste".

    Petite question: Si j'avais voulu faire un PasteValue, comment dois-je l'ecrire du coup? car pour preciser mes paste:=xlPasteValues/xlPasteAll etc... j'ai tente de les rajouter au bout de votre code, mais ca me met une erreur :-(

    Ca voudrait dire que je suis oblige d'ecrire explicitement la fonction Paste non?

    Merci!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Erreur copier coller entre 2 classeurs
    Par antoine2933 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 15/06/2012, 12h49
  2. copier coller entre 2 classeurs
    Par azertym dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 29/02/2012, 10h31
  3. [XL-2000] Copier coller entre deux classeurs
    Par Juan Jacko dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 15/03/2011, 11h35
  4. [VBA-E]Problème Copier-Coller entre 2 classeurs
    Par Corlo dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 23/05/2007, 14h31
  5. Réponses: 5
    Dernier message: 16/08/2006, 20h09

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