ktSelClock

アナログ時計フォームをポップアップして、時刻入力を行なう関数です。
『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
        :
        :


Home  kt関数 Top  kt関数 Ref  Back Page  Next Page


角田 桂一 Mail:addinbox@h4.dion.ne.jp CopyRight(C) 2001 Allrights Reserved.