ktCalDate

カレンダー入力フォームをポップアップして、日付入力を行なう関数です。
一緒に時刻を入力させる事もできます。

『VBA Only』
[デモアニメ]    [六曜モードデモ]

【 構 文 】

ktCalDate( 日付, [基準日], [休日Map], [Pos_X], [Pos_Y],
[入力Msg], [営休制限], [期間制限Fr], [期間制限To],
[六曜], [時刻] )

返却値 ‥‥‥ Boolean型
日  付 ‥‥‥ Date 型 (ByRef)
基準日 ‥‥‥ Variant(Date 又は 日付文字列)型    (省略可)
休日Map ‥‥‥ String 型 (省略可)
Pos_X ‥‥‥ Variant(Integer / Empty)型 (省略可)
Pos_Y ‥‥‥ Variant(Integer / Empty)型 (省略可)
入力Msg ‥‥‥ String 型 (省略可)
営休制限 ‥‥‥ Variant(Integer) 型 (省略可)
期間制限Fr ‥‥‥ Variant(Date 又は 日付文字列)型 (省略可)
期間制限To ‥‥‥ Variant(Date 又は 日付文字列)型 (省略可)
六曜 ‥‥‥ String 型 (省略可,既定値:"禁止")
時刻 ‥‥‥ String 型 (省略可,既定値:"なし")

【 返 却 値 】

日付が選択された場合は、返却値として "True" が返ります。
入力キャンセルした場合は "False" が返ります。

【 パラメータ 内容 】

日  付 ‥‥‥ この項目に選択した日付(及び 時刻 )が設定されて呼び元に返されます。呼び元での変数定義が必要です。
 
基準日 ‥‥‥ この日付の『年月』でカレンダーが初期表示されます。
通常は、選択した「日付」を設定する項目/オブジェクト(Value値)を指定します。(こうすると、再度フォームを表示させた時に、前回選択した日付の『年月』で表示させる事ができます)。
指定した項目/オブジェクトの内容が『Emptyや日付以外』の場合は既定値として本日日付が適用されます。

※ 新元号「令和」対応になっていない環境でも
    「令和 日付文字列(元年 表記を含む)」を指定可能です。

省略時には、既定値として本日日付が適用されます。
 
休日Map ‥‥‥ 『休日Map』または『固定休日コード』を指定します。
ここに指定した休日はピンクで表示されます。
省略時は、「休日なし」としてピンク表示されません。

 
Pos_X
  および
Pos_Y
‥‥‥ カレンダーフォームを画面のどの位置に表示するかを指定するパラメータです。
UserForm のプロパティ(Left / Top )で指定する値です。

一方もしくは両方を省略すると『オーナーフォーム中央』に表示します。

または、一方 もしくは 両方に Empty 値 を指定した場合も、省略 と 同じ
扱いで『 オーナーフォーム中央 』 に表示します。

「あるセルの付近に表示する」 という場合には、ktCell2Position 関数 を
使って、セルの座標を変換した値を指定してください (使用例を参照)。

参考 : 表示位置によるPos_X および Pos_Y の値(1024×768サイズの画面)
    画面全体の左上 ‥‥‥ Pos_X=0 , Pos_Y=0
             〃  中央 ‥‥‥ Pos_X=300 , Pos_Y=170
             〃  右下 ‥‥‥ Pos_X=580 , Pos_Y=350
 
入力Msg ‥‥‥ ここに指定した文字列がキャプション部分に表示されます。
全角20文字/半角28文字程度まで指定できます。
省略時はフォーム名である[ktFormCal]が表示されます。
 
営休制限 ‥‥‥ 営業日のみ/休業日のみ等の入力制限を施す場合に指定します。
    または 省略:[営/休]制限なし。
    :[営業日のみ]入力可
    :[休業日のみ]入力可
    :『休日Map』の期間内のみ入力可
    :『休日Map』の期間内で営業日のみ入力可
    :『休日Map』の期間内で休業日のみ入力可
(3〜5では期間制限Fr/Toの指定は不要です)
 
期間制限Fr
  および
期間制限To
‥‥‥ 日付入力できる期間を[Fr/To]で指定します。

※ 新元号「令和」対応になっていない環境でも
    「令和 日付文字列(元年 表記を含む)」を指定可能です。

