[VBA] Centrage sur plus. colonnes selon NO Semaine (12 feuilles)

Staple1600

XLDnaute Barbatruc
Bonsoir le forum


Je bute sur un petit souci de mise en forme par VBA
(Centrage sur plusieurs colonnes)

Dans le classeur joint , après l'éxécution de la macro creation
(au passage je suis preneur de tout conseil d'amélioration de cette macro)

je voudrais centrer les numéros de semaine sur plusieurs colonnes
(du Lundi au Dimanche) et ce sur sur les 12 feuilles.

En sachant que pour la première semaine du mois
parfois le centrage doit se faire sur moins de 7 colonnes
(ex février 2008 Semaine 6).

Merci à tous ceux qui voudront s'intéresser à ce petit problème
(que jusqu'à maintenant je résouds manuellement sous VBA)


edit:
Sub Macro1()
'testé sur le mois de février
For Each cell In Range("C19:AE19")
If Not IsEmpty(cell) Then
Range(cell, cell.Offset(0, 7)).HorizontalAlignment = xlCenterAcrossSelection
Range(cell, cell.Offset(0, 7)).VerticalAlignment = xlCenter
End If
Next cell
End Sub

Avec la macro ci-dessus j'ai des soucis pour la dernière semaine du mois de février
(anneé testée 2008)



Bonne soirée

Staple
 
Dernière édition:

Luki

XLDnaute Accro
Re : [VBA] Centrage sur plus. colonnes selon NO Semaine (12 feuilles)

Salut Staple,

une précision stp :

Les feuilles janvier à décembre seront-elle protégées pour se trouver toujours dans le même ordre ou l'utilisateur pourrait-il les déplacer?

Car si c'est le cas ça simplifie le code : pas obligé de passer le nom de la feuille en "dur".Sinon, on fait autrement. C'est pour savoir..:)

A+
 

Staple1600

XLDnaute Barbatruc
Re : [VBA] Centrage sur plus. colonnes selon NO Semaine (12 feuilles)

Bonsoir Luki

Théoriquement les feuilles sont dans l'ordre
(de janvier à décembre)
et je pense effectivement protéger les feuilles (seules les cellues en saisie
seront déprotégées)

J'ai opté pour une création en VBA des 12 feuilles
car avec un classeur contenant déjà 12 feuilles mensuelles
la taille du fichier est plus grande.

Je ne sais quelle option est à privilégier
(feuilles déjà existantes ou création à la volée)

Pour ce qui concerne le centrage
J'ai essayé aussi de voir du coté de Mod
(de compter le nombre de colonnes dans la plage et diviser par 7)
Ca ne m'aide pas pour le moment
 

Luki

XLDnaute Accro
Re : [VBA] Centrage sur plus. colonnes selon NO Semaine (12 feuilles)

Re,

Je pense que la création des feuilles par vba est plus propre, tu maîtrises ainsi mieux les changements.

Pour le centrage, je suis sur a piste de chercher les dimanches (D) en ligne 21. Je pense que c'est jouable.
En mémorisant la dernière semaine centrée, on doit pouvoir passer à la feuille suivante en incrémentant la semaine.

je continue...;)

A+
 

Cousinhub

XLDnaute Barbatruc
Re : [VBA] Centrage sur plus. colonnes selon NO Semaine (12 feuilles)

Bonjour, pour le centrage des semaines, insère ces quelques lignes :

End Select '<====Entre Ici
For Each cel In Sheets(Z).Rows("19:19").SpecialCells(xlCellTypeConstants, 23)
If cel.Offset(1, 6).Value <> "" Then
cel.Resize(1, 7).Merge: cel.HorizontalAlignment = xlCenter
Else
cel.Resize(1, Sheets(Z).[IV20].End(xlToLeft).Column - cel.Column + 1).Merge: cel.HorizontalAlignment = xlCenter
End If
Next cel

Next Z '<======= Et Là
 

Staple1600

XLDnaute Barbatruc
Re : [VBA] Centrage sur plus. colonnes selon NO Semaine (12 feuilles)

Bonsoir ChTi160


J'ai testé ta macro (merci pour ton aide)

et le centrage se fait de 7 colonnes en 7 colonnes
(sans tenir compte du numéro de semaine)

hors il faudrait que le centrage se fasse selon les jours appartenant à une semaine donnée

ex

1 2 3 4 5 6 7 8 9 10 11
J V S D L M M J V S D

Dans cet exemple

Semaine 1 (de 1 à 4) donc centrage sur 4 colonnes
Semaine 2 (5 à 11) donc centrage sur 7 colonnes

D'ou la difficulté de la chose


Je retourne chercher en attendant votre aide.

A plus

Staple
 

Staple1600

XLDnaute Barbatruc
Re : [VBA] Centrage sur plus. colonnes selon NO Semaine (12 feuilles)

