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 :

Macro- Copier Coller Plage de donnée [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Analyste
    Inscrit en
    Décembre 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Analyste

    Informations forums :
    Inscription : Décembre 2016
    Messages : 7
    Par défaut Macro- Copier Coller Plage de donnée
    Bonjour à tous,

    Débutant en VBA, j'essaie de créer une macro me permettant de copier des données d'un classeur et de les coller dans un autre.

    Mon souhait est en effet que la macro parcourt une liste de code inscrit dans une ligne d'un classeur A et si elle les retrouve dans le classeur B, elle copie les données d'une plage définit sous le code du classeur B (soit dans la même colonne) et qu'elle les colle dans le classeur A dans la même colonne où le code est inscrit.
    Mes plages de données à copier et coller ne varient pas en taille, seules l'emplacement des données et leur destination varient.

    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
    47
    48
    Sub Test_1()
     
    'j'attribue un type aux paramètres que je vais utiliser
     
    Dim appExcel As Excel.Application 'Application Excel
    Dim wbExcel1, wbExcel2 As Excel.Workbook 'Classeur Excel
    Dim Feuil1, Feuil2 As Excel.Worksheet 'Feuille Excel
    Dim trouve As Range 'cellule ou plage de cellules
    Dim Repertoire As FileDialog
    Dim i, j, k As Integer
     
    'j'indique à excel à quoi correspond  feuil1 (celle où j'importe les données), soit celle que j'utilise en ce moment
     
    Set wbExcel1 = ActiveWorkbook
    Set Feuil1 = wbExcel1.ActiveSheet
     
    'excel va ouvrir le répertoire et il va prendre le classeur que je sélectionne comme base de données
     
    Set Repertoire = Application.FileDialog(msoFileDialogFilePicker)
    Repertoire.Show 'Ouverture de l'application
    Rep = Repertoire.SelectedItems(1) 'sélection du classeur
     
    Set appExcel = CreateObject("Excel.Application")
    Set wbExcel2 = appExcel.Workbooks.Open(Rep)
    Set Feuil2 = wbExcel2.Sheets("PreconsoFC") 'attribution du nom Feuil2 à la feuille qui sert de base
     
    'je rappatrie les données
     
    With Feuil2
     
        For j = 4 To 50 
     
        Set trouve = wbExcel1.ActiveSheet.Rows(3).Cells.Find(.Cells(6, j), LookIn:=xlValues, LookAt:=xlWhole) ' si je trouve le même code
        If Not trouve Is Nothing Then
        .Range(Cells(91, trouve.Column), Cells(191, trouve.Column)).Select
        Selection.Copy
        Feuil1.Cells(j, 8).Select
        Selection.PasteSpecial Paste:=xlPasteValues
     
    End If
     
     
    Next j
     
    End With
     
     
    End Sub

    Le code bug et je n'arrive pas à le débuger. Pourriez-vous s'il vous plaît m'aider ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 681
    Par défaut
    Bonjour,

    Citation Envoyé par Floo77 Voir le message
    Le code bug et je n'arrive pas à le débuger. Pourriez-vous s'il vous plaît m'aider ?
    Un message d'erreur? si oui lequel et a quel ligne?
    si non qu'entend tu exactement par bug?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Analyste
    Inscrit en
    Décembre 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Analyste

    Informations forums :
    Inscription : Décembre 2016
    Messages : 7
    Par défaut
    Merci de ta réponse.

    Le bug vient de la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     .Range(Cells(91, trouve.Column), Cells(191, trouve.Column)).Select
    Le code de l'erreur est 1004 : La méthode 'Range' de l'objet '_Worksheet' a échoué.

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 681
    Par défaut
    Essaye ceci: (mettre les "." devant cells)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     .Range(.Cells(91, trouve.Column), .Cells(191, trouve.Column)).copy
    J'ai aussi virer le select inutile mais c'est pas ça qui plantait le code.

    Si ça ne marche pas, peux tu donner la valeur de trouve.Column au moment de l'erreur.

  5. #5
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Tes déclarations sont incorrectes.
    Quand on écrit Dim a, b As Integer, seul "b" est déclaré comme entier.
    "a" est déclaré comme Variant (c'est-à-dire sans type).

    Une question : est-ce que ta macro est dans Excel ou est-ce que tu pilotes ça depuis une autre application ?
    Parce que si c'est le premier cas, ta macro contient beaucoup d'éléments inutile ou très simplifiables.

    Par exemple, inutile de préciser qu'il s'agit de types d'objet Excel Dim MaFeuille As WorkSheet est suffisant.

    Ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set wbExcel1 = ActiveWorkbook
    Set Feuil1 = wbExcel1.ActiveSheet
    peut se simplifier en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Feuil1 = ActiveSheet
    vu que tu n'utilises pas wbExcel1 par la suite.

    Je ne comprends pas tu tout ce que tu cherches à faire dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set appExcel = CreateObject("Excel.Application")
    Set wbExcel2 = appExcel.Workbooks.Open(Rep)
    Set Feuil2 = wbExcel2.Sheets("PreconsoFC") 'attribution du nom Feuil2 à la feuille qui sert de base
    mais ça me semble bien compliquer pour récupérer juste un chemin.


    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
    With Feuil2
     
        For j = 4 To 50 
     
        Set trouve = wbExcel1.ActiveSheet.Rows(3).Cells.Find(.Cells(6, j), LookIn:=xlValues, LookAt:=xlWhole) ' si je trouve le même code
        If Not trouve Is Nothing Then
        .Range(Cells(91, trouve.Column), Cells(191, trouve.Column)).Select
        Selection.Copy
        Feuil1.Cells(j, 8).Select
        Selection.PasteSpecial Paste:=xlPasteValues
     
    End If
     
     
    Next j
     
    End With
    End Sub[/CODE]

    A remplacer par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    With Feuil2
        For j = 4 To 50 
            Set trouve = wbExcel1.ActiveSheet.Rows(3).Cells.Find(.Cells(6, j), LookIn:=xlValues, LookAt:=xlWhole) ' si je trouve le même code
            If Not trouve Is Nothing Then
                .Range("A91:A191").Offset(0, trouve.Column - 1).Copy
                Feuil1.Cells(j, 8).PasteSpecial Paste:=xlPasteValues
            End If
        Next j
    End With
    Ca devrais mieux marcher.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Analyste
    Inscrit en
    Décembre 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Analyste

    Informations forums :
    Inscription : Décembre 2016
    Messages : 7
    Par défaut
    Merci pour vos réponses !

    Menhir, ton code me copie les données allant de A91 à A191 de la feuil 2 dans la feuille 1 et ce dans plusieurs colonnes.
    Cependant j'aurais plutôt besoin que lorsque la macro trouve un code identique entre les deux fichiers, elle copie la plage de la ligne 91 à 191 de la colonne dans laquelle se trouve le bon code et qu'elle les copie dans la colonne du second fichier sous lequel elle a trouvé le code.

    En gros c'est une translation d'un Range allant de 91 à 191 en fonction d'un code.

    Encore merci pour votre aide !

  7. #7
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    As-tu essayé le code ?
    Parce que normalement, le Offset devrait décaler la colonne source pour copier la colonne de la cellule référencée par la variable "trouve".
    Mets un point d'arrêt sur la ligne du Copy et regarde le contenu de "trouve".

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Analyste
    Inscrit en
    Décembre 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Analyste

    Informations forums :
    Inscription : Décembre 2016
    Messages : 7
    Par défaut
    Oui, j'ai bien testé la macro et j'ai toujours le même contenu qui se copie colle et cela au mauvais endroit.
    J'ai mis un point d'arrêt et la variable indique la colonne 2 et c'est bien le contenu de la colonne 2 qui se copie colle systématiquement.

    Merci encore

  9. #9
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Floo77 Voir le message
    Menhir, ton code me copie les données allant de A91 à A191 de la feuil 2 dans la feuille 1 et ce dans plusieurs colonnes.
    Ce n'est pas mon code qui fait ça, c'est le tien. Moi je n'ai fait que supprimer les bugs pour qu'il fonctionne.
    Mais je n'ai pas modifié ses fonctionnalités vu que je n'ai rien compris aux explications de ton premier message.

    Cependant j'aurais plutôt besoin que lorsque la macro trouve un code identique entre les deux fichiers, elle copie la plage de la ligne 91 à 191 de la colonne dans laquelle se trouve le bon code et qu'elle les copie dans la colonne du second fichier sous lequel elle a trouvé le code.
    C'est quoi le "premier fichier" et le "second fichier" ?
    Si tu les désignais plutôt par les noms de variables que tu as utilisé ou par les noms de fichiers...

    Décris précisément ce que tu veux faire : que cherches-tu ? Où le cherches-tu ? Que veux-tu copier ? Où veux-tu le copier ?

    Citation Envoyé par Floo77 Voir le message
    j'ai toujours le même contenu qui se copie colle et cela au mauvais endroit.
    J'ai mis un point d'arrêt et la variable indique la colonne 2 et c'est bien le contenu de la colonne 2 qui se copie colle systématiquement.
    Et c'est normal ? C'est ce que tu veux ou non ?
    Si ce n'est pas le cas, c'est que le problème se situe au niveau de ta ligne Find, donc en dehors de la partie que j'ai modifiée.

    On ne le répètera jamais assez : le diable est dans la variable.
    Regarde le contenu de tes variables, ça te permettra de localiser ton bug.
    Mets un point d'arrêt sur ta ligne If Not et note à chaque tour la valeur de "trouve".
    Si c'est toujours la même valeur, c'est que tu as un problème dans ton Find.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 25/07/2013, 09h36
  2. Réponses: 0
    Dernier message: 25/07/2013, 09h09
  3. [XL-2003] Macro Copier/Coller données Excel vers document Word avec Signets
    Par Julien91080 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 22/05/2013, 12h28
  4. [OpenOffice][Tableur] [Macro] Comment copier une plage de données d'une Feuille "A" vers la Feuille Active
    Par clduick dans le forum OpenOffice & LibreOffice
    Réponses: 2
    Dernier message: 03/02/2012, 11h39
  5. Copier/Coller plage de donnée
    Par JeanMikael dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/07/2007, 12h17

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