『月初〜月末』だけでなく『16日〜15日』といった期間も指定できます。
日付文字列/Date型変数/日付データのセル等で指定します。
[月末まで]という場合は『正しい月末日』を指定して下さい。
「2/30や11/31」といった指定は無効とされます。
[営休制限=3〜5]の場合
    Fr/Toを指定しなくても休日Mapの有効期間が摘要されます。
    Fr/Toも一緒に指定した場合は、両方の重なる期間が用いられます。
    全く重なる期間が無い場合は休日Mapの有効期間が摘要されます。
 
六曜 ‥‥‥ 六曜表示モードの可否を指定します。
省略/”禁止”‥‥‥六曜表示モードを禁止します
六曜”    ‥‥‥通常モードで表示し、『右クリック』で六曜表示モード
                          へ移行します。

最初から六曜表示モードで表示する場合は、表示対象の六曜を下記の文字で並べて指定します。全ての六曜を表示する場合は『”勝友負仏安赤”』と指定します。「大安・友引」だけを表示するなら『”友安”』と指定します。
    『先引・先滅・大口』
    (並び順は、ありません。表示対象としたいものを並べて下さい)。

六曜モードにおいて、六曜が表示されていない日付は選択できません

六曜”と指定した場合、右側のカラーガイダンスをクリックする事で、
  個別に六曜の表示/非表示を切り替えられます。”安友”などパラメータ
  で個別指定した場合は、カラーガイダンスによる切り替えはできません。
  したがって、全ての六曜が常に選択可とする場合は、パラメータに
  ”勝友負仏安赤”と全てを指定します。

 
