Recopier toutes les cellules non-vides d'un tableau dans un autre onglet vba

Bonjour,

J’aurais besoin de recopier toutes les cellules non vides de plusieurs tableaux situés dans les différents onglets de mon classeur excel les unes à la suite des autre dans un tableau récapitulatif appelé “Pilote”.
Or mon problème se trouve au moment de la sélection des différentes plage dans VBA puisque celles-ci ont une longueur variable selon le tableau auquel elles appartiennent.
Malgré de nombreuses recherche sur le forum je ne parviens pas à trouver le code permettant de sélectionner toute la plage d’un tableau jusqu’à la dernière cellule non vide. En effet de nombreux codes sont basés sur une cellule active mais ce n’est pas adapté à mon fichier.

J’ai trouver le code suivant mais celui-ci ne copie que les 20 premières lignes.

Sub Tableau1()
'Dans la feuille Tableau 1
Sheets("Tableau 1").Activate
'Selectionner toutes les cellules pleines
Dim MaPlage As Range
Dim i As Integer
i = 1
Set MaPlage = Range("A2" & i & ":G" & i)
MaPlage.Select
'Copier la selection
Selection.Copy
'Activer la feuille Pilote
Sheets("Pilote").Activate
'Selectionner la première ligne vide
Range("A65536").End(xlUp).Offset(1).Select
'Copier les valeurs dans la ligne selectionnée
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
End Sub

Merci d’avance,

Noémie

Bonjour,

Ce n’est pas très clair. :frowning:

OK, je vois l’idée.

Essaye déjà de faire plage par plage, peut-être, pour simplifier la sélection d’une plage.

Ca, ce n’est pas un problème, il y a .End(xlDown) qui est là pour trouver la fin.

Si c’est constituée de plusieurs plages, ce n’est pas très simple, je pense.
Donc faire comme je disais plus haut : plage par plage.
Edité le 31/03/2015 à 02:27

Bonjour,

Merci pour votre réponse et désolée pour mon explication un peu bancale.

J’ai essayer en ajoutant .End(xlDown) mais ça ne fonctionne toujours pas.

En fait si je reformule, il me faut sélectionner les colonnes A à G d’un tableau mais uniquement jusqu’à la dernière ligne remplie.

C’est donc cette partie de mon code qui pose problème :

Dim MaPlage As Range
Dim i As Integer
i = 1
Set MaPlage = Range(“A2” & i & “:G” & i).End(xlDown)
MaPlage.Select

Merci beaucoup

OK, mais “remplie” dans quelle colonne ? A ? B ? … G ?

As-tu essayé avec “CurrentRegion” ?

Un truc du genre Set MaPlage=Range(“A2”).CurrentRegion

Toutes les colonnes contiennent des valeurs mais il est possible de se baser seulement sur la dernière ligne de la colonne A, par exemple, car si A est non vide, toute la ligne est non vide.

Oui j’ai déjà essayé cette formule mais le problème c’est que le tableau dans lequel je dois sélectionner la plage résulte d’un collage avec liaison d’un autre tableau. De ce fait, la formule “=V:MesDocuments…” est étendue jusqu’à la ligne 1500 et lors de la sélection, toutes ces lignes sont prisent en compte.

Cela me pose un problème majeur puisque j’ai une bonne dizaine de tableaux, et lorsque je copie les sélections “Range(“A2”).CurrentRegion” dans le tableau final les unes à la suite des autres, toutes les cellules “vides” contenant la formule de collage avec liaison apparaissent et cela donne un tableau beaucoup trop long. Ce que je ne comprends pas, c’est que pourtant une fois collé dans le tableau final, ces cellules sont réellement vides lorsque je clique dessus donc je ne comprend pas pourquoi excel refuse de recopier des valeurs par dessus.

Voilà qui est parfaitement clair. :super:

Si je comprends bien, tu as des cellules qui contiennent des formules faisant référence à un autre fichier.

Dans ce cas, ces cellules ne sont pas vides puisqu’il y a une formule dedans (même si le résultat de cette formule est lui-même “vide”).
Donc une formule utilisant “CurrentRegion” ou “End(xlDown)” ne peut être utilisée.

Oui, comme dit juste ci-dessus, les cellules ne sont en fait pas vides, d’où tes guillemets. :wink:

Tout dépend comment tu effectues ton collage :

  • si tu fais un collage standard, ça doit recopier les formules, donc les cellules ne sont pas “vides”,
  • si tu fais un collage uniquement des valeurs, alors il est peut-être possible que les cellules soient vides (mais ça reste à vérifier).

Je crois que j’ai une idée pour tenter de résoudre ce problème de sélection.
Il faut que je vérifie si ça marche.

Oui c’est exactement ça, j’ai fait un collage avec liaisons.

