Microsoft 365 Déplacer cellules en gardant mise en forme source et cible (via VBA)

mjuju

XLDnaute Nouveau
Bonjour,

Je souhaite déplacer des cellules en gardant la mise en forme de la source et de la cible.
Cela revient à un couper / collervaleurs mais il est impératif de rester sur une action sélection->déplacement sans actions intermédiaires.

Nous avons une série de classeur où nous souhaiterions appliquer ce VBA. Je mets en PJ l'un d'eux.
Généralement, on sélectionne plusieurs lignes de la colonne J, K, L, M que l'on déplace en C, D, E, F... (par exemple: J138:M142 déplacés en C146:F150 ou
J158:M158 déplacé en C151:F151 ou J160 en C169).

J'ai bien peur que ma demande ne soit possible: jusqu'à présent personne n'a trouvé la solution pour cette action précise!

Merci par avance,

Mjuju
 

Pièces jointes

  • Test.xlsx
    136.3 KB · Affichages: 7

job75

XLDnaute Barbatruc
Bonjour mjuju, le forum,

Sélectionnez les cellules que vous voulez en colonnes J:M et exécutez cette macro :
VB:
Sub Transfert()
Dim c As Range
ActiveCell.Activate 'au cas où Selection n'est pas un Range
For Each c In Selection
    If Not Intersect(c, [J:M], ActiveSheet.UsedRange) Is Nothing And Not Cells(c.Row, 10).Validation Is Nothing Then c(1, -6) = c
Next
End Sub
Faites au besoin une sélection multiple (touche Ctrl enfoncée).

A+
 

job75

XLDnaute Barbatruc
La macro précédente n'est pas fameuse, utilisez celle-ci :
VB:
Sub Transfert()
Dim r As Range
ActiveCell.Activate 'au cas où Selection n'est pas un Range
Set r = Intersect(Selection, [J:M], ActiveSheet.UsedRange)
If r Is Nothing Then Exit Sub
For Each r In r 'si sélection multiple
    If Not Cells(r.Row, 10).Validation Is Nothing Then r(1, -6) = r
Next
End Sub
Elle va bien même si l'on sélectionne toutes les cellules de la feuille active.
 

mjuju

XLDnaute Nouveau
Ha d'accord j'ai compris :) Ce n'est pas tout à fait ce que je souhaitais car les lignes ne se reportent pas forcement sur la même ligne.
Ca peut être:
J138:M142 déplacés en C146:F150 ou
J158:M158 déplacé en C151:F151 ou
J160 en C169 ou
inversement (des cellules des colonnes C D E F à des cellules de colonnes J K L M)

C'est pour ça que je cherche une solution qui s'applique sur n'importe quelle source à n'importe quelle cible, d'autant plus que je veux appliquer ce VBA à d'autres classeurs qui ont une mise en page totalement différent.
Les pistes que j'ai essayé sans succès:
Sélections source-> si déplacement = couper -> déplacement cible= coller valeurs
ou
Sélections source->déplacement -> garder mise en forme des cellules cibles et des cellules sources
 

mjuju

XLDnaute Nouveau
Bonjour,


C'est impossible.

Il faut choisir : on garde soit la MEF de la source soit la MEF de la cible, mais on ne peut bien sûr pas garder les deux MEF pour une même cellule.
denis #kohlanta GIF

Pourtant une action de couper/coller valeurs conserve bien la MEF source et cible?
Et bien si on peut au moins garder la mise en forme de la cellule cible ça serait bien :)
 

job75

XLDnaute Barbatruc
les lignes ne se reportent pas forcement sur la même ligne.
Ca peut être:
J138:M142 déplacés en C146:F150 ou
J158:M158 déplacé en C151:F151 ou
J160 en C169 ou
inversement (des cellules des colonnes C D E F à des cellules de colonnes J K L M)
Utilisez ces 2 macros :
VB:
Sub SelectCF()
'se lance par le raccourci Ctrl+C
Dim r As Range, lig&, decal&, dest As Range
ActiveCell.Activate 'au cas où Selection n'est pas un Range
Set r = Intersect(Selection, [C:F], ActiveSheet.UsedRange)
If r Is Nothing Then Exit Sub
lig = Abs(Int(Val(InputBox("Numéro de ligne du collage :"))))
If lig = 0 Then Exit Sub
decal = lig - Selection(1).Row
For Each r In r 'si sélection multiple
    Set dest = r(1, 8).Offset(decal)
    If Not Cells(r.Row, 3).Validation Is Nothing And Not Cells(dest.Row, 10).Validation Is Nothing Then dest = r
Next
End Sub

Sub SelectJM()
'se lance par le raccourci Ctrl+J
Dim r As Range, lig&, decal&, dest As Range
ActiveCell.Activate 'au cas où Selection n'est pas un Range
Set r = Intersect(Selection, [J:M], ActiveSheet.UsedRange)
If r Is Nothing Then Exit Sub
lig = Abs(Int(Val(InputBox("Numéro de ligne du collage :"))))
If lig = 0 Then Exit Sub
decal = lig - Selection(1).Row
For Each r In r 'si sélection multiple
    Set dest = r(1, -6).Offset(decal)
    If Not Cells(r.Row, 10).Validation Is Nothing And Not Cells(dest.Row, 3).Validation Is Nothing Then dest = r
Next
Hello TooFatBoy.
 

Pièces jointes

  • Test.xlsm
    144.5 KB · Affichages: 0
Dernière édition:

Statistiques des forums

Discussions
312 864
Messages
2 093 003
Membres
105 593
dernier inscrit
Damien49