1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2014
    Messages : 4
    Points : 3
    Points
    3

    Par défaut Amélioration code copie d'une plage de cellule variable d'un classeur fermé

    Bonjour,

    J’essaie de coder une macro qui me permettrait de copier les données d’une plage de cellule d’un classeur fermé vers un le classeur dans lequel je lance la macro.

    La plage de cellules est variable en lignes, en colonne elle va de A2 :Y2

    Voici les débuts de mon codes mais j’ai plusieurs souci :
    - je suis obligé d’ouvrir les deux fichiers pour travailler et
    - pour la copie en gros j’ai fait une liaison avec un autofill par colonne, c’est assez galère quand on a 24 colonnes. Utiliser la fonction copy ça serait pas mieux ?

    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
    Sub Copie()
     
    'Calcul nombre de ligne à copier (bizarrement il faut avoir incidents.xls déjà ouvert même quand on est dans le même dossier)
     
        Dim drLig As Long
        drLig = Workbooks("incidents.xls").Sheets("OASIS").Range("A" & Rows.Count).End(xlUp).Row
        MsgBox (drLig)
     
    'Désactive actualisation de l'écran pendant execution de la macro (optionel - voir si gain de perf)
     
        Application.ScreenUpdating = False
     
    'Copie des cellules depuis fichier source
     
        Range("A2:A" & drLig).FormulaR1C1 = "=[incidents.xls]OASIS!RC"
     
    'Remplissage de ces colones (sûrement à revoir)
     
        Range("A2").AutoFill Destination:=Range("A2:A" & drLig)
        'A recopier 24 fois pour avoir jusqu'à la colonne Y (Fastidieux !!)
     
     
    'Redimensionnement des colonnes
     
        'Columns("A:AG").EntireColumn.AutoFit
     
    'Actualisation tous les TCD
     
        ActiveWorkbook.RefreshAll
     
    Application.ScreenUpdating = True
     
    End Sub
    Merci d’avance pour tout aide ou suggestion.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Developpeur VBA migrant tranquillement vers C# et VB.Net =]
    Inscrit en
    juillet 2007
    Messages
    12 319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Developpeur VBA migrant tranquillement vers C# et VB.Net =]
    Secteur : Finance

    Informations forums :
    Inscription : juillet 2007
    Messages : 12 319
    Points : 27 141
    Points
    27 141

    Par défaut

    Salut,

    sans discuter de la méthode, je pencherai pour un pragmatique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A2:Y" & drLig).FormulaR1C1 = "=[incidents.xls]OASIS!RC"
    reste à voir si la colonne A contient bien le plus de lignes.
    Pas de question technique par MP, je ne réponds pas

    Apprendre à programmer avec Access 2016

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2014
    Messages : 4
    Points : 3
    Points
    3

    Par défaut

    Citation Envoyé par Jean-Philippe André Voir le message
    Salut,

    sans discuter de la méthode, je pencherai pour un pragmatique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A2:Y" & drLig).FormulaR1C1 = "=[incidents.xls]OASIS!RC"
    reste à voir si la colonne A contient bien le plus de lignes.
    J'avais déjà essayé ça ne marchait pas : j'ai une erreur 1004 "erreur définit par ou l'objet" en l'état actuel c'est même le fichier source qui est modifié (je viens de réessayer). Peut être qu'on doit redéfinir le workbook....

    Comment pourrais-je faire pour ne pas avoir à ouvrir le fichier source ? Et retrouver le fichier source avec l'explorateur : peut être avec la fonction Application.GetOpenFilename ou Workbooks.Open

  4. #4
    Membre émérite
    Femme Profil pro
    Étudiant
    Inscrit en
    octobre 2016
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 22
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2016
    Messages : 1 478
    Points : 2 426
    Points
    2 426

    Par défaut

    Bonjour,
    Attention quand tu écris Range(...), par défaut tu utilses la plage de cellules sur la feuille active. Or si tu as ouvert ton autre document avant, c'est cet autre document qui est actif.
    Utilise des objets pour maitriser ce sur quoi tu travailles. Voici comment tu peux procéder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim wb As Workbook
    Dim shPaste As Worksheet
    Set shPaste = ActiveSheet    'ou = Sheets("la feuille où coller")
    Set wb = Workbooks.Open("nom du classeur à copier avec chemin",,True)       'True --> en lecture seule
    wb.Sheets("Feuille à copier").Range("plage à copier").Copy destination:=shPaste.Range("plage où coller")
    wb.Close(savechanges:=False)
    Set wb = Nothing
    Set shPaste = Nothing
    Veux tu lier ton document à l'autre ou copier-coller les donner ? Dans mon exemple, j'ai copié-collé.
    Si tu as des doutes à certains moments, tu peux aussi utiliser ThisWorkbook pour faire référence au classeur dans lequel est écrit la macro.

Discussions similaires

  1. Problème de copie d'une plage de cellules avec case à cocher
    Par sab_info dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/05/2013, 15h32
  2. faire une copie d'une plage de cellules sur x feuilles
    Par La Zélie dans le forum Excel
    Réponses: 4
    Dernier message: 11/06/2008, 09h55
  3. Copie d'une plage de cellules
    Par Jeanvaljean44 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 21/01/2008, 18h46
  4. Problème de copie d'une plage de cellule
    Par Boonichou dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 03/08/2007, 18h31
  5. appliquer une macro a une plage de cellule variable
    Par johndeuf dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 10/11/2006, 17h18

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