Pourtant dans le tableau final j’ai effectué un collage spécial de valeurs donc les formules ne devrait plus être prisent en compte et la formule .End(xlDown) ou .CurrentRegion devrait ensuite permettre de revenir à la dernière des cellules non vide.
Cependant lorsque je relance la macro, elle effectue le collage beaucoup plus loin, comme si les formules avait été copiées alors que lorsque je clique sur les cellules, elles sont vides.

J’espère que ça fonctionnera !

Merci.

Parfois dans Excel, une cellule qui devrait être vide ne l’est pas.

Par exemple quand tu mets une valeur dedans, puis que tu supprimes cette valeur, la cellule ne redevient pas vide pour autant, si je ne me trompe.
Et si tu vides le contenu de la cellule par macro, je crois bien que ça dépend de la commande utilisée.

Mais je vais essayer (demain j’espère) l’idée que j’ai eu et je te dirais si ça marche. :wink:

Je pense déjà que ta macro a un problème au niveau de la sélection.
En effet, Range(“A2” & i & “:G” & i), avec i=1, ça fait Range(“A21:G1”) et je ne suis pas certain que ce soit ce que tu veux obtenir.
Edité le 01/04/2015 à 23:25

Excel a vraiment des subtilités que je ne comprend pas toujours…

Merci de te pencher sur mon problème :slight_smile:

Non effectivement ce n’est pas ce que je veux, je souhaiterais plutôt quelque chose du style Range(“A2:Gx”) donc pour l’instant j’ai modifié avec Range(“A2”).CurrentRegion, j’ai un tableau à rallonge mais ça marche… :wink:

Même dans gens chevronnés en Excel (formateur Excel officiellement agréé par Microsoft) restent perplexes devant certaines réactions d’Excel… :oui:

Je n’aurais pas le temps de regarder ton problème. :frowning:
Donc je te donne l’idée que j’avais et tu essayeras de la mettre en peuvre pour voir si ça marche ou pas.

L’idée est d’appliquer un filtre sur la colonne A avant de faire la sélection de la plage.
Ce filtre doit permettre de ne faire afficher que les lignes dont la cellule de la colonne A ne sont pas vides visuellement, c’est-à-dire <>"".
En suite pour sélectionner la plage, tu dois pouvoir utiliser Range(“A2”).End(xlDown) pour obtenir le numéro de la dernière ligne non vide.
Ce qui donnerait un truc du genre :
Set MaPlage = Range(“A2:G” & Range(“A2”).End(xlDown).Row)

Pour résumer, en gros ça donnerait ça :
1- appliquer le filtre sur le tableau source,
2- sélectionner la plage sur le tableau source,
3- copier la plage du tableau source,
4- coller la plage sur le tableau de destination,
5- enlever le filtre du tableau source,
6- recommencer pour les autres tableaux source.
Edité le 02/04/2015 à 13:47

MERCI !!!

Ça marche parfaitement c’est génial !

:etonne:

Voici le code final :


Sub MACRO()
'Dans la feuille Feuil1
Sheets("Feuil1").Activate
'Ne pas afficher les cellules vides
ActiveSheet.Range("$A$1:$G$3000").AutoFilter Field:=1, Criteria1:="<>"
'Selectionner toutes les cellules pleines
Dim MaPlage As Range
Set MaPlage = Range("A2:G" & Range("A2").End(xlDown).Row)
MaPlage.Select
'Copier la selection
Selection.Copy
'Activer la feuille Pilote
Sheets("Feuil2").Activate
'Selectionner la première ligne vide
Range("A65536").End(xlUp).Offset(1).Select
'Copier les valeurs dans la ligne selectionnée
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
'Retirer les filtres
Sheets("Feuil1").Activate
ActiveSheet.Range("$A$1:$G$3000").AutoFilter Field:=1
End Sub

Je te remercie encore pour ton aide :smiley:

Content pour toi si ton problème est résolu. :super:

Je crois que tu peux “simplifier” pour le filtrage.
En effet, il me semble qu’il suffit d’indiquer une cellule de la première ligne.
Tu dois donc pouvoir utiliser ActiveSheet.Range(“A1”).AutoFilter

Mais ça reste à vérifier. :neutre:
Edité le 02/04/2015 à 16:29

J’avais obtenu ça grâce à l’enregistreur de macros et je viens de tester ta solution mais ça ne fonctionne pas…
Merci quand même :wink:

Je me suis peut-être mal exprimé. :frowning: Je voulais dire remplacer “$A$1:$G$3000” par simplement “A1”, mais en laissant tout le reste bien sûr.

Mais la seule chose importante est que ton soucis soit résolu. :wink:

Bonne soirée et à bientôt peut-être :hello:
Edité le 02/04/2015 à 19:05

Ah oui ça marche très bien uniquement avec A1 ! :slight_smile:

Merci, à bientôt :hello:

:super: