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

Contribuez Discussion :

CopyRange - Copie de liste de données (source) dans une feuille cible


Sujet :

Contribuez

  1. #1
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    janvier 2010
    Messages
    10 872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : janvier 2010
    Messages : 10 872
    Points : 26 021
    Points
    26 021
    Billets dans le blog
    34
    Par défaut CopyRange - Copie de liste de données (source) dans une feuille cible
    Préambule
    Cette discussion titrée Concaténer 1er onglet de plusieurs classeurs différents m'a donné l'envie d'écrire une nouvelle fonction nommée CopyRange.
    Cette fonction est proche de la contribution Regrouper plusieurs feuilles sur une autre. (2003-2010) mais plus légère et plus ouverte quant à la source (possibilité de choisir la cellule de départ) et permettant également d'ajouter une colonne contenant un nom tel que celui du classeur ou de la feuille source.
    Cette fonction permet d'importer une liste de données contenue dans une feuille et définie soit par un objet Range, un objet Worksheet ou un ListObject vers une feuille cible dont la plage de cellules commence en A1.

    Son usage est surtout utile pour regrouper plusieurs liste de données en une seule.

    Contraintes
    Mis à part l'objet source, la fonction n'effectue aucune vérification sur les données sources, ni sur le nombre de colonnes, ni si l'orthographe des étiquettes de colonnes sont identiques aux données déjà présentes dans la feuille cible. Il y a donc lieu de faire cette vérification en amont.
    Avant d'invoquer la fonction, il est donc important de
    • supprimer s'il y a lieu, le filtre des données sources
    • de veiller à ce que toutes les données sources soient de même nature (Plage classique ou tableau structuré)
    • si la source est un objet type ListObject, outre le filtre, il y a lieu de désactiver la ligne des totaux

    Les arguments
    Obligatoires
    objSource : Objet (Range, Worksheet ou ListObject)
    TargetSheet : Objet Worksheet
    Optionnels
    AddLabel : String. Cet argument permet d'ajouter une colonne dont toutes les lignes copiées contiendront cette valeur (par exemple le nom de la feuille ou du classeur source)
    ClearSheet : Boolean si TRUE, Supprime les cellules de TargetSheet
    ValueOnly : Boolean si TRUE ne conserve que les valeurs

    Code de la procédure
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    Function CopyRange(objSource As Object, _
                       TargetSheet As Worksheet, _
                       Optional ClearSheet As Boolean, _
                       Optional AddLabel As String, _
                       Optional ValueOnly As Boolean) As Range
      ' Copie données contenues dans objSource vers TargetSheet
      ' Auhor : Philippe Tulliez www.magicoffice.be
      ' Date  : 08/08/2019
      ' Version 1.1
      ' Arguments
      '   ObjSource    - Source des données. Objet WorkSheet, ListObject ou Range
      '   TargetSheet  - objet WorkSheet (Feuille cible)
      '   [AddLabel]   - String
      '   [ClearSheet] - Boolean si TRUE, Supprime les cellules de TargetSheet
      '   [ValueOnly]  - Boolean si TRUE ne conserve que les valeurs
      ' *** Déclaration ***
      Dim rngTarget As Range, rngSource As Range
      Dim flagExit As Boolean
      ' *** Attribution ***
      With objSource
        Select Case TypeName(objSource)
          Case "Worksheet": Set rngSource = .Range("A1").CurrentRegion
          Case "Range": If .Count = 1 Then Set rngSource = .CurrentRegion Else Set rngSource = objSource
          Case "ListObject": Set rngSource = .Range
          Case Else: flagExit = True
        End Select
      End With
      '
      If Not flagExit Then
         Set rngTarget = TargetSheet.Range("A1").CurrentRegion
         With rngTarget
           If Not ClearSheet Then ClearSheet = .Rows.Count = 1
           If ClearSheet Then
              .Cells.Clear: Set rngTarget = .Cells(1, 1)
            Else
              Set rngTarget = .Cells(.Rows.Count + 1, 1)
           End If
         End With
         ' Exportation des données
         With rngSource
         .Offset(Abs(Not ClearSheet)).Resize(.Rows.Count + Not ClearSheet).Copy rngTarget
         End With
         ' *** AddLabel
         If Len(AddLabel) Then
            With rngTarget
              If .Row = 1 Then .Offset(ColumnOffset:=rngSource.Columns.Count).Value = "_SourceName_"
            End With
            With rngSource
             rngTarget.Offset(0 + Abs(rngTarget.Row = 1), .Columns.Count).Resize(.Rows.Count - 1).Value = AddLabel
            End With
         End If
         ' *** ValueOnly
         With rngTarget
           Set CopyRange = .Range("A1").CurrentRegion
           If ValueOnly Then .Value = .Value
         End With
      End If
      ' End Of Process
      Set rngTarget = Nothing: Set rngSource = Nothing
    End Function
    Classeur de démonstration
    Le classeur au format xlsm a été testé avec la version 2010 et 2013.
    Malgré le soin apporté à la programmation de cette procédure et aux multiples tests réalisés, il est possible qu'il subsiste un "bug" qui m'aurait échappé. N'hésitez pas à m'en faire part.

    Vos remarques et réactions sont les bienvenues.
    Fichiers attachés Fichiers attachés
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Ma dernière contribution : VBA - Les macros complémentaires

Discussions similaires

  1. Copier une liste de données contenues dans une colonne filtrée
    Par pierreferte dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/07/2010, 09h54
  2. [XL-2003] Lecture de données entrées dans une feuille par une macro
    Par martinmacfly dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 16/12/2009, 16h29
  3. [XL-2007] [débutante VBA] trouver la liste des images utilisée dans une feuille
    Par EmmanuelleC dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 09/10/2009, 13h46
  4. Liste des fichiers CSV dans une feuille
    Par DubDub dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 19/02/2009, 08h05
  5. Réponses: 1
    Dernier message: 15/09/2008, 10h21

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