.
Présentation
Jusqu'ici, nous avons joué sous Excel, à repeinturlurer les cellules d'une feuille. Histoire de varier les plaisirs, voici un p'tit programme VBA destiné à fonctionner sous Word. Il s'agit d'une horloge analogique, autrement dit "à aiguilles", entièrement créée par code.
Si vous êtes pressé(e)s de la voir à l'oeuvre, vous pouvez commencer par l'intégrer à un nouveau document, et vous préoccuper des explications ultérieurement. Sinon, elles figurent sous ce code..
Le Code
Démarrez Word (version 2000 ou supérieure), ouvrez un nouveau document (vierge), et lancez l'éditeur VBA via le menu Outils > Macros, ou les touches Alt-F11. Repérez (ou affichez) l'explorateur de projets, et double-cliquez sur "ThisDocument". Ceci ouvre une fenêtre de code "ThisDocument (Code)". Effacez les lignes qui s'y trouveraient éventuellement, et collez le code ci-dessous.
Enregistrez (l'icône disquette ou Ctrl-S) le document, refermez l'éditeur VBA, ainsi que le document sauvegardé. Vérifiez au besoin (menu Outils > Macros > Sécurité) que le niveau de sécurité des macros ne soit pas sur "haut". Rouvrez le document, le code devrait démarrer, moyennant peut-être de valider "Activer les macros"..
' -----------------
' Zone Déclarations
' -----------------
Dim TD As Document
Const Cte = 1.74532925194444E-02
' -----------------------
' SUB: Horloge Analogique
' -----------------------
Private Sub Document_Open()
Set TD = ThisDocument
TD.Content.Delete
' Création Décor
With TD.Shapes
.AddShape(msoShapeOval, 50, 50, 500, 500).Name = "TR"
.AddLine(300, 300, 400, 300).Name = "LH"
.AddLine(300, 300, 480, 300).Name = "LM"
.AddLine(300, 300, 500, 300).Name = "LS"
For T = 0 To 11
.AddLine(200, 200, 210, 200).Name = "S" + Chr$(65 + T)
Next T
End With
With TD.Shapes("TR").Line
.ForeColor = &HFF99CC: .Weight = 3
End With
With TD.Shapes("LH").Line
.ForeColor = &HA000&: .Weight = 15
End With
With TD.Shapes("LM").Line
.ForeColor = &HA00000: .Weight = 9
End With
With TD.Shapes("LS").Line
.ForeColor = &HA0: .Weight = 3
End With
For T = 0 To 11
Z$ = "S" + Chr$(65 + T): Aig Z$, 235, 30 * T
Aig Z$, IIf(T Mod 3, 225, 215), 30 * T, 1
With TD.Shapes(Z$).Line
.ForeColor = &H8000A0: .Weight = 7
End With
Next T
' Boucle infinie
Do
' Attendre nouvelle seconde
Do: K! = Int(Timer): DoEvents: Loop While K! = K0!: K0! = K!
' Décomposition
HH! = K! / 3600: MM! = K! / 60 - 60 * Int(HH!): SS! = K! Mod 60
' Aiguilles
Aig "LH", 100, 30 * HH!: Aig "LM", 180, 6 * MM!
Aig "LS", 200, 6 * SS!
Loop
End Sub
' ------------------------------------
' SUB: Déplacer une Extrémité de Ligne
' ------------------------------------
Sub Aig(Nom$, Lg, Ang, Optional No = 2)
TD.Shapes(Nom$).Nodes.SetPosition No, _
300 + Lg * Sin(Ang * Cte), 300 - Lg * Cos(Ang * Cte)
End Sub
Explications
Nous allons utiliser les objets de dessin dont dispose Word, un cercle (TR) pour le cadran, et une série de traits pour le reste, aiguilles et repères. Word regroupe ces objets dans une Collection nommée Shapes. Nous allons invoquer des méthodes de création ".AddKekchose()", lesquelles renvoient l'objet ainsi créé. Au passage, nous renommerons chaque objet, afin de nous y référer facilement ensuite, par exemple pour leur définir l'épaisseur ou la couleur.
Nous créons ainsi les trois aiguilles: heures (LH), minutes (LM), secondes (LS) dont nous positionnons d'entrée le point de départ au centre de notre horloge. De même une boucle génèrera les 12 segments horaires, de 0 heure à 11 heures. Les segments d'heures multiples de 3 (donc 0, 3, 6, et 9) seront plus longs. Ces segments de nomment de "SA" (0 heure) à "SL" (11 heures).
Pour des raisons de commodité, nous travaillerons avec des angles en degrés, auxquels nous appliquerons la constante de conversion en radians (PI/180), l'unité des fonctions COS() et SIN() de VB. En effet, une heure correspond à un angle de 30 degrés, une minute ou seconde (horaire) à 6 degrés.
Petit rappel de géométrie: imaginons les deux axes, se croisant au centre de l'horloge, celui des x en direction de 3h, celui des y en direction de 0h. L'angle en degrés correspond à la rotation de l'aiguille depuis 0h, donc le nombre d'heures, minutes, ou secondes, à leur coefficient près. La projection de l'aiguille sur l'axe des x est sa longueur multipliée par le Sinus de son angle de rotation, celle sur l'axe des y sa longueur multipliée par le cosinus.
C'est la Procédure "Aig" qui va assurer ces calculs. Les Paramètres communiqués à Aig sont:
- le nom de l'objet concerné,
- la longueur, ou distance entre le point à calculer et le centre de l'horloge,
- l'angle en degrés, comme expliqué ci-dessus,
- un paramètre optionnel, qui vaut 2 lorsqu'il est omis. Ce dernier représente le numéro de l'extrémité à recalculer, l'extrémité 1 des aiguilles étant, rappelez-vous, fixée au centre. Ce paramètre optionnel nous servira pour les repères horaires.
Reste à récupérer et convertir en angles les heure, minute et seconde courantes. Pour cela, deux variables, l'une (K!) mémorisant le Timer et l'autre (K0!) servant de point de comparaison, afin de ne réactualiser l'affichage des aiguilles que s'il a évolué.
Le Timer est une fonction numérique qui fournit le nombre de secondes écoulées depuis minuit, centièmes compris, mais nous allons les ignorer ici. Une boucle acquiert le Timer jusqu'à ce qu'il diffère (d'au moins une seconde) de la précédente valeur mémorisée. Contrairement à l'aiguille des secondes, celles des heures et des minutes ne sautent pas d'une unité à l'autre, mais bougent progressivement. Par exemple, lorsqu'il est la demie, l'aiguille des heures est à mi-chemin entre la graduation courante et la suivante.
Une heure vaut 60 minutes, donc 3600 secondes. Le nombre d'heures est le 1/3600ème du Timer. Le nombre de minutes est le 1/60ème du Timer, débarrassé du nombre d'heures entières. Le nombre de secondes est le reste dans le regroupement par 60.
-MyLzz59-
5 Commentaire(s):
:D
bon j ai pas tout compris des explications! (malgré des cours ..particuliers!) mais on progresse! (ouais , je sais, manquerait plus que je regresse!!! :D)
;-)
:*
Dis, on s'y recolle quand ? :P
-MyLzz59-
:D :D :D!
Galopin, va :D :D :D
(je rigole ;))
-MyLzz59-
;-)
Enregistrer un commentaire