Vous utilisez un navigateur obsolète. Il se peut que ce site ou d'autres sites Web ne s'affichent pas correctement. Vous devez le mettre à jour ou utiliser un navigateur alternatif.
Autres[RÉSOLU] Qu'est-ce qui ne va pas dans la macro Centrer Rectangles?
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 !
J'ai gratté encore un peu et ça fonctionne
Toutes mes excuses
Ou alors il y a mieux à faire je suis preneur
Cordialement
VB:
Sub CentrerRectangles()
Dim Largeur_Totale As Double, Espacement As Double, Largeur_Cumulee_des_Boutons As Double
Dim Shp1 As Shape, Shp2 As Shape
Set Shp1 = ActiveSheet.Shapes("Rectangle 2")
Set Shp2 = ActiveSheet.Shapes("Rectangle 1")
'Calcul des largeurs
Largeur_Totale = Range("H1").Left
Largeur_Cumulee_des_Boutons = Shp1.Width + Shp2.Width
'Calcul des espacements de part et d'autre de chaque bouton
Espacement = (Largeur_Totale - Largeur_Cumulee_des_Boutons) / 3
'Centrage horizontal
Shp1.Left = Range("A1").Left + Espacement
Shp2.Left = Range("A1").Left + Shp1.Width + (2 * Espacement)
End Sub
Private Sub Workbook_Open()
Dim Sh As Worksheet, An%
An = Year(Date)
For Each Sh In ThisWorkbook.Worksheets
Sh.Visible = IIf(Sh.Name = "Retraites " & An, xlSheetVisible, xlSheetVeryHidden)
Next
Range("A1").Select
Application.OnTime 1, "Centrer" 'lance la macro
End Sub
Et celle-ci dans Module1 qui tourne en arrière-plan :
VB:
Sub Centrer()
Dim t#, d, x#
Do
t = Timer + 1 'attente 1 seconde
While Timer < t And Timer < 86400: DoEvents: Wend
Set d = ActiveSheet.DrawingObjects
If d.Count > 1 Then
x = ([A1].MergeArea.Width - d(1).Width - d(2).Width) / 3
d(1).Left = x: d(1).Top = ([A1].Height - d(1).Height) / 2
d(2).Left = d(1).Width + 2 * x: d(2).Top = ([A1].Height - d(2).Height) / 2
End If
Loop
End Sub
Ouvrez le fichier joint et voyez ce qui se passe si vous déplacez les rectangles.
En intervertissant les objets et en évitant le "gap" du début :
VB:
Sub Centrer()
Dim d, x#, t#
Do
Set d = ActiveSheet.DrawingObjects
If d.Count > 1 Then
x = ([A1].MergeArea.Width - d(1).Width - d(2).Width) / 3
d(2).Left = x: d(2).Top = ([A1].Height - d(2).Height) / 2
d(1).Left = d(2).Width + 2 * x: d(1).Top = ([A1].Height - d(1).Height) / 2
End If
t = Timer + 1 'attente 1 seconde
While Timer < t And Timer < 86400: DoEvents: Wend
Loop
End Sub
Bonjour job 75
Lorsque j'ai mis à zéro le programme j'ai supprimé par inadvertance le titre et ça change tout pour ta macro
Toutes mes excuses
Je fais que des C$$$$$$$S actuellement
Cordialement
Le titre ne pose guère de problème et s'il n'y a qu'un rectangle à centrer on utilisera :
VB:
Sub Centrer()
Dim d, x#, t#
Do
Set d = ActiveSheet.DrawingObjects
If d.Count = 1 Then
x = ([A1].MergeArea.Width - d(1).Width) / 2
d(1).Left = x: d(1).Top = 16 + ([A1].Height - d(1).Height - 16) / 2
ElseIf d.Count > 1 Then
x = ([A1].MergeArea.Width - d(1).Width - d(2).Width) / 3
d(2).Left = x: d(2).Top = 16 + ([A1].Height - d(2).Height - 16) / 2
d(1).Left = d(2).Width + 2 * x: d(1).Top = 16 + ([A1].Height - d(1).Height - 16) / 2
End If
t = Timer + 1 'attente 1 seconde
While Timer < t And Timer < 86400: DoEvents: Wend
Loop
End Sub
Par ailleurs pour naviguer entre les feuilles on peut utiliser ces 2 macros :
VB:
Sub Precedente()
'se lance par les touches Ctrl+P
On Error Resume Next
With ActiveSheet
Sheets(.Index - 1).Visible = xlSheetVisible
Sheets(.Index - 1).Activate
.Visible = xlSheetVeryHidden
End With
End Sub
Sub Suivante()
'se lance par les touches Ctrl+S
On Error Resume Next
With ActiveSheet
Sheets(.Index + 1).Visible = xlSheetVisible
Sheets(.Index + 1).Activate
.Visible = xlSheetVeryHidden
End With
End Sub
Elles se lancent par les touches de raccourci Ctrl+P et Ctrl+S.
J'ai aussi revu la macro Workbook_Open car elle pouvait beuguer.
Bonjour job75
Super ça fonctionne effectivement il y avait quelques bugs
Je vais regarder ça de plus près
Merci pour ton implication pour le nonagénaire
Bonne fin de WE
Cordialement
Cette macro va bien même si l'on n'ouvre pas le fichier pendant plusieurs années :
VB:
Private Sub Workbook_Open()
Dim Sh As Worksheet, An%, A%
An = Year(Date)
Do While Not FeuilleExiste("Retraites " & An)
A = An
Do
A = A - 1
If A < 2000 Then MsgBox "Pas de feuilles !!": Exit Sub 'sécurité
Loop While Not FeuilleExiste("Retraites " & A)
With Sheets("Retraites " & A): .Visible = xlSheetVisible: .Select: End With
NouvelleAnnee 'lance la macro autant de fois qu'il le faut
Loop
Sheets("Retraites " & An).Visible = xlSheetVisible
For Each Sh In Worksheets
If Sh.Name <> "Retraites " & An Then Sh.Visible = xlSheetVeryHidden
Next
Range("A1").Select
Application.OnTime 1, "Centrer" 'lance la macro
End Sub
Cette macro va bien même si l'on n'ouvre pas le fichier pendant plusieurs années :
VB:
Private Sub Workbook_Open()
Dim Sh As Worksheet, An%, A%
An = Year(Date)
Do While Not FeuilleExiste("Retraites " & An)
A = An
Do
A = A - 1
If A < 2000 Then MsgBox "Pas de feuilles !!": Exit Sub 'sécurité
Loop While Not FeuilleExiste("Retraites " & A)
With Sheets("Retraites " & A): .Visible = xlSheetVisible: .Select: End With
NouvelleAnnee 'lance la macro autant de fois qu'il le faut
Loop
Sheets("Retraites " & An).Visible = xlSheetVisible
For Each Sh In Worksheets
If Sh.Name <> "Retraites " & An Then Sh.Visible = xlSheetVeryHidden
Next
Range("A1").Select
Application.OnTime 1, "Centrer" 'lance la macro
End Sub
- 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