Bonsoir bhbh (et merci)


Je voudrais eviter de fusionner les cellules
et privilégier le centrage sur plusieurs colonnes.
Code:
.HorizontalAlignment = xlCenterAcrossSelection

Mais je vais tester ton code de ce pas en essayant de l'adapter.

->bhbh
J'ai testé la fusion se fait bien
sauf pour les semaines incomplètes

J'ai essayé en remplaçant Merge par
Code:
.HorizontalAlignment = xlCenterAcrossSelection
Mais ca ne fonctionne pas

Mais la solution semble proche

Merci à tous.



Staple
 
Dernière édition:

Cousinhub

XLDnaute Barbatruc
Re : [VBA] Centrage sur plus. colonnes selon NO Semaine (12 feuilles)

Sans doute parce que tu as des données complémentaires dans la ligne19.
J'ai fait l'essai avec le classeur fourni, et cela fonctionne parfaitement.
Maintenant, on pourrait limiter la recherche des cellules contenant des constantes de la ligne 19 en mettant par exemple :
For Each cel In Sheets(Z).Range("C19:AF19").SpecialCells(xlCellTypeConstants, 23)
Peut-être?
 

Luki

XLDnaute Accro
Re : [VBA] Centrage sur plus. colonnes selon NO Semaine (12 feuilles)

Re Staple, Cht'i, bhbh.

Une solution macro à lancer après ta création de feuilles.

Par recherche du dimanche dans la plage.

Pas super abouti (sheet activate, un peu lourd :() mais premier jet pour voir.

Tu peux coller le tout (avec la fonction) dans un module et faire des essais. Chez moi ça tourne avec les semaines tronquées (reports d'un mois à l'autre) et pour 2008, j'ai 52 semaines + quelques jours, donc une semaine S53 courte (Et dire que j'ai appris à l'école qu'il y avait 52 semaines dans une année!)

Voilà, dis moi.
Code:
Sub Centrage()
Dim Wks As Worksheet
Dim WorkRg As Range, CenterRg As Range
Dim FirstCell As Range, Lastcell As Range, FirstDimanche As Range
Dim  NumSem As Byte
Dim CutSem As Boolean
Dim i As Byte


    NumSem = 1: CutSem = False
    
For i = 1 To 12
    Worksheets(i).Activate
    CutSem = False
    Set FirstCell = Range("C21")
    Set Lastcell = Range("C21").End(xlToRight)
    Set WorkRg = Range(FirstCell, Lastcell)

    Do
        On Error Resume Next
        Set FirstDimanche = WorkRg(1, NumColDimanche(WorkRg))
        If Err.Number <> 0 Then Set FirstDimanche = WorkRg(1, WorkRg.Count): CutSem = True
        Set CenterRg = Range(WorkRg(1, 1).Offset(-2, 0), FirstDimanche.Offset(-2, 0))
        On Error GoTo 0
        
            With CenterRg
                .Cells(1, 1) = "S" & NumSem
                .HorizontalAlignment = xlCenterAcrossSelection
                .VerticalAlignment = xlCenter
                .WrapText = False
                .Orientation = 0
                .AddIndent = False
                .ShrinkToFit = False
                .MergeCells = False
            End With
            Set WorkRg = Range(FirstDimanche.Offset(0, 1), Lastcell)
            If Not CutSem Then NumSem = NumSem + 1
            
    Loop Until FirstDimanche.Column = Lastcell.Column
    
Next i


End Sub


Function NumColDimanche(Rg As Range) As Byte
    NumColDimanche = Application.Match("D", Rg, 0)
End Function
A+

Edit : viré 2 variables inutiles des déclarations!
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : [VBA] Centrage sur plus. colonnes selon NO Semaine (12 feuilles)

Re


->bhbh
Ce qui fonctionne c'est Merge
Pas le centrage sur plusieurs colonnes
(.HorizontalAlignment = xlCenterAcrossSelection)

En plus je ne suis pas sur pour les numéros de semaines
Est-ce que la première semaine d'un mois de janvier
peut avoir le numéro 53
ou est-ce toujours 1


->Luki: je vais tester ta solution de ce pas

edit:Cela fonctionne trés bien.


Mais j'ai toujours ce doute

Le numéro de la première semaine du mois janvier d'une année X
est-il toujours 1 (ou peut-il être 53)?

J'ai une autre question: (pour le fun..) (en fait ca fait deux questions)
Vaut-il mieux (et est-ce plus rapide) créer la feuille Janvier de A à Z en VBA?
(cad cellules+format+bordure en VBA) puis la copier 12 fois
Ou est-il plus approprié d'ajouter 12 feuilles, de les renommer mensuellement, de créer leur contenu puis de les formater et enfin de protéger le classeur? (tout cela en VBA)
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 668
Messages
2 090 739
Membres
104 643
dernier inscrit
adriano22