Copier tableau taille variable macro excel

Résolu
Bonjour,

Je suis un peu débutant en macros excel... Je souhaiterais copier un tableau d'une feuille1 dans une feuille2 sous Excel. Le problème est que mon tableau aura toujours une taille variable (issu d'une extract)

Pour faire simple, on va le faire uniquement avec une colonne du tableau, colonne appelée NumArticle :

J'ai essayé de chercher comme déterminer la taille max de mon tableau, mais il semblerait que mon utilisation de Ubound LBound ne soit pas bonne

Auriez vous une solution ? Un grand merci d'avance

Option Explicit
Option Base 0

Sub CopierList()

Sheets("Feuil1").Select
Range("Lbound(NumArticle):Ubound(NumArticle)").Select //je pense que c'est là que ca bloque...
Selection.Copy
Sheets("Feuil2").Select
Range("A1").Select
ActiveSheet.Paste

End Sub

4 réponses

  1. Bonjour,

    j'ai utilisé les deux méthodes qui fonctionnent à la base l'une comme l'autre, malheureusement quand la taille de mon tableau est plus importante que ma première copie, ça me sélectionne bien les cellules supplémentaires, mais quand la taille de mon tableau est plus petite que lors de ma première copie, la sélection continue de se faire sur la plage la plus importante

    Autrement dit:
    - si mon tableau s'étend de A1 à B2, j'applique ma macro et ça me copie bien les cellules de A1 à B2
    - si ensuite mon tableau s'étend de A1 à B5, j'applique ma macro et ça me copie bien les cellules de A1 à B5
    - mais si ensuite mon tableau s'étend de nouveau de A1 à B2 par exemple, j'applique ma macro et ça me sélectionne toujours la plage de A1 à B5, ça ne réduit plus jamais

    Je ne trouve pas de solution.. Avez vous une idée? Merci
    0
    1. Contributeur
      Re,
      le code de pijaku fonctionne très bien.
      Sub copie_colle()
      Dim AdresseAbsolue As String
      With Sheets("Feuil1")
          AdresseAbsolue = .Range("A1").SpecialCells(xlCellTypeLastCell).Address
          .Range("A1", AdresseAbsolue).Copy Sheets("Feuil2").Range("A2")
      End With
      End Sub

      Mais il doit être dans un module général et pas un module de feuille.
      >> Insertion >> Module
      C'est dans cette fenêtre que tu dois copier le code.
      A+
      0
      1. C'est là que je l'ai rentré, mais merci du conseil !
        0
    2. Merci beaucoup Pijaku ! Ca marche parfaitement ! Par contre j'utilise toujours un .select pour activer la feuille dans laquelle je veux coller : Sheets("Feuil2").Select

      il faut mieux éviter ?

      Encore merci pour ton aide.
      0
      1. Modérateur
        Oui bien sur. Une des syntaxes pour copier coller est la suivante :
        Sheets(FeuilleSource).Range(Source).Copy Sheets(FeuilDestination).Range(Destination)
        Tu mets juste un espace entre .copy et ta feuille de destination...

        Si je reprends ton code pour exemple :
        Option Explicit 
        Option Base 0 
        
        Sub CopierList() 
        
        Sheets("Feuil1").Select 
        Range("Lbound(NumArticle):Ubound(NumArticle)").Select //je pense que c'est là que ca bloque... 
        Selection.Copy 
        Sheets("Feuil2").Select 
        Range("A1").Select 
        ActiveSheet.Paste 
        
        End Sub

        Devient :
        Option Explicit 
        
        Sub copie_colle()
        Dim DerniereColonne As Integer
        Dim DerniereLigne As Integer
        
        DerniereColonne = Range("A1").SpecialCells(xlCellTypeLastCell).Column
        DerniereLigne = Range("A1").SpecialCells(xlCellTypeLastCell).Row
        Sheets("Feuil1").Range(Cells(1, 1), Cells(DerniereLigne, DerniereColonne)).Copy Sheets("Feuil2").Range("A1")
        
        End Sub

        ou alors, avec l'adresse absolue :
        Option Explicit 
        
        Sub copie_colle()
        
        Dim AdresseAbsolue As String 
        
        AdresseAbsolue = Range("A1").SpecialCells(xlCellTypeLastCell).Address 
        Sheets("Feuil1").Range("A1", AdresseAbsolue).Copy Sheets("Feuil2").Range("A1")
        End Sub

        Voilà...
        0
      2. Contributeur
        Bonjour,
        Bonjour pijaku , Humm tu as testé ton dernier exemple ?
        A+
        0
      3. Modérateur
        Salut lermitte222,
        Oui j'ai testé (excel 2003). Pourquoi? Qu'est ce qui ne fonctionne pas selon toi?

        EDIT : on peux ajouter, juste au cas ou :
        AdresseAbsolue = Sheets("Feuil1").Range("A1").SpecialCells(xlCellTypeLastCell).Address
        ou alors la jouer comme ceci :
        Option Explicit  
        Sub copie_colle() 
        Dim AdresseAbsolue As String  
        With Sheets("Feuil1") 
            AdresseAbsolue = .Range("A1").SpecialCells(xlCellTypeLastCell).Address  
            .Range("A1", AdresseAbsolue).Copy Sheets("Feuil2").Range("A1") 
        End With 
        End Sub
        0
      4. Contributeur
        Hummm.. autant pour moi,
        C'était >> .Range("A1", AdresseAbsolue) qui me semblais bizarre, jusque maintenant j'ai toujours mis..
        .Range("A1;" & AdresseAbsolue)
        Mais tu as raison ça fonctionne aussi avec une virgule.
        A+
        0
      5. Modérateur
        Pas de souci.
        Juste une petit remarque/question au passage, ta syntaxe avec & est elle "académique"? Parce que la mienne avec "," est surtout dûe à une recherche à tâtons...
        Auquel cas, j'en changerais pour user davantage du "&".
        0
    3. Modérateur
      Bonjour,
      Ne pas confondre tableau = feuille et variable tableau...
      Rien à voir.
      Ici ton "tableau" c'est la plage occupée par tes données dans ta feuille.
      Supposons :
      nom de ta feuille : Feuil1
      Méthode 1 :
      Dernière colonne non vide :
      Dim DerniereColonne As Integer 
      DerniereColonne = Range("A1").SpecialCells(xlCellTypeLastCell).Column

      Dernière ligne non vide :
      Dim DerniereLigne As Integer     
      DerniereLigne = Range("A1").SpecialCells(xlCellTypeLastCell).Row

      Tu as donc maintenant la dernière ligne et dernière colonne de ton range...
      Donc, pour le copier :
      Dim DerniereColonne As Integer 
      Dim DerniereLigne As Integer     
      
      DerniereColonne = Range("A1").SpecialCells(xlCellTypeLastCell).Column 
      DerniereLigne = Range("A1").SpecialCells(xlCellTypeLastCell).Row 
      Sheets("Feuil1").Range(Cells(1, 1), Cells(DerniereLigne, DerniereColonne)).Copy


      Au passage évite les .Select...

      Méthode 2 :
      Adresse absolue de la dernière cellule renseignée dans la feuille:
      Dim AdresseAbsolue As String 
      AdresseAbsolue = Range("A1").SpecialCells(xlCellTypeLastCell).Address

      Ton Range devient alors :
      Dim AdresseAbsolue As String 
      
      AdresseAbsolue = Range("A1").SpecialCells(xlCellTypeLastCell).Address 
      Range("A1", AdresseAbsolue).Copy


      sources...
      "Laissez-moi deviner... Votre surnom, c'est «Bande Passante»? "
      - Le Tribunal des flagrants délires- P.Desproges -
      1