web-dev-qa-db-fra.com

VBA Excel - Insérer la ligne ci-dessous avec le même format, y compris les bordures et les cadres

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?

3
derMax

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
9
Eddy
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,

2
Donald

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:

  1. 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!».)

  2. 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.

    • Les bordures de mise en forme conditionnelles sont limitées aux lignes de poids faible.
    • Fonctionne mieux pour les feuilles dont les bordures sont relativement cohérentes. Vous n'avez donc pas à créer un ensemble de règles de mise en forme conditionnelle.
  3. 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) .

2
richardtallent

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;))

1
Ditto