Copier tableau taille variable macro excel

Résolu/Fermé
couc67 Messages postés 50 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 21 avril 2011 - 1 mars 2011 à 10:17
 Lucas - 25 nov. 2016 à 11:22
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
A voir également:

4 réponses

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
Modifié par pijaku le 1/03/2011 à 10:32
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
couc67 Messages postés 50 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 21 avril 2011
1 mars 2011 à 11:21
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
1 mars 2011 à 11:40
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
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
1 mars 2011 à 11:48
Bonjour,
Bonjour pijaku , Humm tu as testé ton dernier exemple ?
A+
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
Modifié par pijaku le 1/03/2011 à 11:56
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
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
1 mars 2011 à 12:09
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
1 mars 2011 à 12:14
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
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
1 mars 2011 à 17:25
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
couc67 Messages postés 50 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 21 avril 2011
2 mars 2011 à 13:44
C'est là que je l'ai rentré, mais merci du conseil !
0
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