Coller des colonnes les unes sous les autres !

N

Nono

Guest
Bonjour !

Je vous explose mon problème par l’exemple :
Dans « Feuil1 » j’ai les cellules suivante :
A1 : 1
A2 : 2
A3 : 3
A4 :
A5 :

Dans chaque cellule il y a une formule et dans le cas de A4 et A5 elle donne “” (vide)
Une macro copie A1 :A5 au même endroit dans « Feuil2 »

Ensuite j’ai les résultats suivants dans « Feuil1 »

A1 : 4
A2 : 5
A3 : 6
A4 : 7
A5 :

Je souhaite que ça soit copié (en valeur uniquement) sous les résultats précédents pour avoir dans Feuil2 :

A1 : 1
A2 : 2
A3 : 3 --------
A4 : 4
A5 : 5
A6 : 6
A7 : 7

Et cela X fois.

Problème : dans « Feuil2 » lorsque j’utilise la formule* pour sélectionner la dernière ligne de la colonne pour coller mes nouvelles données ça donne :

A1 : 1
A2 : 2
A3 : 3
A4 :
A5 : --------
A6 : 4
A7 : 5
A8 : 6
A9 : 7
A10 :

En gros ça prend en compte mes “” comme cellules non vide L

* Columns("a").End(xlDown).Offset(1).Select

Si vous avez une solution ça m’arrangerait beaucoup beaucoup !

Merci
 
N

Nono

Guest
Effectivement, c'est pour cela que je copie "en valeur uniquement" les cellules A1:A5 de la Feuil1 vers la Feuil2.

Quand on regarde dans les cellules de la Feuil2 (A4, A5) rien n'apparaît, ni valeur, ni formule. Pourtant il ne les considèrent aparemment pas comme vides :(
 
C

Chris

Guest
Une chaîne nulle "" n'est pas rien et donc la cellule n'est pas vide.
Solution : mettre en filtre automatique, sélectionner non vides dans le filtre (EXCEL utilise les mêmes termes mais n'y met pas les mêmes choses !!)
Puis copier collage spécial valeurs : les lignes ayant "" ne sont pas affichées et pas copiées.
Chris
 
F

Fred

Guest
Slt Nono, tu peux essayer de faire un truc comme ca :

Sub test()
Dim rg_fill As Range, rg_zone As Range, rg As Range

Set rg_zone = Sheets("Feuil1").Range("A:A").SpecialCells_(xlCellTypeConstants, xlNumbers)
For Each rg In rg_zone.Areas
Debug.Print rg.Address
If Not rg_fill Is Nothing Then
Set rg_fill = Union(rg_fill, rg)
Else
Set rg_fill = rg
End If
Next rg
rg_fill.Copy Destination:=Sheets("Feuil2").[A1]

End Sub
 
F

Fred

Guest
Suite a mon message precedent voici exactement ce que tu veux faire (+ fichier joint):

Sub test()
Dim rg_fill As Range, rg_zone As Range, rg As Range

Set rg_zone = Sheets("Feuil1").Range("A:A").SpecialCells(xlCellTypeConstants, xlNumbers)
For Each rg In rg_zone.Areas
Debug.Print rg.Address
If Not rg_fill Is Nothing Then
Set rg_fill = Union(rg_fill, rg)
Else
Set rg_fill = rg
End If
Next rg
rg_fill.Copy Destination:=Sheets("Feuil2").[A1].SpecialCells(xlCellTypeLastCell).Offset(1, 0)

End Sub
 

Pièces jointes

  • Fichier.xls
    25 KB · Affichages: 96
  • Fichier.xls
    25 KB · Affichages: 100
  • Fichier.xls
    25 KB · Affichages: 96
N

Nono

Guest
Trop fort !
Merci beaucoup Fred, c'est exactement ce que je cherchais... mais il y a un problème :(

En reprenant ton classeur :
Feuil1 :
A1 : 1
A2 : 2
A3 : 3
A4 : ""
A5 : ""

En appuyant sur le bouton TEST de ta formule 2 fois on a dans Feuil2 :
A1 :
A2 : 1
A3 : 2
A4 : 3
A5 : 1
A6 : 2
A7 : 3

Jusque là pas de problème.
Mais si tu effaces maintenant les cellules A1 à A7 de la feuille 2 pour entrer une nouvelle série de données et qu'ensuite tu rappuies sur le bouton test, tu as :
Feuil2 :
A1 :
A2 :
A3 :
A4 :
A5 :
A6 :
A7 :
A8 : 1
A9 : 2
A10 : 3

Ca repart en dessous des données effacées :( hors je souhaite que ça reparte du haut !

Une petite modif dans ton programme à faire ?

merci en tout cas :)
 
F

Fred

Guest
Slt, bon alors fait ceci :

Sub test()
Dim rg_fill As Range, rg_zone As Range, rg As Range

Set rg_zone = Sheets("Feuil1").Range("A:A").SpecialCells(xlCellTypeConstants, xlNumbers)
For Each rg In rg_zone.Areas
Debug.Print rg.Address
If Not rg_fill Is Nothing Then
Set rg_fill = Union(rg_fill, rg)
Else
Set rg_fill = rg
End If
Next rg
rg_fill.Copy Destination:=Sheets("Feuil2").[A65536].End(xlUp).Offset(1, 0)

End Sub
 
N

Nono

Guest
Ah merci, ça marche super maintenant !

Sauf que… non tu vas dire que j’exagères, surtout que je sais contourner le problème.
Je te le dis quand même J
Dans la colonne A de la feuille 1, si tu remplaces les valeurs par des formules comme ça par exemple :
A1 : =SI(B1="";"";B1)
A2 : =SI(B2="";"";B2)
Etc.

Si tu appuies sur le bouton TEST, ça fait erreur et la ligne
Set rg_zone = Sheets("Feuil1").Range("A:A").SpecialCells(xlCellTypeConstants, xlNumbers)
S’illumine dans le deboggeur.

Bon en fait pour contourner le problème je vais mettre les formules ailleurs, copier en valeur les résultats dans la colonne A puis lancer la macro TEST.

Voilà, merci pour tout !
 
S

STéphane

Guest
bonjour


crééez deux variables range, une pour les nombres constants et l'autre pour les nombres issus de formules et ajouter l'instruction on error resume next


on error resume next

dim rg_const_nr as zone, rg_formu_nr as range, rg_zone as range
set rg_const_nr=...specialcells(xlcelltypeconstants,xlnumbers)
set rg_formu_nr =...specialcells(xlcelltypeformulas,xlnumbers)


if not rg_const_nr is nothing then set rg_zone=rg_const_nr

if not rg_formu_nr is nothing then

if not rg_zone is nothing then
set rg_zone=union(rg_zone, rg_formu_nr)
else
set rg_zone=rg_formu_nr
end if
end if

if not rg_zone is nothing then rg_zone.select

be
Stéphane
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 105
Messages
2 085 350
Membres
102 870
dernier inscrit
Armisa