XL 2021 Encadrement de cellule sur tableau dynamique

  • Initiateur de la discussion Initiateur de la discussion treza88
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

treza88

XLDnaute Occasionnel
Bonjour à tous,

J'ai un tableau qui ressemble au fichier joint, je voudrais trouver le meilleur moyen d'encadrer les cellules qui vont de I2 a V24.
Dans un tableau fixe, pas de soucis, mais je suis dans un tableau qui par macro augmente en longueur, comme en hauteur, et pas forcément tout le temps, des fois que la longueur ou que la hauteur ou pas du tout.

J'ai fait une macro qui rempli automatiquement toutes la zone, mais sur le fichier de travail est comporte plusieurs millier de ligne et centaine de colonnes, et ça prend un certains temps sur l’exécution de la macro complète.

Il y aurait il un moyen de le faire autrement ?

Je pensais éventuellement à une MFC, mais je ne sais pas si c'est possible.
 

Pièces jointes

Donc pour l'instant je suis sur une solution macro qui a chaque copier coller dans le tableau ajoute les encadrements sur uniquement les parties qui viennent d’être collé.
Donc beaucoup moins de surface à traiter.
VB:
Sub Encadrement()

    Dim ws As Worksheet
    Dim rng As Range
    Dim b As Borders
    
    '--- Feuille cible
    Set ws = ThisWorkbook.Worksheets(ActiveSheet.Name)
    
    '--- Dernière ligne utilisée
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    
    '--- Dernière colonne utilisée
    lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
    
    '--- Plage bornée
    Set rng = ws.Range(ws.Cells(2, 9), ws.Cells(lastRow, lastCol))   ' 9 = colonne I
    
    '--- Test visuel
    'rng.Select
    
    '--- Bordures de la plage
    Set b = rng.Borders
    
    '--- Étape 1 : supprimer toutes les bordures
    b(xlDiagonalDown).LineStyle = xlNone
    b(xlDiagonalUp).LineStyle = xlNone
    b(xlEdgeLeft).LineStyle = xlNone
    b(xlEdgeTop).LineStyle = xlNone
    b(xlEdgeBottom).LineStyle = xlNone
    b(xlEdgeRight).LineStyle = xlNone
    b(xlInsideVertical).LineStyle = xlNone
    b(xlInsideHorizontal).LineStyle = xlNone
    
'--- Étape 1 : Recréer des bordures autour de chaque cellule
    With b
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    
''--- Étape 2 : ajouter uniquement celles que tu veux
'    With b(xlEdgeLeft)
'        .LineStyle = xlContinuous
'        .Weight = xlThin
'        .ColorIndex = xlAutomatic
'    End With
'
'    With b(xlEdgeTop)
'        .LineStyle = xlContinuous
'        .Weight = xlThin
'        .ColorIndex = xlAutomatic
'    End With
'
'    With b(xlEdgeBottom)
'        .LineStyle = xlContinuous
'        .Weight = xlThin
'        .ColorIndex = xlAutomatic
'    End With
'
'    With b(xlEdgeRight)
'        .LineStyle = xlContinuous
'        .Weight = xlThin
'        .ColorIndex = xlAutomatic
'    End With
End Sub
 
Oui bien entendu, mais rien ne m’empêche d'envisagé la question.
Toutafé. 😉


Et pour la mise en forme du tableau d'origine (groupage, couleur des lignes et colonnes), il peut les respecter ?
Normalement, oui.
Enfin... plus ou moins, et ce n'est pas forcément évident à mettre en place.

Au départ je ne parlais que de l'encadrement. Et ça c'est hyper simple à faire : il suffit de créer un nouveau type de TS.
Après, tu peux mélanger TS et macro : TS pour l'encadrement, macro pour le reste.
 
@laurent950

En plus court encore pour supprimer les bordures ..... 😉

VB:
Sub Encadrement()

    Dim ws As Worksheet
    Dim rng As Range
    Dim b As Borders
    
    '--- Feuille cible
    Set ws = ThisWorkbook.Worksheets(ActiveSheet.Name)
    
    '--- Dernière ligne utilisée
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    
    '--- Dernière colonne utilisée
    lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
    
    '--- Plage bornée
    Set rng = ws.Range(ws.Cells(2, 9), ws.Cells(lastRow, lastCol))   ' 9 = colonne I
    
    '--- Test visuel
    'rng.Select
    
    '--- Bordures de la plage
    Set b = rng.Borders
    
    '--- Étape 1 : supprimer toutes les bordures
    b.LineStyle = xlNone
    
'    b(xlDiagonalDown).LineStyle = xlNone
'    b(xlDiagonalUp).LineStyle = xlNone
'    b(xlEdgeLeft).LineStyle = xlNone
'    b(xlEdgeTop).LineStyle = xlNone
'    b(xlEdgeBottom).LineStyle = xlNone
'    b(xlEdgeRight).LineStyle = xlNone
'    b(xlInsideVertical).LineStyle = xlNone
'    b(xlInsideHorizontal).LineStyle = xlNone
    
'--- Étape 1 : Recréer des bordures autour de chaque cellule
    With b
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    
''--- Étape 2 : ajouter uniquement celles que tu veux
'    With b(xlEdgeLeft)
'        .LineStyle = xlContinuous
'        .Weight = xlThin
'        .ColorIndex = xlAutomatic
'    End With
'
'    With b(xlEdgeTop)
'        .LineStyle = xlContinuous
'        .Weight = xlThin
'        .ColorIndex = xlAutomatic
'    End With
'
'    With b(xlEdgeBottom)
'        .LineStyle = xlContinuous
'        .Weight = xlThin
'        .ColorIndex = xlAutomatic
'    End With
'
'    With b(xlEdgeRight)
'        .LineStyle = xlContinuous
'        .Weight = xlThin
'        .ColorIndex = xlAutomatic
'    End With
End Sub
 
Merci pour ton exemple de code laurent950 et ta simplification Phil69970.

Par contre je me pose une question sur ce code, si c'est pour une extension du tableau, quel est l’intérêt de supprimer les encadrements déjà existant ?

De mon coté je vois ça comme une opération inutile et supplémentaire, mais il y a peut être un intérêt particulier que je ne comprend pas.
 
si c'est pour une extension du tableau, quel est l’intérêt de supprimer les encadrements déjà existant ?
Dans ce cas il faut passer a la méthode 2

VB:
'--- Étape 2 : ajouter uniquement celles que tu veux (sans effacer celle existante : a paramétrer en amont)
'    With b(xlEdgeLeft)
'        .LineStyle = xlContinuous
'        .Weight = xlThin
'        .ColorIndex = xlAutomatic
'    End With
'
'    With b(xlEdgeTop)
'        .LineStyle = xlContinuous
'        .Weight = xlThin
'        .ColorIndex = xlAutomatic
'    End With
'
'    With b(xlEdgeBottom)
'        .LineStyle = xlContinuous
'        .Weight = xlThin
'        .ColorIndex = xlAutomatic
'    End With
'
'    With b(xlEdgeRight)
'        .LineStyle = xlContinuous
'        .Weight = xlThin
'        .ColorIndex = xlAutomatic
'    End With
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
1
Affichages
312
Réponses
5
Affichages
393
Retour