|
▼えいち さん:
こんばんは。
>アナログ時計表示をさせたいと"width"や"height"利用して、シェイプの角度を変えたりなんだかんだしたりして、針を表現しようとしましたが、mmm難しいです。
>
>仮に、セル "A1" に、任意の時間(hh:mm:ss)が入力されているとして、マクロを実行したとき、 その時刻をアナログ時計で表現したいのです。
>(実際の時間に合わせて1秒1秒動く必要はない)
例題にすぎません。装飾はしていませんが・・・。
丸い時計をイメージして見ました。
長針も短針も秒針もただの線です。
'============================================================
Sub main()
Call Mk_en(ActiveSheet, 300, 100, 80) ' 丸い時計のつもり
disp_time = Now()
For idx = 1 To 5
Call mk_analog_clock(ActiveSheet, 300, 100, disp_time) '時計の針の設定
DoEvents
MsgBox Format(disp_time, "hh:mm:ss")
disp_time = disp_time + TimeSerial(1, 5, idx) '時刻を少しづつ進ませました
Next
End Sub
'==================================================================
Sub Mk_en(sht As Worksheet, x As Double, y As Double, rs As Double)
'円を作成する
'sht-----作成するシート
'x,y-----中心座標
'rs------半径
pai = WorksheetFunction.pi
With sht.Shapes.BuildFreeform(msoEditingAuto, x + rs, y)
For idx = 0.15 To 2 * pai Step 0.001
.AddNodes msoSegmentLine, msoEditingAuto, x + rs * Cos(idx), y + rs * Sin(idx)
Next idx
Set para = .ConvertToShape
para.Fill.Visible = msoFalse
End With
End Sub
'========================================================================
Sub mk_analog_clock(sht As Worksheet, x As Double, y As Double, disp_time)
'短針、長針、秒針の設定
'sht-----作成するシート
'x,y-----中心座標
'disp_time--時刻のシリアル値
On Error Resume Next
Dim pi As Double
pi = WorksheetFunction.pi
sht.Shapes.Range(Array("h_hand", "m_hand", "s_hand")).Delete
h_rad = ((Hour(disp_time)) * 60 + Minute(disp_time) - 180) / 1440 * pi * 4 '短針の角度の計算
Call mk_line(sht, "h_hand", x, y, x + 50 * Cos(h_rad), y + 50 * Sin(h_rad), 1.5)
m_rad = (Minute(disp_time) - 15) / 60 * pi * 2 '長針の角度の計算
Call mk_line(sht, "m_hand", x, y, x + 65 * Cos(m_rad), y + 65 * Sin(m_rad), 1.5)
s_rad = (Second(disp_time) - 15) / 60 * pi * 2 '秒針の角度計算
Call mk_line(sht, "s_hand", x, y, x + 65 * Cos(s_rad), y + 65 * Sin(s_rad), 1)
End Sub
'=========================================================================
Sub mk_line(sht As Worksheet, nm As String, x1 As Double, y1 As Double, x2 As Double, y2 As Double, we, Optional vh As Long = 0)
'線を引く
Set Ln = sht.Shapes.AddLine(x1, y1, x2, y2)
Ln.Line.Weight = we '線の太さ
If vh = 1 Then
Ln.Width = 0#
ElseIf vh = 2 Then
Ln.Height = 0#
End If
Ln.Name = nm
End Sub
後は、線の形を矢印にしたり、円に半透明の色を付けたり
工夫してみて下さい
まずは、確認してみて下さい。
|
|