時刻 ‥‥‥ 日付選択に続けて『時刻入力』を行なうかを指定します。
省略(又は”なし”指定』の場合は、従来通り日付のみの入力です。
指定値は[ ktSelClock ]AMPM引数の解説を参照して下さい。
 

【 解 説 】

パラメータ「基準日〜六曜」の指定にしたがってカレンダー
フォーム『ktFormCal』を表示します。
マウスの動きに合わせてアクティブ位置が水色で強調
れます。そのままワンクリックすれば、その位置の日付が呼
び元へ返ります。
祝日の設定は自動的に行なっていますので、ユーザー側で
準備する必要はありません。休業日の強調表示が可能なの
で、入力時のミスも防げます。


入力制限により「入力不可」となっている日付はマウスカーソルを合わせても水色表示されません。
水色表示される日付が入力可能な日付です。
    左の例 : ktCalDate(MyDate, Date, kt_土日祝, , , _
                                "開始日を入力して下さい", 1, "2001/4/1", "2002/3/31")
    中/右の例 : ktCalDate(MyDate, Date, kt_土日祝, , , _
                                      "開始日を入力して下さい", 0, "2001/12/16", "2002/1/15")



 
 「日付」以外の部分を右クリックすると、左のように
 六曜がカラー表示されます。

 更に、右側の大安・仏滅などのガイダンス部分を
 クリックすると、その六曜の表示有無を切り替える事
 もできます。

 VBAから六曜表示を指定する場合はパラメータ
 「六曜」を指定します。

(注)六曜パラメータの既定値は”禁止”です。これは、既にVer2.40以前でカレンダー入力フォームを
      運用されている場合、バージョンアップ後に「うっかり」右クリックしてしまい『いきなり六曜表示されて
      戸惑う』といった事の無い様、既定で”禁止”する事により、コード修正しないまま利用すれば自然と
      従来(〜Ver2.40)の動きのままになるようにしている為です。

六曜表示できるのは「19502050年」の期間です。

六曜は七曜(日〜土)と違って、常に規則正しく繰り返される訳ではありません。旧暦の各月1日の六曜が
月によって決まっており、そこから順に繰り返されます(1・7月:先勝,2・8月:友引‥‥)。したがって、旧
暦の月変わり位置で不連続になります。上の例では5/11〜12日の間で[友引・先負]が飛んでいます。

(注)これで表示される『六曜』は日本標準時を基にしたものです。したがって、中国および韓国での行事
      などを求めるのに参考としないで下さい。年によっては【1日のズレ】が出る場合があります。
      (例:旧暦2001年4月)  詳しくは『kt旧暦』の解説を読んで下さい。

「時刻」引数を指定した場合は、日付選択後に時刻入力フォームがポップアップしますので、続けて時刻
を選択して下さい。時刻選択を以って入力完了となり、呼び元には『日付+時刻』のシリアル値が返り
ます。時刻選択でキャンセル(×ボタン)した場合は日付入力自体もキャンセルになります。


【 使 用 例 】

Dim MyDate As Date
Dim str休日Map As String    ‥‥‥「休日マップ」が設定されている変数
  ※[kt_土日祝]などは「kt関数Addin.xla」内で定義されている『固定休日』定数です。

--- 基本形 ---
    If ktCalDate(MyDate, Date, kt_土日祝) Then
        xxxx = MyDate    または    xxxx = Format(MyDate, "yyyy/m/d")
    End If

--- パラメータの指定パターン例 --------------------------

(1) 省略できるパラメータを全て省略
    ktCalDate(MyDate)
      本日日付の「年月」&『休日表示なし』で表示されます。
      これは、下記の指定と同じ意味になります。

    ktCalDate(MyDate, Date, kt_なし)

(2) 『土日』を休業日表示する
    ktCalDate(MyDate, ,kt_土日)    または
    ktCalDate(MyDate, Date, kt_土日)

(3) 『土日』及び『祝日/振替休日』を休業日表示する
    ktCalDate(MyDate, ,kt_土日祝)    または
    ktCalDate(MyDate, Date, kt_土日祝)

(4) 『休日マップ』を指定
    ktCalDate(MyDate, , str休日Map)  または
    ktCalDate(MyDate, , Rang("A1").Value)
                          ‥‥‥A1セルに休日マップデータが格納されている場合

(5) ある日付の「年月」で表示する。
    Dim dtm年月日 As Date
    dtm年月日 = DateValue("2000/2/20")

    ktCalDate(MyDate, dtm年月日)
      または
    ktCalDate(MyDate, DateValue("2000/2/20"))
      または
    ktCalDate(MyDate, "2000/2/20")
      または
    ktCalDate(MyDate, "平成13年2月20日")

    上記の例は、全て「2000年2月」で表示されます。

(6) テキストボックスやセルに入っている日付で表示する。
    ktCalDate(MyDate, TextBox1.Value)
      または
    ktCalDate(MyDate, Rang("B5").Value)

    TextBox1/B5セルの内容が【シリアル値/日付文字列】以外の場合は、
    本日日付が適用されます。

(7) 表示位置を指定する。
    ktCalDate(MyDate, , ,100, 50)

    Excelウィンドウ内で「Left=100,Top=50 」の位置に表示します。

    -- UserForm の位置/入力項目の位置に合わせて調整 --
    ktCalDate(MyDate, , , (Me.Left + 10), (Me.Top + 10))
    ktCalDate(MyDate, , , (Me.Left + TextBox1.Left + 10), (Me.Top + TextBox1.Top + 10))

    -- F5セルの付近に表示する (ktCell2Position を利用) --
    Dim rc As Boolean
    Dim vntPos As Variant
    Dim vntTop As Variant
    Dim vntLeft As Variant
    vntPos = ktCell2Position(ActiveSheet.Range("F5"))
    If IsError(vntPos) Then
        'F5 セル が 表示範囲外 ⇒ Top/Left を省略
        vntTop = Empty
        vntLeft = Empty
    Else
        vntTop = vntPos(0) + 5
        vntLeft = vntPos(1) + 5
    End If
    rc = ktCalDate(MyDate, Pos_X:=vntLeft, Pos_Y:=vntTop)

(8) 入力Msg と入力制限の例
    ktCalDate(MyDate, Date, kt_土日祝, , , _
          "開始日を入力してください", 1, "2001/12/16", "2002/1/15")

(9) 右クリックでの六曜表示モードを可にする
    ktCalDate(MyDate, Date, kt_土日祝, , , , , , , "六曜")
      または、
    ktCalDate(MyDate, Date, kt_土日祝, 六曜:= "六曜")

(10) 最初から六曜表示モードにする
    ktCalDate(MyDate, Date, kt_土日祝, , , , , , , "勝友負仏安赤")
      または、
    ktCalDate(MyDate, Date, kt_土日祝, 六曜:="勝友負仏安赤")

(11) 大安・友引だけで六曜表示する
    ktCalDate(MyDate, Date, kt_土日祝, , , , , , , "友安")
      または、
    ktCalDate(MyDate, Date, kt_土日祝, 六曜:="友安")

(12) 日付&時刻の入力を行なう
    ktCalDate(MyDate, Date, kt_土日祝, , , , , , , ,"AMPM#")
      または、
    ktCalDate(MyDate, Date, kt_土日祝, 時刻:= "AMPM#")

    この場合、当然、編集は"yyyy/m/d" ではなく、"yyyy/m/d h:m"等として下さい。


---- 利用コード例 -------------------------------
    [DblClick]アクションを無効にする為に『Cancel = True 』は必須です。

(1) テキストボックスでの利用例
    UserFormの場合は、そのUserFormのモジュールに、シート上のコントロールの
    場合は、そのシートのモジュールに記述してください。

    TextBox1 をダブルクリックするとカレンダーフォームを表示して、入力した日付を
   「yyyy/m/d 」形式に編集してTextBox1に設定します。
    表示の際は、既にTextBox1に日付文字列が設定されている場合は「その年月」で、
    空白や日付以外の文字列が設定されていた場合は「本日の年月」で表示します。

    Private Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Dim MyDate As Date
      If ktCalDate(MyDate, TextBox1.Value, kt_土日祝) Then
          TextBox1.Value = Format(MyDate, "yyyy/m/d")
      End If
      Cancel = True
    End Sub

(2) ワークシートでの利用例(その1)
    そのシートのモジュールに記述して下さい。
    セルをダブルクリックするとカレンダーフォームを表示して、日付を入力します。
    表示の際は、既にセルにシリアル値/日付文字列が設定されている場合は「その年月」
    で、それ以外の場合は「本日の年月」で表示します。
    入力した内容は、ダブルクリックしたセルの「表示形式」で表示されます。

    Private Sub Worksheet_BeforeDoubleClick _
                      (ByVal Target As Range, Cancel As Boolean)
    Dim MyDate As Date
      If ktCalDate(MyDate, Target.Value) Then
          Target.Value = MyDate
      End If
      Cancel = True
    End Sub

(3) ワークシートでの利用例(その2)
    そのシートのモジュールに記述して下さい。
    上記に、表示形式の指定を追加した例です(平成13年2月20日といった形式)。

    Private Sub Worksheet_BeforeDoubleClick _
                      (ByVal Target As Range, Cancel As Boolean)
    Dim MyDate As Date
      If ktCalDate(MyDate, Target.Value) Then
          Target.NumberFormatLocal = "ggge年m月d日"
          Target.Value = MyDate
      End If
      Cancel = True
    End Sub

(4) ワークシートでの利用例(その3)
    そのシートのモジュールに記述して下さい。
    ダブルクリックで日付入力するセルを限定(B5セル)する場合の例です。

    Private Sub Worksheet_BeforeDoubleClick _
                      (ByVal Target As Range, Cancel As Boolean)
    Dim MyDate As Date
      If (Target.Address = "$B$5") Then
          If ktCalDate(MyDate, Target.Value) Then
              Target.Value = MyDate
          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 MyDate As Date
      If (Target.Column = 3) Then
          If ktCalDate(MyDate, Target.Value) Then
              Target.Value = MyDate
          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 MyDate As Date
      If (Target.Column = 3) Then
          If IsDate(Target.Value) Then
              '日付入力済みのセルは「その日付」で初期表示
              If ktCalDate(MyDate, Target.Value) Then
                  Target.Value = MyDate
              End If
          ElseIf (Target.Row > 1) Then
              '2行目以降(明細1行目以降)
              '2行目の場合、第2引数はタイトル行セルを指し示すが、
              '日付ではないので自動的に「本日日付」で表示される
              If ktCalDate(MyDate, Target.Offset(-1, 0).Value) Then
                  Target.Value = MyDate
              End If
          Else
              '1行目(タイトル行)では表示しない
          End If
          Cancel = True
      End If
    End Sub

    [Cancel = True]を記述する位置に注意して下さい。C列以外では『ダブル
    クリックでセルへのキー入力』は有効にしなければなりません。

(7) ワークシートでの利用例(その6)
    そのシートのモジュールに記述して下さい。
    カーソルを「そのセル」に移しただけで、ポップアップさせたい場合は、
   「Worksheet_BeforeDoubleClick」イベントの代わりに
        「Worksheet_SelectionChange」イベント
    を使ってください。

    この場合は[Cancel]引数 が有りませんので、『Cancel = True 』ステップは不要です。




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


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