Copier coller cellules non vide d'une plage

fredoland

XLDnaute Nouveau
Bonsoir à tous,

Après des recherches infructueuses et de vaines tentatives je me permet de poster ma demande.

Je voudrais sélectionner dans la "feuil1" toutes les cellules non vides de la plage 04:W45 (9 colonnes), les copier et les coller (collage spécial : uniquement les valeurs pas les formules) dans la "feuil2" des la première cellule vide de la colonne A à partir de la 3ème ligne (A3). Ce tableau en "feuil2" s'étalera en colonne comme le premier tableau sur 9 colonnes (de A à I).

Je vous joint un fichier pour illustrer mes propos.

Merci d'avance.
 

Fichiers joints

fredoland

XLDnaute Nouveau
Bonjour et merci pour ton aide,

J'ai modifié ta macro afin que je puisse copier par l'intermédiaire de la macro ce qui est selectionner à la suite de la "feuil2".

C'est presque ça mais par contre cela selectionne uniquement une plage fixe qui est "O4:W8". Or si j'incrémente avec de nouvelles données le tableau de gauche sur la "feuil1" (de couleur vert clair) la macro ne prend pas en compte les nouvelles données. Or je souhaiterais selectionner copier et coller les cellules non vides de la plage "O4:W45" (couleur saumon sur le fichier ci joint). Les cellules de cette plage sont toutes issues de formules.

Voici la pièce jointe.
 

Fichiers joints

Paf

XLDnaute Barbatruc
Bonjour à tous,

peut être :
VB:
Sub copie()
Dim DL As Long
  With Worksheets("Feuil1")
  DL = Application.WorksheetFunction.Count(.Range("P:P")) - 2
  .Range("O4:W" & 4 + DL).Copy
  End With
  With Worksheets("Feuil2")
  .Range("A" & .Cells(Rows.Count, 1).End(xlUp).Row + 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    End With
  Application.CutCopyMode = False
End Sub
A+
 

fredoland

XLDnaute Nouveau
En utilisant cette macro je m'approche du but ce n'est pas encore ca car cela copie les données uniquement dans la colonne A de la feuille 2.

Sub Test_2()

Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim CEL As Range 'déclare la variable CEL (CELlule)
Dim DEST As Range 'déclare la variable OS (cellule de DESTination)

Set OS = Worksheets("F1") 'définit l'onglet source OS
Set OD = Worksheets("F2") 'définit l'onglet destination OD
For Each CEL In OS.Range("O4:W45") 'boule sur toutes les cellues CEL de la plage A7:A26
If CEL <> "" Then 'condition : si la cellule n'est paS vide
Set DEST = OD.Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 0) 'définit la cellue de destination DEST
CEL.Copy DEST 'copie la celllue CEL dans DEST
End If 'fin de la condition
Next CEL 'prochaine celllue de la boucle

End Sub
 

Paf

XLDnaute Barbatruc
J'avais compris qu'il ne fallait pas copier les lignes vides de cette plage justement.
Si on veut copier toute la plage O4:W45
VB:
Sub copie()
Dim DL As Long
  With Worksheets("Feuil1")
  .Range("O4:W45").Copy  'on copie toute la plage, y compris les lignes où les formules renvoient ""
  End With
  With Worksheets("Feuil2")
  .Range("A" & .Cells(Rows.Count, 1).End(xlUp).Row + 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    End With
  Application.CutCopyMode = False
End Sub
 

fredoland

XLDnaute Nouveau
Bonjour PAF,

Avec le code de ta première macro cela prend une plage bien défini et lorsque j'exécute de nouveau la macro les nouvelle données de la plage défini viennent bien en dessous des premières déja éxecuté mais, le problème était que la plage à prendre en compte est (O4:W45).

Dans ta seconde macro cela prend bien compte l'ensemble de la plage souhaité (O4:W45). Dans l'exemple les données O4:W12 de la plage (O4:W45) sont bien collé dans la feuille2. Cependant si j'execute de nouveau la macro les nouvelles données viennent s'incrémenter 20 lignes plus bas que la dernières lignes non vides de la feuille 2.

Voici ce que j'obtiens (voir la copie écran)



Or ce qu'il faudrait c'est que ces nouvelles données viennent compléter le tableau de la seconde feuille juste après la dernière ligne coller de la précédente exécution de la macro.
Ce qui pose problème c'est de contourner le fait que l'ensemble des cellules de la plage (O4:W45) sont toutes des cellules issues de formules. Il faudrait que la macro puisse prendre en compte ça et a priori d'après ce que ce comprend le collage spécial ne fonctionne pas dans ce cas la.

Une piste serait de regarde du coté specialcells je suis en train de regarder ça.

On avance on avance!!
 

Paf

XLDnaute Barbatruc
Dans ta seconde macro cela prend bien compte l'ensemble de la plage souhaité (O4:W45). Dans l'exemple les données O4:W12 de la plage (O4:W45) sont bien collé dans la feuille2. Cependant si j'execute de nouveau la macro les nouvelles données viennent s'incrémenter 20 lignes plus bas que la dernières lignes non vides de la feuille 2.
ben ... forcément puisqu'on copie des lignes vides ( ou pseudo vides) la copie suivante viendra après ces lignes.
La macro du post4 ne copie que les lignes visuellement remplies et ne colle donc pas de lignes vides.


dans le titre : Copier coller cellules non vide d'une plage
post 2 :je souhaiterais selectionner copier et coller les cellules non vides de la plage "O4:W45"
post 5 (réponse à la macro ne prenant pas les lignes vides ):Non ca ne prend pas en compte toute les cellules sur la plage O4:W45.
post 8 (réponse à la macro copiant toute la plage "O4:W45") : Ok mais ca copie des lignes vides ( synthèse de la réponse)

En résumé:
Si on ne copie que les lignes visuellement remplies : ça ne va pas
Si on copie toute la plage ca ne va pas

Donc, j'abandonne
 

fredoland

XLDnaute Nouveau
Ok merci pour ton aide quand même. Initialement je pensais qu'un collage spécial pouvait faire l'affaire en prenant uniquement les valeurs mais la macro considère les cellules avec formule comme non vide même si elle ne sont pas remplis.

Quoiqu'il en soit je continue mes rechercches et des que je trouve la solution je la posterais.
 

Paf

XLDnaute Barbatruc
mais la macro considère les cellules avec formule comme non vide même si elle ne sont pas remplis.
c'est pour ça que j'ai utilisé :
VB:
DL = Application.WorksheetFunction.Count(.Range("P:P")) - 2
  .Range("O4:W" & 4 + DL).Copy
on pourrait aussi utiliser:
VB:
For i = 3 To 45
  If Cells(i, 15).Value = "" Then
  DL = i - 1
  Exit For
  End If
Next
.Range("O4:W" &  DL).Copy
dans cette situation , Cells(i, 15).Value renvoie la valeur de la cellule; si cette cellule contient une formule renvoyant "", elle sera considérée comme vide.
 

fredoland

XLDnaute Nouveau
Non idem ne fonctionne pas. Il faut que je code la formule que j'utilise en O dans la macro même pour resoudre ce problème et que la fonction dernière ligne vide soit pris en compte comme cela devrait normalement être.

En l'état actuel rien ne peut être fait d'après ce que j'en ai compris. Je suis dans une impasse, pas de sorti possible mis a part revoir de font en comble mon fichier avec la macro qui va avec.

Désolé de t'avoir fait perdre ton temps PAF et encore merci d'avoir essayé.
 

fredoland

XLDnaute Nouveau
Petit update PAF:
Je reviens pour te dire que j'aurais peut être une solution sans forcement coder en VBA cette p***** de formule matricielle qui me pose ce problème insoluble.

Je te tiens au courant !!!!
 

fredoland

XLDnaute Nouveau
Finalement j'ai pu réorganiser mon fichier de tel sorte que je puisse centraliser toutes mes données primaires dans un seul et unique tableau (celui de gauche de la feuille "Feuil1").
De cette manière la fonction matricielle (celle qui pose problème...) que je dois utiliser ne gène pas car la macro (copier/coller) est exécuté cette fois ci en amont (avant mise en application de cette fameuse fonction matricielle).

Encore merci pour ton aide Paf!
 
Dernière édition:
Haut Bas