Je souhaite créer une macro qui insère une ligne sous la cellule sélectionnée avec le même format. C'est le code que j'ai jusqu'à présent:
Public Sub insertRowBelow()
ActiveCell.Offset(1).EntireRow.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromRightOrAbove
End Sub
Le problème est le suivant: ce code ne transfère que partiellement le format. Il utilise la même couleur d'arrière-plan pour la nouvelle ligne, mais n'utilise pas les bordures/cadres pour les cellules. Comment puis-je y arriver?
L'option la plus simple consiste à utiliser le copier/coller Excel.
Public Sub insertRowBelow()
ActiveCell.Offset(1).EntireRow.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromRightOrAbove
ActiveCell.EntireRow.Copy
ActiveCell.Offset(1).EntireRow.PasteSpecial xlPasteFormats
Application.CutCopyMode = False
End Sub
Private Sub cmdInsertRow_Click()
Dim lRow As Long
Dim lRsp As Long
On Error Resume Next
lRow = Selection.Row()
lRsp = MsgBox("Insert New row above " & lRow & "?", _
vbQuestion + vbYesNo)
If lRsp <> vbYes Then Exit Sub
Rows(lRow).Select
Selection.Copy
Rows(lRow + 1).Select
Selection.Insert Shift:=xlDown
Application.CutCopyMode = False
'Paste formulas and conditional formatting in new row created
Rows(lRow).PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone
End Sub
C'est ce que j'utilise. Testé et fonctionnel,
Merci,
Lors de l'insertion d'une ligne, quel que soit le CopyOrigin, Excel ne mettra des bordures verticales sur les cellules insérées que si les bordures situées au-dessus et au-dessous de la position d'insertion sont identiques.
Je rencontre une situation similaire (mais en rotation) avec l'insertion de colonnes, mais la fonction Copier/Coller est trop lente pour mon classeur (des dizaines de milliers de lignes, de nombreuses colonnes et une mise en forme complexe).
J'ai trouvé trois solutions de contournement pour lesquelles il n'est pas nécessaire de copier le formatage à partir de la ligne source:
Assurez-vous que les bordures verticales ont le même poids, la même couleur et le même motif au-dessus et au-dessous de la position d'insertion afin qu'Excel les réplique dans votre nouvelle ligne. (Ceci est la réponse «ça fait mal quand je fais ça», «arrête de faire ça!».)
Utilisez conditionnel mise en forme pour établir la bordure (avec une formule de "= VRAI"). La mise en forme conditionnelle sera sera copiée dans la nouvelle ligne, de sorte que vous obtiendrez toujours une bordure.
Définissez la bordure sur la ligne insérée dans VBA après l'insertion de la ligne. Définir une bordure sur une plage est beaucoup plus rapide que copier/coller all de la mise en forme juste pour obtenir une bordure (en supposant que vous sachiez à l'avance ce que la bordure doit être ou que vous pouvez l'écrire à partir de la ligne du dessus sans perte de performances) .
bien, en utilisant l'enregistrement Macro et en le faisant manuellement, j'ai fini avec ce code .. qui semble fonctionner .. (bien que ce ne soit pas un one-liner comme le vôtre;)
lrow = Selection.Row()
Rows(lrow).Select
Selection.Copy
Rows(lrow + 1).Select
Selection.Insert Shift:=xlDown
Application.CutCopyMode = False
Selection.ClearContents
(J'ai mis ClearContents là-dedans parce que vous avez indiqué que vous vouliez un format, et je suppose que vous ne vouliez pas de données;))