Bordures via VBA complexes
Bonjour au forum,
Je cherche à automatiser la mise en forme des bordures de mon tableau lors de la mise à zéro de mon fichier.
J'ai testé de multiples codes mais je n'arrive définitivement pas à mes fins...
Ci-joint le fichier exemple avec la base de mon code dans le module1, la mise en forme affichée sur mes 3 feuilles est celle que je souhaite re-créer par vba.
Merci pour votre aide.
Bonjour,
Ouf !
- Les bordures diagonales ! Si tu n'en as pas : inutile de les supprimer !!
- La couleur (xlAutomatic), tu ne changes rien, donc inutile de le mentionner ! Ce sera celle-là !
La majorité de tes bordures sont en xlThin, donc d'un seul coup :
- B15:T33 => .Borders : tu mets tout en xlThin
Il ne reste plus qu'à rectifier ce qui ne l'est pas :
- les plages à entourer : une est à traiter séparément : B15:T16 => .BorderAround xlContinuous, xlThick
- les autres sont semblables donc tu cadres sur la première et tu traites en boucle :
For i = 0 To 12 Step 4
.Offset(i) => BorderAround.... xlThick
Next i
End With
(code un peu simplifié, mais tu peux rétablir...)
Et il ne reste enfin que tes lignes xlDashDotDot en xlThin, que je n'ai pas vues du tout dans ton code... !
- que tu peux tenter de traiter dans une boucle comme précédemment, en partant d'une plage C19:T20, mêmes décalages que la boucle précédente : le bord à définir est .Borders(InsideHorizontal)
Je ne sais si ça marchera ou si la fusion bloquera cette manoeuvre, mais ça se tente. En cas d'erreur, on dédouble le traitement : une boucle pour la partie fusionnées et une pour la partie non fusionnée.
En fait ton code afférent n'est pas si long mais tu t'arrêtes ligne 25 ? (s'il s'agit d'une tableau extensible selon besoins, ce serait 21, sinon le tout) et tu ne fais pas tout !
Bon... Cordialement.
Bonjour le forum,
MFerrand,
Merci pour ta réponse
J'ai encore quelques difficultés avec les boucles, j'imagine que cette écriture n'est pas correcte ?
With ws.Range("B18:T123").Borders
.LineStyle = xlContinuous
.Weight = xlThin
End With
With ws.Range("B18:T21")
For i = 0 To 12 Step 4
.Offset(i).BorderAround.Weight = xlThick
Next i
End With
With ws.Range("C19:T20")
For i = 0 To 12 Step 4
.Offset(i).BordersInsideHorizontal
.LineStyle = xlDashDotDot
.Weight = xlThin
Next i
End With
Bonjour,
Ton 123 m'étonne un peu, mais je ne rectifie que la syntaxe des .Borders...
With ws.Range("B18:T123").Borders
.LineStyle = xlContinuous
.Weight = xlThin
End With
With ws.Range("B18:T21")
For i = 0 To 12 Step 4
.Offset(i).BorderAround xlContinuous, xlThick
Next i
End With
With ws.Range("C19:T20")
For i = 0 To 12 Step 4
With .Offset(i).Borders(InsideHorizontal)
.LineStyle = xlDashDotDot
.Weight = xlThin
End With
Next i
End With
Cordialement.
Bonjour MFerrand,
Merci pour ta réponse.
J'ai une erreur sur cette ligne (Erreur d'execution 1004 : Erreur définie par l'application ou par l'objet) :
With .Offset(i).Borders(InsideHorizontal)
Le T123 concerne en fait mon fichier original dont le tableau comporte 123 lignes
Si tu as le temps, pourrais-tu m'expliquer le code des boucles que tu utilises ?
En regardant les cours sur le site, je comprends que :
For i = 0 To 12 Step 4
signifie que pour la ligne 0 à la ligne 12 de la plage i, on applique le style de bordure, en incrémentant de 4 à chaque fois ?
La constante est xlInsideHorizontal.
Rectifie pour voir si l'erreur 1004 ne provient que de là.
J'ai écrit et testé le code résultant du contenu de mon premier post :
Sub Bordures()
Dim i%
With ActiveSheet
With .Range("B15:T33").Borders
.LineStyle = xlContinuous
.Weight = xlThin
End With
.Range("B15:T16").BorderAround xlContinuous, xlThick
With .Range("B18:T21")
For i = 0 To 12 Step 4
.Offset(i).BorderAround xlContinuous, xlThick
Next i
End With
With .Range("C19:P20")
For i = 0 To 12 Step 4
With .Offset(i).Borders(xlInsideHorizontal)
.LineStyle = xlDashDotDot
.Weight = xlThin
End With
Next i
End With
End With
End Sub
Il fonctionne, donc tu ne devrais pas avoir d'autre erreur.
Dans une boucle de 0 à 12 de pas 4, i va prendre les valeurs 0, 4, 8, 12
Ici ces valeurs successives définissent un décalage d'une plage de cellules en l'appliquant à .Offset(i) : le décalage 0 est la plage initiale elle-même, les valeurs suivantes définissent une plage décalée de 4 lignes de plus à chaque tour.
Cordialement.
Bonjour MFerrand,
Merci beaucoup pour la réctif, ça fonctionne à merveille
Merci également pour tes explications, c'est plus clair pour moi maintenant
Bonne soirée !