アナログ時計フォームをポップアップして、時刻入力を行なう関数です。
『VBA Only』
ktSelClock( 時刻, [AMPM], [Title], [Pos_X], [Pos_Y] )
返却値 ‥‥‥ Boolean型 時 刻 ‥‥‥ Date 型(ByRef) AMPM ‥‥‥ String 型(省略可、 既定値:"AMPM" ) Title ‥‥‥ String 型(省略可) Pos_X ‥‥‥ Variant(Integer / Empty )型(省略可) Pos_Y ‥‥‥ Variant(Integer / Empty )型(省略可)
時刻が選択された場合は返却値として True が返ります。
入力キャンセルした場合は False が返ります。
時 刻 ‥‥‥ この項目に選択した時刻が設定されて呼び元に返されます。
呼び元での変数定義が必要です。
AMPM ‥‥‥ 24時以上の入力可否とフォーム初期表示の際に選択しておく『時』を
指定します。
省略/"AMPM":マシン時刻に合わせて午前/午後を切り替え
初期選択[時]はマシン時刻[時]
"AM" :午前のマシン時刻[時]で初期表示
"PM" :午後のマシン時刻[時]で初期表示
"0"〜"11" :午前の指定[時]で初期表示
"12"〜"23" :午後の 〃
"24"〜"35" :翌日午前の指定[時]で初期表示
"36"〜"47" :翌日午後の 〃
既定では、入力できる時刻は[0:00〜23:59]ですが、上記の指定値の
末尾に"#"を付加すると[0:00〜47:59]の範囲の入力が可能になります。
(AMPM="24"〜"47"の場合には"#"を付けなくてもOKです)
(注) [0〜47]に # を付ける場合、必ずクォーテーションで囲んで文字列
として下さい("3#", "15#" etc)。
3# と記述すると、Double 型数値の[3]という風に、 # が型宣言
文字と解釈されてしまいます。
Title ‥‥‥ ここに指定した文字列がキャプション部分に表示されます。
全角12文字/半角20文字程度まで指定できます。
省略時はフォーム名である[ktFormCLock]が表示されます。
Pos_X
および
Pos_Y‥‥‥ 時計フォームを画面のどの位置に表示するかを指定するパラメータです。
UserForm のプロパティ(Left / Top )で指定する値です。
一方もしくは両方を省略すると『オーナーフォーム中央』に表示します。
または、一方 もしくは 両方に Empty 値 を指定した場合も、省略 と
同じ扱いで『 オーナーフォーム中央 』 に表示します。
参考:表示位置によるPos_X および Pos_Y の値(1024×768サイズの画面)
画面全体の左上 ‥‥‥ Pos_X=0 , Pos_Y=0
〃 中央 ‥‥‥ Pos_X=300 , Pos_Y=170
〃 右下 ‥‥‥ Pos_X=580 , Pos_Y=350
『B10セルの上 』 などの位置指定が必要な場合は、ktCell2Position 関数
によって、セル座標を フォーム座標(X&Y) に変換してください。
従来の時刻入力コントロールは、DropDownListから選択したり、SpinButtonで時/分の値を
変更する方式が一般的でしたが、この【ktSelClock 】関数により、
・アナログ時計を模した時計盤フォームがポップアップ
・AM/PM(&当日/翌日)はオプションボタンで切り替え
・「時」は1〜12の時刻文字を『右クリック』で選択
・後は、その時計盤上でマウスを滑らせれば「分」が[0〜59]の間でリアルタイムに変化
・3時の位置にマウスカーソルを置けば、それだけで「15分」
・入力する時刻の位置にマウスを合わせたら、その場所でクリックすれば、それで時刻が
取り込まれます
・時計盤の下には【現在日時】が表示されます(マウスを動かしている限りはリアルタイムで
更新されます)
・【現在日時】の上でマウスクリックすると、『現在時刻(時&分)』で取り込まれます。
【現在日時】上にマウスがある時は、時計盤中央の「選択時刻」も現在時刻になります。
という風に直感的/視覚的なマウス操作で時刻入力が可能です。
(注) 時刻文字【付近】では「5分単位」の
値になります。[1分]とか[4分]等は、
時刻文字の近くでは反応しませんので、
少し内側を探って下さい。
Dim MyTime As Date
--- 基本形 ---
If ktSelClock(MyTime, "AMPM", Format(Date, "yyyy/m/d")) Then
xxxx = MyTime
または
xxxx = Format(MyTime, "hh:mm")
または
xxxx = WorksheetFunction.Text(MyTime, "[h]:mm")
End If
(注) VBAのFormat関数での時刻書式では24時以上の値を指定しても
0〜23時にしか編集されません。24時以上の時刻入力が考えられる
場合は、ワークシートの[TEXT関数]を利用して編集してください。
--- パラメータの指定パターン例 ---
(1) 省略できるパラメータを全て省略
ktselClock(MyTime)
マシン時刻に合わせて午前/午後で初期表示されます。
これは、下記の指定と同じ意味になります。
ktSelClock(MyTime, "AMPM", "")
(2) 午前/午後を指定して初期表示
ktSelClock(MyTime, "AM")
または
ktSelClock(MyTime, "PM")
(3) 24時以降も入力できるようにする
ktSelClock(MyTime, "AM#")
または
ktSelClock(MyTime, "PM#")
または
ktSelClock(MyTime, "AMPM#")
(4) 予め指定の時刻を選択した状態で表示する
ktSelClock(MyTime, "3")
ktSelClock(MyTime, "3#")
ktSelClock(MyTime, "28") など
(5) 現在時刻を予め選択した状態で表示する
ktSelClock(MyTime, Hour(Now))
または
ktSelClock(MyTime, Hour(Now) & "#")
----------------------------------------------------------------------------
【利用コード例】
[DblClick]アクションを無効にする為に『Cancel = True 』は必須です。
(1) テキストボックスでの利用例
UserFormの場合は、そのUserFormのモジュールに、シート上のコントロールの
場合は、そのシートのモジュールに記述してください。
TextBox1 をダブルクリックすると時刻入力フォームを表示して、入力した時刻
を編集してTextBox1に設定します。なお、Format関数では24時以上の編集が
出来ませんので、ワークシート関数の[Text ]を利用します。
Private Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim MyTime As Date
If ktSelClock(MyTime, Hour(Now)) Then
TextBox1.Value = WorksheetFunction.Text(MyTime, "[h]:mm")
End If
Cancel = True
End Sub
(2) ワークシートでの利用例(その1)
そのシートのモジュールに記述して下さい。
セルをダブルクリックすると時刻入力フォームを表示して、時刻を入力します。
入力した内容は、ダブルクリックしたセルの「表示形式」で表示されます。
Private Sub Worksheet_BeforeDoubleClick _
(ByVal Target As Range, Cancel As Boolean)
Dim MyTime As Date
If ktSelClock(MyTime, Hour(Now)) Then
Target.Value = MyTime
End If
Cancel = True
End Sub
(3) ワークシートでの利用例(その2)
そのシートのモジュールに記述して下さい。
上記に、表示形式の指定を追加した例です。
Private Sub Worksheet_BeforeDoubleClick _
(ByVal Target As Range, Cancel As Boolean)
Dim MyTime As Date
If ktSelClock(MyTime, Hour(Now) & "#") Then
Target.NumberFormatLocal = "[h]:mm"
Target.Value = MyTime
End If
Cancel = True
End Sub
(4) ワークシートでの利用例(その3)
そのシートのモジュールに記述して下さい。
ダブルクリックで時刻入力するセルを限定(B5セル)する場合の例です。
Private Sub Worksheet_BeforeDoubleClick _
(ByVal Target As Range, Cancel As Boolean)
Dim MyTime As Date
If (Target.Address = "$B$5") Then
If ktSelClock(MyTime, Hour(Now) & "#") Then
Target.NumberFormatLocal = "[h]:mm"
Target.Value = MyTime
End If
Cancel = True
End If
End Sub
[Cancel = True]を記述する位置に注意して下さい。B5セル以外では
『ダブルクリックでセルへのキー入力』は有効にしなければなりません。
(5) ワークシートでの利用例(その4)
そのシートのモジュールに記述して下さい。
ダブルクリックで時刻入力するセルを限定(C列)する場合の例です。
Private Sub Worksheet_BeforeDoubleClick _
(ByVal Target As Range, Cancel As Boolean)
Dim MyTime As Date
If (Target.Column = 3) Then
If ktSelClock(MyTime, Hour(Now) & "#") Then
Target.NumberFormatLocal = "[h]:mm"
Target.Value = MyTime
End If
Cancel = True
End If
End Sub
[Cancel = True]を記述する位置に注意して下さい。C列以外では
『ダブルクリックでセルへのキー入力』は有効にしなければなりません。
(6) ワークシートでの利用例(その5)
そのシートのモジュールに記述して下さい。
実際に業務で利用する場合は、下記のような工夫をして下さい。
ダブルクリックしたセルに時刻が入っていない場合は、1行上のセルの時刻
で初期表示する。明細の1行目の場合は、そこがタイトル行になるが、
『時刻データ以外』なので、1行目は「本日の年月」で表示される。
Private Sub Worksheet_BeforeDoubleClick _
(ByVal Target As Range, Cancel As Boolean)
Dim strAMPM As String
Dim MyTime As Date
If (Target.Column = 3) Then
If (Target.Value = "") Then
If (Target.Offset(-1, 0).Value = "") Then
strAMPM = "AMPM#"
' 時刻データかを判定
ElseIf Not IsError(WorksheetFunction. _
Text(Target.Offset(-1, 0).Value, "[h]")) Then
strAMPM = WorksheetFunction. _
Text(Target.Offset(-1, 0).Value, "[h]") & "#"
Else
strAMPM = "AMPM#"
End If
' 時刻データかを判定
ElseIf Not IsError(WorksheetFunction.Text(Target.Value, "[h]")) Then
strAMPM = WorksheetFunction.Text(Target.Value, "[h]") & "#"
Else
strAMPM = "AMPM#"
End If
If ktselclock(MyTime, strAMPM) Then
Target.NumberFormatLocal = "[h]:mm"
Target.Value = MyTime
End If
Cancel = True
End If
End Sub
[Cancel = True]を記述する位置に注意して下さい。C列以外では
『ダブルクリックでセルへのキー入力』は有効にしなければなりません。
(7) ワークシートでの利用例(その6)
カーソルを「そのセル」に移しただけで、ポップアップさせたい場合は、
「Worksheet_BeforeDoubleClick」イベントの代わりに「Worksheet_SelectionChange」
イベントを使ってください。この場合は[Cancel]引数 が有りませんので、
『Cancel = True 』ステップは不要です。
(8) ワークシートでの利用例(その7)
ダブルクリックしたセルの付近にポップアップします。
Private Sub Worksheet_BeforeDoubleClick _
(ByVal Target As Range, Cancel As Boolean)
Dim MyTime As Date
Dim vntPos As Variant
Dim vntTop As Variant
Dim vntLeft As Variant
vntPos = ktCell2Position(Target)
'ウィンドウの表示範囲内かをチェック(このダブルクリック例では実際には不要)
If IsError(vntPos) Then
'表示範囲外 ⇒ Top/Left を省略(Empty)
vntTop = Empty
vntLeft = Empty
Else
vntTop = vntPos(0) + 5
vntLeft = vntPos(1) + 5
End If
If ktSelClock(MyTime, Hour(Now) & "#", _
Pos_X:=vntLeft, Pos_Y:=vntTop) Then
Target.NumberFormatLocal = "[h]:mm"
Target.Value = MyTime
End If
Cancel = True
End Sub
(9) F5セルの付近に表示する
Dim vntPos As Variant
Dim vntTop As Variant
Dim vntLeft As Variant
vntPos = ktCell2Position(ActiveSheet.Range("F5"))
If IsError(vntPos) Then
'F5 セル が 表示範囲外 ⇒ Top/Left を省略(Empty)
vntTop = Empty
vntLeft = Empty
Else
vntTop = vntPos(0) + 5
vntLeft = vntPos(1) + 5
End If
If ktSelClock(MyTime, Hour(Now) & "#", _
Pos_X:=vntLeft, Pos_Y:=vntTop) Then
:
: