Copier tableau taille variable macro excel

Résolu
couc67 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention   -  
 Lucas -
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. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
  2. couc67 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention  
     
    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. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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. lermite222 Messages postés 9042 Statut Contributeur 1 199
       
      Bonjour,
      Bonjour pijaku , Humm tu as testé ton dernier exemple ?
      A+
      0
    3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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. lermite222 Messages postés 9042 Statut Contributeur 1 199
       
      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. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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. couc67 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention  
       
      C'est là que je l'ai rentré, mais merci du conseil !
      0
  4. Lucas
     
    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